2009-09-11 2 views
1

Существует конструктор на StackTrace, который принимает exesption в качестве аргумента. Все отлично и хорошо, но я заметил, что все остальные конструкторы говорят, что он получит StackTrace от текущего потока, но конструктор принимает исключение ничего не говорит о том, что кромеStackTrace из Exception на разные темы?

В результате трассировки стека описывает не сказать стек во время исключения .

Я просто хочу быть уверен, что получит правильный 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

Благодаря Маттиас, я, наконец, проверить это для себя тоже, и вы правы, это делает печать право трассировки стека. – 2009-09-11 10:01:33

1

Он создаст StackTrace для потока, на который он вызван (внутренне он вызывает CaptureStackTrace с параметром targetThread, который указывает, что запрашивается текущий поток). Единственный ctor, который создает для другого потока, тот, который принимает экземпляр Thread.

+0

Это противоречит Маттиасу и моим испытаниям. Я просто посмотрел на него в Reflector, и null передается как targetThread в 'CaptureStackTrace'. Затем он вызывает «GetStackFramesInternal», проходящий в исключении. Однако я не вижу источник для 'GetStackFramesInternal'. – 2009-09-11 10:07:48

+0

Да, это странно. В Win32 NULL означает «текущий поток», но здесь это означает что-то другое. GetStackFramesInternal реализуется в Mscoree.dll ... Я посмотрел в источнике SSCLI, и нашел реализацию в файле \ CLR \ SRC \ ут \ debugdebugger.cpp: если (pException == NULL) { // Thread - NULL, если это текущий поток. data.TargetThread = pStackFrameHelper-> TargetThread; GetStackFrames (NULL, (недействительными *) - 1, &data); } еще { GetStackFramesFromException (& pException, &data); } – codekaizen

Смежные вопросы