Visual Studio 디버그 모드에서 개체 값 복사


138

Visual Studio 디버그 모드에서는 변수 위로 마우스를 가져 가서 값을 표시 한 다음 "복사", "식 복사"또는 "값 복사"를 마우스 오른쪽 단추로 클릭 할 수 있습니다.

변수가 기본 유형이 아닌 객체 인 경우 객체를 확장하고 탐색하기위한 + 부호가 있습니다. 클립 보드에 모든 것을 복사하는 방법이 있습니까?

답변:


191

바로 창에

?name_of_variable

그러면 모든 것이 인쇄되고 원하는 곳에서 수동으로 복사하거나 즉시 창의 로깅 기능을 사용하여 파일에 자동으로 쓸 수 있습니다.

업데이트 : 텍스트로 검색하거나 측면에 저장 한 다음 나중에 객체의 상태를 비교할 수 있도록 값의 중첩 구조를 복사 / 붙여 넣는 방법을 묻고 있다고 가정합니다. 내가 옳다면 OzCode 라는 내가 만든 Visual Studio의 상용 확장 기능을 확인 하고 "검색"및 "비교"기능을 통해 이러한 작업을 훨씬 쉽게 수행 할 수 있습니다.

업데이트 2 @ppumkin의 질문에 대답하거나 새로운 EAP 에는 새로운 내보내기 기능이있어 사용자가 변수 값을 Json, XML, Excel 또는 C # 코드로 내보낼 수 있습니다.

전체 공개 : 저는 여기서 설명한 도구의 공동 제작자입니다.


5
모든 것을 보여주기 위해 재귀 적으로 확장 할 수 있다면 더 좋았을 것입니다. 텍스트가 많을 수 있지만 트리에서 더 깊은 값을 검색 할 수 있습니다.
Kobus Smit

3
추신 : 나는 bugaid의 기능을 너무 좋아합니다. 이제 트레일을 다운로드하고 만료 될 때 눈알을 측정하기 시작하면 상사가 나를 위해 사게됩니다. : :)
Piotr Kula

16
100 개 이상의 항목을 출력하는 방법을 아는 사람이 있습니까? 첫 번째 100이 직접 실행 창에 표시된 후에 이것을 얻습니다. <More ... (335 개 항목 중 첫 100 개가 표시되었습니다.)>
lachs

6
"즉시 창"이란 정확히 무엇을 의미합니까?
alex

3
@alex : Visual Studio에서 Debug> Windows> Immediate로 이동합니다. 디버깅 중에 평가하거나 실행할 식을 입력 할 수 있습니다.
JTech

49

바로 아래 창에서 아래 코드를 실행할 수 있으며 객체의 직렬화 된 XML 표현을 xml 파일로 내 보냅니다.

(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)

출처 : Visual Studio에서 디버거에서 개체를 직렬화하는 방법


5
사람들이 더 쉽게 찾을 수 있도록 이것은 상향 조정되어야합니다. 이 훌륭한 솔루션을 찾기 전에 비슷한 SO 질문을 많이 겪었습니다. 이로 인해 드문 충돌 문제가있는 장기 실행 프로그램 충돌 후 큰 List <List <byte >>를 XML 텍스트 파일로 덤프 할 수있었습니다. 한 가지 추가 사항 : 처음 실행했을 때 "평가를하려면 스레드를 일시적으로 실행해야합니다. 조사 창을 사용하여 평가를 수행하십시오."라는 오류가 발생했습니다. 조사 식 창을 새로 고친 후 두 번째 명령 실행 시도가 성공했습니다.
Craig.

Bat_Programmer : 출력의 대상은 객체 목록이고 실제로 출력되는 것은 단일의 지정된 객체 (변수)의 직렬화 된 XML 표현이므로 제안의 첫 번째 줄을 변경할 수 있습니다.
Craig.

Cannot evaluate expression because the code of the current method is optimized.???
팔코 알렉산더

json이있는 경우 다음을 수행 할 수 있습니다.File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332

