2013-01-25 26 views
0

我的代碼有時會運行爲「純函數調用」錯誤,所以我使用_set_purecall_handler來註冊處理程序。在調試模式下,我可以使用StackWalker獲取完整的調用堆棧,但在發佈模式下,StackWalker只顯示很少有用的信息。我嘗試使用MiniDumpWriteDump並設置ExceptionPointers = NULL。崩潰後,我得到一個轉儲文件,但vs無法調試它並顯示: 指定的模板找不到。請檢查完整路徑是否正確。
無論如何從這種情況下獲得釋放的應用程序的信息?如何在使用_set_purecall_handler時發佈應用程序中的callstack

+0

u能隨時提供調試信息 –

+0

@ Cheersandhth. - 阿爾夫·我想獲得一些調試信息以及..有一些石灰做純功能調用,我想從崩潰的時候從callstack找到地方。 – magicyang

+0

如果默認_purecall_handler顯示一個消息框,則不要調用_set_purecall_handler。相反,在顯示錯誤消息時將windbg附加到進程,配置符號,然後發出'〜* kb' windbg命令來獲取所有線程的調用堆棧。然後看看每個調用堆棧,直到看到一個調用某個MessageBox變體。 –

回答

0

通常,可以通過將子類的vtable與抽象類的vtable進行匹配來猜測所調用的方法 - 抽象類的vtable對於沒有實現的虛擬函數具有一堆pure_call處理程序。

關於方法調用需要知道的一切都在堆棧和寄存器中 - 只需查看調用站點的反彙編,記下用於從vtable檢索函數的偏移量,轉儲已故對象的實際vtable - 你可以通過反彙編查找`vftable's的構造函數的代碼來查找它。然後用DDS一個簡單的檢查應該給你需要知道哪些方法被調用(但不是對象爲何消失了:O)的所有信息

+0

這個應用程序運行在其他機器上,所以當它崩潰時我無法獲得它的堆棧和寄存器,它只是彈出一個錯誤對話框,沒有任何有用的信息,但只是r6025 .. – magicyang

+0

這是一個無賴 - 我建議添加一些排序未處理的異常處理通過類似谷歌的分隔板或像[crash-server]這樣的服務(http://www.crash-server.com) – deemok