메소드에서 예외가 발생할 때 모든 로컬 변수의 값을 추적/기록하는 일반적인 방법은 무엇입니까? (C# 3)예외가 발생할 때 모든 로컬 변수를 추적하는 방법
12
A
답변
9
답변 : PostSharp (정책 삽입), XTraceMethodBoundary 특성을 사용하면 OnException을 재정의합니다. 이것은 모든 메소드 입력 및 리턴 매개 변수 유형 및 값을 기록합니다. PostSharp를 수정하여 매개 변수를 기록하는 간단한 방법을 추가했습니다. 완벽하지는 않지만 충분하다.
private static void TraceMethodArguments(MethodExecutionEventArgs eventArgs)
{
object[] parameters = eventArgs.GetReadOnlyArgumentArray();
if (parameters != null)
{
string paramValue = null;
foreach (object p in parameters)
{
Type _type = p.GetType();
if (_type == typeof(string) || _type == typeof(int) || _type == typeof(double) || _type == typeof(decimal))
{
paramValue = (string)p;
}
else if (_type == typeof(XmlDocument))
{
paramValue = ((XmlDocument)p).OuterXml;
}
else
{ //try to serialize
try
{
XmlSerializer _serializer = new XmlSerializer(p.GetType());
StringWriter _strWriter = new StringWriter();
_serializer.Serialize(_strWriter, p);
paramValue = _strWriter.ToString();
}
catch
{
paramValue = "Unable to Serialize Parameter";
}
}
Trace.TraceInformation("[" + Process.GetCurrentProcess().Id + "-" + Thread.CurrentThread.ManagedThreadId.ToString() + "]" + " Parameter: " + paramValue);
}
}
}
7
기본적으로 할 수 없습니다. Reflection을 사용하면 인스턴스 (정적 변수)을 얻을 수 있지만 로컬 변수를 기록하려면 명시 적으로해야합니다. 프로파일 링 API를 사용하여 좀 더 나은 작업을 수행 할 수는 있지만 매우 극단적 인 단계 일 수 있습니다.
4
힙과 스택을 모두 캡처하기 때문에 프로세스의 메모리 덤프를 수행 할 수 있지만 질문을 로깅으로 태그 했으므로 사용자가 찾고있는 것이 아닌 것으로 간주합니다.
그러나 방법이 항상 작고 중요한 점을 확인하여이 정보의 필요성을 줄일 수 있습니다. 그러면 훨씬 더 유용한 스택 추적이 생성되고 검사 할 지역 주민의 수를 제한하게됩니다.
2
MiniDumpWriteDump을 사용하면 예외가 발생했을 때 프로세스의 메모리 덤프를 만들 수 있습니다. P/호출해야합니다.