문제

우리 제품의 일부 오류 처리의 일부로 일부 스택 추적 정보를 덤프하고 싶습니다.그러나 많은 사용자가 프로그램에서 사용할 수 있는 전체 보고서의 사본을 보내는 대신 단순히 오류 메시지 대화 상자의 스크린샷을 찍는 것을 경험하므로 이 대화 상자에서 사용할 수 있는 최소한의 스택 추적 정보를 만들고 싶습니다.

내 컴퓨터의 .NET 스택 추적은 다음과 같습니다.

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
at System.IO.StreamReader..ctor(String path)
at LVKWinFormsSandbox.MainForm.button1_Click(Object sender, EventArgs e) in C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36

나는 이 질문이 있습니다:

형식은 다음과 같습니다.

at <class/method> [in file:line ##]

그러나, 그 ~에 그리고 ~에 키워드의 경우, 예를 들어 내가 설치한 영어 런타임 대신 노르웨이어 .NET 런타임을 실행하면 현지화될 것이라고 가정합니다.

언어 중립적인 방식으로 이 스택 추적을 분리하여 이 항목이 있는 항목의 파일과 줄 번호만 표시할 수 있는 방법이 있습니까?

즉, 위 텍스트에서 다음 정보를 원합니다.

C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36

당신이 줄 수 있는 어떤 조언이라도 도움이 될 것입니다.

도움이 되었습니까?

해결책

다음과 같이 말하면 문자열 대신 StackTrace 객체를 얻을 수 있습니다.

var trace = new System.Diagnostics.StackTrace(exception);

그러면 프레임워크의 형식에 의존하지 않고 프레임을 직접 볼 수 있습니다.

또한보십시오: StackTrace 참조

다른 팁

예외 없이 이 작업을 수행하는 데 사용하는 코드는 다음과 같습니다.

public static void LogStack()
{
  var trace = new System.Diagnostics.StackTrace();
  foreach (var frame in trace.GetFrames())
  {
    var method = frame.GetMethod();
    if (method.Name.Equals("LogStack")) continue;
    Log.Debug(string.Format("{0}::{1}", 
        method.ReflectedType != null ? method.ReflectedType.Name : string.Empty,
        method.Name));
  }
}

이것을 15초 복사-붙여넣기 답변으로 만들려면 다음을 수행하십시오.

static public string StackTraceToString()
{
    StringBuilder sb = new StringBuilder(256);
    var frames = new System.Diagnostics.StackTrace().GetFrames();
    for (int i = 1; i < frames.Length; i++) /* Ignore current StackTraceToString method...*/
    {
        var currFrame = frames[i];
        var method = currFrame.GetMethod();
        sb.AppendLine(string.Format("{0}:{1}",                    
            method.ReflectedType != null ? method.ReflectedType.Name : string.Empty,
            method.Name));
    }
    return sb.ToString();
}

(Lindholm 답변을 기반으로 함)

아니면 더 짧은 버전도 있는데..

Console.Write(exception.StackTrace);

대안으로 log4net은 잠재적으로 위험하기는 하지만 System.Diagnostics보다 더 나은 결과를 제공했습니다.기본적으로 log4net에는 각각 Exception 매개변수가 있는 다양한 로그 수준에 대한 방법이 있습니다.따라서 두 번째 예외를 전달하면 구성한 어펜더에 스택 추적이 인쇄됩니다.

예: Logger.Error("Danger!!!", myException );

구성에 따라 출력은 다음과 같습니다.

System.ApplicationException: Something went wrong.
   at Adapter.WriteToFile(OleDbCommand cmd) in C:\Adapter.vb:line 35
   at Adapter.GetDistributionDocument(Int32 id) in C:\Adapter.vb:line 181
   ...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top