The debugger is unable to evaluate this expression. Visual Studio 2019를 사용하고 있습니다. 나는 obj변수 이름으로 대체 했습니다System.Collections.Generic.List 1[[System.ValueTuple 3[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7]]
Drew

27

1
더 큰 객체 목록에 문제가있는 것 같습니다
Bat_Programmer

@Bat_Programmer 오마르의 훌륭한 도구를 사용하는 것을 방해하지 않기 위해, OzCode Export 기능은 많은 객체 목록을 지원하도록 미세 조정되었습니다. 시도해보고 그것이 당신에게 잘 작동하는지 알려주십시오.
Omer Raviv

20

해당 객체에 대한 시계를 추가하고 시계 창에서 복사하려는 모든 항목을 확장하고 선택한 다음 복사하십시오.


1
나에게도 도움이 된 PMN에게 감사드립니다. 트리를 수동으로 확장 (오른쪽 클릭하고 모두 확장하면 좋을 것임) 한 다음 클립 보드에 복사하면 트리를 붙여넣고 트리에서 깊게보고있는 값을 검색 할 수 있습니다.
Kobus Smit


4

사용하여 귀하의 클래스와 메소드를 장식하는 속성을 당신은 디버깅하는 동안 개체 디스플레이에서 특정 값을 가질 수 DebuggerDisplay 속성

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

문제는 객체의 일부가 아닌 모든 객체 내용을 복사 할 수 있어야한다는 것입니다. 예, 전체 객체로 복잡한 DebbuggerDisplay 속성을 충분히 만들 수는 있지만 클래스를 변경하면 속성도 변경해야합니다.
Farinha

@Farinha 객체로 무엇을하고 싶습니까? 아마도 직렬화 된 xml 버전 인 속성이있을 수 있습니다.
Dave Anderson

1

Google 은이 8 살짜리 질문으로 이끌었고 ObjectDumper 를 사용하여 복사 붙여 넣기 디버거 데이터와 매우 비슷한 결과를 얻었 습니다 . 산들 바람이었다.

디버거의 정보에 대해 특별히 묻는 질문을 알고 있지만 ObjectDumper는 기본적으로 동일한 정보를 제공합니다. 나는이 질문을 구글 사람들이 나와 같다고 가정하고 디버깅 목적으로 데이터가 필요하며 기술적으로 디버거에서 온 것인지는 상관하지 않는다고 가정합니다.


1

나는 항상 사용합니다 :

string myJsonString = JsonConvert.SerializeObject(<some object>);

그런 다음 불행히도 백 슬래시도 복사하는 문자열 값을 복사합니다.

백래시를 제거하려면 여기로 이동하십시오 : https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

그런 다음 <p id="demo">Visit Microsoft!</p>요소 내에서 텍스트를 복사 한 텍스트로 바꿉니다. 그런 다음 var res = str.replace("Microsoft", "W3Schools");줄을

var res = str.replace(/\\/g, '')

새로운 변경 사항을 실행하되 오른쪽의 "시도"버튼을 반드시 클릭하십시오.

이제 http://jsonformatter.org 와 같은 json 포맷터에 넣을 수 있거나 POCO를 만들 수있는 json 형식의 객체 텍스트가 모두 http://json2csharp.com/


1

나는 파티에 조금 늦었다는 것을 알고 있지만 JSON 출력을 원한다면 객체를 직렬화하기위한 JSON 구현을 작성했습니다. Newtonsoft.Json 참조를 사용합니다.

private static void WriteDebugJSON (dynamic obj, string filePath)
{
    using (StreamWriter d = new StreamWriter(filePath))
    {
        d.Write(JsonConvert.SerializeObject(obj));
    }
}

0

목록이 있고 특정 변수를 찾으려면 다음과 같이하십시오. 즉시 창에서

 myList.Any(s => s.ID == 5062);

이것이 true를 반환하면

var myDebugVar = myList.FirstOrDefault(s => s.ID == 5062);
?myDebugVar

0

변수를 마우스 오른쪽 버튼으로 클릭하고 AddWatch를 선택하면 모든 값으로 구성된 감시 창이 나타납니다. 모두 선택하여 텍스트 편집기에 붙여 넣습니다.


1
문제는 노드별로 노드를 확장해야하는 방식으로 오브젝트를 복사하는
것인데,
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.