2011-07-28 119 views
2

這是一個模糊的問題,所以我期待模糊的(但希望有幫助的)答案。幫助在Visual Studio中調試C++

我在C++和調試在Visual Studio中新的,什麼讓我很沮喪得最多的是如何解釋的調用堆棧...

所以我的問題是具體什麼我看到一條錯誤的堆疊頂部。這應該表明什麼?有人建議在代碼中引發異常,導致堆棧損壞。這可能由調用堆棧中的__FrameUnwindFilter(_EXCEPTION_POINTERS * ...)行表示。我如何解釋這裏發生了什麼?有太多我可能不在乎的東西。然後,最重要的是,「下面的幀可能不正確和/或丟失」這個警告是什麼意思?我完全不相信這些線?爲什麼要首先展示它?另外,爲什麼dddddddd()在棧幀的底部?

請幫助我 - 我正在尋找關於如何解釋堆棧的一般建議和提示。

感謝,

JBU

在一個特定的錯誤,我看到的是:

mscvcr90d.dll!_NMSG_WRITE(...) Line ### 

mscvcr90d.dll!abort() Line ## + 0x7 bytes 

mscvcr90d.dll!terminate() Line ### 

mscvcr90d.dll!__FrameUnwindFilter(_EXCEPTION_POINTERS* ...) Line #### 

mscvcr90d.dll!__FrameUnwindToState(EHRegistrationNode * ...) Line ### 

[email protected][email protected]() + 0x12 bytes 

ntdll.dll!7c9032a8() 

[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 

ntdll.dll!7c90327a() 

ntdll.dll 

ntdll.dll 

kernel32.dll 

kernel32.dll 

kernel32.dll 

Other Library 

Other Library 

FINALLY MY LIBRARY CODE HERE 

END OF MY LIBRARY CODE 

a whole bunch of other libraries here that I haven't heard of 

dddddddd() 

回答

2

好,如果你需要調試here我會幫你解決問題,但我的提示wouldnt say我很確定我沒有自己的問題,我真的不知道從錯誤日誌

+0

莫大的聯繫更多信息,感謝 – jbu

2

你看到這個k什麼東西?調試版本提供了更多關於調用堆棧的有用信息。如果你喜歡/需要(我認爲是調試信息格式),你也可以在Release版本的項目屬性中啓用此信息。如果沒有這些信息(包括沒有像ntdll構建的DLL),它只能告訴你庫名和虛擬地址。

展開告訴你,異常導致了錯誤。作爲一個起點,你可能想要考慮你的異常處理是足夠的和足夠豐富的信息,希望你可以收集更多有關你的錯誤的有價值的信息。

不幸的是,如果你確實損壞了堆棧,它可能會弄錯一切,並在你的代碼中「指向一個錯誤」,這是沒有意義的。這通常是你看到callstack沒有體面起源的地方(而你的例子就是這樣)。

+0

調試......雖然不知道是否所有的依賴庫也是調試 – jbu

+0

似乎不是調試版本。從配置中選擇'調試',並從VS調試器本身開始調試。你有什麼其他庫/ DLL的集合? – Ajay

2

這裏有幾件事情正在進行。

首先是確實出現了拋出的SEH異常。這由FrameUnwindToFilter調用表示。從調用堆棧中很難簡單地說出發生了什麼異常。如果您向下移動到該框架並查看參數,其中一個應該有異常代碼。

第二個項目「下面的框架可能不正確......」調試器顯示此消息時,您正在調試本機DLL的符號不存在。符號的缺失使本地調試器難以(有時甚至是不可能)準確地確定調用堆棧。它迫使它猜測,因此警告「可能是錯誤的」

這可以通過加載有問題的DLL的符號來解決。在這種情況下,它是nt.dll和kernel32.dll。這些是微軟擁有的符號公開可用的DLL。下面MDN頁面有關於如何讓公共符號設置你的機器上