크래시 덤프에서 버그를 조사하려고합니다 (코드를 변경할 수 없음). 정말 복잡한 객체 (직렬화 된 표현의 수천 줄)가 있고 그 상태가 일치하지 않습니다. 상태를 조사하기 위해 Visual Studio 디버거 뷰는 쓸모가 없습니다. 그러나 개체에는 데이터 계약이 있습니다. 직렬화 한 다음 좋아하는 텍스트 편집기를 사용하여 개체를 탐색하고 싶습니다. 디버거에서 할 수 있습니까?
크래시 덤프에서 버그를 조사하려고합니다 (코드를 변경할 수 없음). 정말 복잡한 객체 (직렬화 된 표현의 수천 줄)가 있고 그 상태가 일치하지 않습니다. 상태를 조사하기 위해 Visual Studio 디버거 뷰는 쓸모가 없습니다. 그러나 개체에는 데이터 계약이 있습니다. 직렬화 한 다음 좋아하는 텍스트 편집기를 사용하여 개체를 탐색하고 싶습니다. 디버거에서 할 수 있습니까?
답변:
얼마 전에 디스크의 파일에 개체를 직렬화하는이 한 줄짜리를 작성했습니다. 직접 실행 창에 복사 / 붙여 넣기하고 obj
(두 번 참조 됨) 개체로 바꿉니다. text.xml
파일을에 저장하고 c:\temp
원하는대로 변경합니다.
(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
그러나 어떤 마법도 기대하지 마십시오. 객체를 직렬화 할 수 없으면 예외가 발생합니다.
identifier "System" is undefined
운이 좋으면 이미 appdomain에 Json.Net이 있습니다. 이 경우 직접 실행 창에 다음을 표시합니다.
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
다음은 정확하게 수행 할 수있는 Visual Studio 확장입니다.
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
JSON, XML 또는 C #으로 출력 할 수 있습니다.
내가 사용하는 확장 방법이 있습니다.
public static void ToSerializedObjectForDebugging(this object o, FileInfo saveTo)
{
Type t = o.GetType();
XmlSerializer s = new XmlSerializer(t);
using (FileStream fs = saveTo.Create())
{
s.Serialize(fs, o);
}
}
saveTo에 대한 문자열로 오버로드하고 즉각적인 창에서 호출합니다.
public static void ToSerializedObjectForDebugging(this object o, string saveTo)
{
ToSerializedObjectForDebugging(o, new FileInfo(saveTo));
}
직접 실행 창을 사용하여 직렬화 한 다음 원하는 편집기에 콘텐츠를 복사 할 수 있습니다.
또 다른 옵션은 ToString()
메서드 를 재정의하고 디버그 모드에서 호출하는 것입니다.
충돌 직전에 파일에 내용을 기록하거나 코드를 try / catch로 래핑하고 파일을 작성할 수도 있습니다. 나는 당신이 그것이 언제 충돌하는지 확인할 수 있다고 가정하고 있습니다.
Omar Elabd의 답변에 대한 변형-
무료는 아니지만 OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode )에 대한 무료 평가판이 있습니다.
컨텍스트 / 호버 메뉴 내에 JSON으로 내보내기가 내장되어 있으며 개체 내보내기 확장 프로그램보다 약간 더 잘 작동합니다 (무료가 아니라는 단점).
http://o.oz-code.com/features#export (데모)
나는 이것이 사실로부터 몇 년 후라는 것을 알고 있지만 이것이 나를 위해 일했고 다른 누군가가 유용하다고 생각할 수 있기 때문에 여기에 대답을 남기고 있습니다.
ObjectDumper.Net을 사용 하고 있습니다. 있습니다.
특히 라이브 단위 테스트가있는 경우 잘 작동합니다. 테스트가 실행될 때 콘솔에서 변수 값을 쉽게 볼 수 있으므로 수동으로 디버깅하지 않아도됩니다.
XUnit을 사용하는 경우 도움 이 될 수 있습니다.
Alexey의 답변에 대한 변형. 약간 더 복잡하지만 텍스트 파일에 쓰는 것은 포함되지 않습니다.
1) 직접 실행 창에 다음을 입력합니다.
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2) 조사 식 창에 두 개의 시계를 입력하십시오.
a. stringWriter
b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
두 번째 감시 (직렬화)를 입력하면 stringWriter 감시 값이 XML로 직렬화 된 obj로 설정됩니다. 복사하여 붙여 넣으십시오. XML은 중괄호 ({...})로 묶여 있으므로 XML을 사용하려는 경우 제거해야합니다.