2008-09-09 7 views
50

우리 제품에서 오류 처리의 일부로 일부 스택 추적 정보를 덤프하고 싶습니다. 그러나 많은 사용자가 프로그램에서 사용할 수있는 전체 보고서 사본을 보내지 않고 오류 메시지 대화 상자의 스크린 샷을 찍어서이 대화 상자에서 사용할 수있는 최소 스택 추적 정보를 만들고 싶습니다.C#의 스택 추적 정보를 인쇄하십시오.

내 컴퓨터에

닷넷 스택 추적은 다음과 같습니다 그러나

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

:

형식이 될 같습니다

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 

나는이 질문이 키워드로, 나는 이것이 노르웨이어의 .NET 런타임 인 ​​i를 실행하면 현지화 될 것이라고 가정합니다 내가 설치 한 영어 중 하나.

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

은 즉, 위의 텍스트에서이 정보를 싶습니다 당신이 줄 수

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

어떤 조언이 도움이 될 것입니다.

+1

과 (Lindholm 사용자의 답변에 따라) 이것에 대한 세부 사항을 얻기를 정말로 기대하고있었습니다.StackTrace의 소스를 제어 할 수 있다고 가정하면 실제로 올바른 대답을 선택했습니다. – TheXenocide

답변

70

당신은 당신이 다음 프레임 워크의 형식에 의존하지 않고 자신의 프레임을 볼 수 있습니다

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

말로 대신 문자열의 스택 트레이스 개체를 얻을 수 있어야합니다.

은 참조 : 대안, log4net으로 StackTrace reference

+0

우물, 잘 모르겠습니다! 나는 이것을 확실히 살펴볼 것입니다. –

+0

릴리스 모드에서 여전히 예외의 스택 추적을 정확하게 얻을 수 있습니까? – erdogany

+0

** 예외 **를 파일에서 serialize합니다. 'SerializationHelper.Serialize (@ "c : \ temp \ ConfigurationErrorsExceptions.ser", ex);'파일에서 직렬화 해제하면'var exception = SerializationHelper.Deserialize (@ "ConfigurationErrorsExceptions.ser");'*** 추적 *** 사용 가능하지 않습니다. 'var trace = new System.Diagnostics.StackTrace (Exception으로 예외); ** FrameCount **는 0입니다. – Kiquenet

0

, System.Diagnostics 네임보다 저에게 더 나은 결과를 주신 잠재적으로 위험한 불구하고. 기본적으로 log4net에는 Exception 매개 변수가있는 다양한 로그 수준에 대한 메서드가 있습니다. 따라서 두 번째 예외를 통과하면 구성한 appender에 스택 추적이 인쇄됩니다.

예 : 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 
    ... 
+0

log4net이 "잠재적으로 위험 할 수 있습니다"라는 것이 무엇을 의미하는지 명확하게 설명해 주시겠습니까? –

+0

Oglester의 의미는 확실하지 않지만 log4net이 예외를 데이터베이스에 기록했기 때문에 stackoverflow.com에 일부 교착 상태 문제가 있음을 압니다. 나는 개인적으로 문제가 없었지만, 간단하게 유지하고 롤링 텍스트 파일을 사용한다. –

+0

참조를 제대로 관리하지 않으면 메모리 누수가 발생합니다. 필자가 잠시 일한 웹 사이트는 log4net을 광범위하게 사용합니다 (파일 롤링). log4net은 파일 (안전하지 않은)을 참조하기 때문에 log4net 참조를 정리하거나 최소로 유지해야합니다. –

27

같은 난 그냥 수 있도록 예외

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)); 
    } 
} 
+0

예외 처리기가 기본적으로 수행하므로 어딘가에이 기능이 내장되어 있다고 생각할 수 있습니다. –

18

없이이 작업을 수행하는 데 사용하는 코드입니다 보인다 이 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(); 
} 

+3

고마워요. 특정 줄 끝 문자를 하드 코딩하지 않으려면 sb.AppendLine (...)을 사용할 수 있습니다. –

+0

참. 업데이트 ... –

8

심지어 짧은 버전이 .. 내가 임의의 응용 프로그램에서 기록 된 문자열 함께 일하고 있어요 나는 누군가가 이것에 대한 구문 분석 답을 준 텐데

Console.Write(exception.StackTrace);