2008-12-12 6 views

답변

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/호출해야합니다.