2009-09-11 6 views
1

Exeption을 인수로 사용하는 StackTrace에 생성자가 있습니다. 괜찮 았지만 다른 모든 생성자는 현재 스레드에서 StackTrace를 가져올 것이라고 말했지만 예외를 취하는 생성자는 예외에 대해 아무 것도 말하지 않습니다.다른 스레드의 예외에서 StackTrace?

결과 스택 추적은 다음과 같습니다. 예외시 스택.

다른 스레드의 예외에서 StackTrace를 만들 때 예외가 작성된 다른 스레드에서 StackTrace를 만들더라도 예외의 올바른 StackTrace를 얻고 싶습니다.

누군가 확인할 수 있습니까?

답변

1

뭔가를 놓치지 않는 한 시도하기에 충분합니다. 이것은 나를 위해 올바른 스택 추적을 인쇄합니다.

static Exception threadEx; 

static void Main() 
{ 
    Thread worker = new Thread(DoWork); 
    worker.Start(); 
    worker.Join(); 

    if (threadEx != null) { 
     StackTrace trace = new StackTrace(threadEx); 
     Console.WriteLine(trace); 
    } 
} 

static void DoWork() 
{ 
    try { 
     throw new Exception("Boom!"); 
    } 
    catch (Exception ex) { 
     threadEx = ex; 
    } 
} 
+0

감사 마티아스, 드디어 너무 자신이이 테스트 않았다 당신은, 그것은 바로 인쇄를 잘 수행하고 스택 추적. –

1

호출 된 스레드에 대해 StackTrace를 생성합니다 (내부 스레드는 'targetThread'매개 변수와 함께 'CaptureStackTrace'를 호출하여 현재 스레드가 요청되었음을 나타냅니다). 다른 thread 용으로 작성하는 유일한 ctor는, Thread 인스턴스를 취하는 ctor입니다.

+0

이것은 Mattias와 내 테스트를 모순입니다. 방금 Reflector에서 보았고 null이 targetThread로 'CaptureStackTrace'로 전달되었습니다. 그런 다음 예외에서 전달하는 'GetStackFramesInternal'을 호출합니다. 내가 'GetStackFramesInternal'에 대한 소스를 볼 수 없습니다. –

+0

네, 이상합니다. Win32에서 NULL은 "현재 스레드"를 의미하지만 여기서는 다른 것을 의미합니다. GetStackFramesInternal가 mscoree.dll이 구현됩니다 ... 나는 SSCLI 소스에보고하고, 파일의 구현을 발견 \ CLR \ SRC \ VM \ debugdebugger.cpp : 경우 (pException == NULL) { // 쓰레드가 현재 쓰레드라면 NULL이다. data.TargetThread = pStackFrameHelper-> TargetThread; GetStackFrames (NULL, (무효 *) - 1, 다른 &data); } { GetStackFramesFromException (pException, &data); } – codekaizen