2014-03-05 67 views
2

我收到了我們在應用程序中看到的堆棧溢出異常的跟蹤轉儲。 我們最終在沒有使用跟蹤轉儲的情況下發現問題,但我很好奇:如何使用堆棧跟蹤轉儲來調試異常?

如何在將來使用線程的跟蹤轉儲來更快地診斷問題?

我知道函數名後面的十六進制數是編譯代碼中的某種偏移量。我不知道底部五行中的四行是什麼意思(以0x開頭的行)。我假定這是指我們應用程序代碼中的一個位置;如果是這樣,是否有方法可以確定應用程序中該行的來源?

ntdll!ZwTerminateProcess 
KERNELBASE!TerminateProcess+2c 
clr!EEPolicy::HandleFatalStackOverflow+1c9 
clr!EEPolicy::HandleStackOverflow+1ac 
clr!COMPlusFrameHandler+9b 
ntdll!ExecuteHandler+26 
ntdll!ExecuteHandler+24 
ntdll!RtlDispatchException+127 
ntdll!KiUserExceptionDispatcher+f 
//Cut 40 lines here... 
clr!MethodDesc::DoPrestub+59d 
clr!ReflectionInvocation::CompileMethod+54 
mscorlib_ni+393a09 
mscorlib_ni+34e3bc 
System_Core_ni+1bf152 
System_Core_ni+1bb05e 
System_Core_ni+3d0f57 
0x2413854b 
0x23df1ad3 
clr!ArrayNative::ArrayCopy+3ce 
0x20e680b9 
0x20e61c65 

注:我不要求在調試這個具體問題的幫助,但我怎麼可以用這樣的調試未來的問題時,我所有的源代碼和跟蹤轉儲。

回答

4

只用那個棧跟蹤,你可能不會走得很遠。前5行是堆棧幀,但由於缺少符號,因此沒有上下文。

如果通過跟蹤轉儲,你的意思是內存轉儲,那麼你有幾個選項用於調試。

1)您可以打開Visual Studio中的轉儲 - 也許是最簡單 - 在這裏看到: http://msdn.microsoft.com/en-us/library/d5zhxt22.aspx

2)您可以打開使用的WinDBG 有一個學習曲線的轉儲,但它是有一個整潔的技巧。我總是將人們指向苔絲的博客來加強這一點。帖子是舊的,但仍然相關: http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx

如果我交了這個堆棧跟蹤,我不會浪費大量的時間來確定它的含義。我會重現這個問題並捕獲崩潰轉儲並使用上述技術之一來確定根本原因。