簡體   English   中英

轉儲調用堆棧出錯?

[英]Dump call stack on error?

我正在調試用純C語言編寫的程序(沒有C ++,MFC,.NET等)到WIN32API。 它必須在VS2005(在Win 2K / XP下運行)和VS2010(在Win7下運行)中都可以編譯。我一直無法復制客戶似乎能夠可靠地復制的錯誤,因此我正在尋找方法讓我的程序“自我調試”。 它正在監視所有正在更改的鍵值,但是我真正想看到的是值更改時的堆棧轉儲。 哦,如果不在客戶計算機上安裝編譯器,則無法運行“真正的”調試版本(使用調試庫),這不是一個選擇,因此必須將其構建到我的發行版本中。

除了將我自己的函數進入/退出調用添加到我自己的堆棧監視器之外,還有什么方法可以做到這一點? 我特別希望能夠在特定內存地址意外更改時設置硬件斷點(因此,我需要能夠在一些EXPECTED更改位置附近禁用/啟用它)。這可能嗎? 在Windows程序中?

如果可能的話,我希望不需要更改幾千行代碼的操作。 是的,在開發工具方面我非常無能為力-我認為自己很幸運擁有Visual Studio IDE的專業版。

--edit--除了下面提供的出色答案外,我還在http://www.codereversing.com/blog/?p=76上找到了一些有關在自己的代碼中使用硬件斷點的信息。 我認為它是用黑客其他程序的想法編寫的,但是看起來它可以滿足我的需求,當意外位置寫入變量時,允許我創建一個小型轉儲。 那將很酷,而且非常有用,特別是如果我可以將其概括的話。 感謝您的回答,現在我來看看使用所有這些新信息可以創建什么!

您可以使用MiniDumpWriteDump函數創建轉儲,該轉儲可用於事后調試。 如果應用程序崩潰,則可以從SetUnhandledExceptionFilter設置的未處理異常處理程序中調用MiniDumpWriteDump 如果您所討論的錯誤沒有崩潰,則在檢測到某些意外情況時,可以從程序的任何位置調用MiniDumpWriteDump 有關崩潰轉儲和事后調試的更多信息,請訪問: http : //www.codeproject.com/Articles/1934/Post-Mortem-Debugging-Your-Application-with-Minidu

該技術的主要思想是將客戶端站點上生成的小型轉儲文件發送給開發人員,並且可以對其進行調試-線程,堆棧和變量信息可用(明顯受到代碼優化的限制)。

dbghelp32.dll中有一堆Win32函數,可用於為給定線程生成堆棧跟蹤:有關此示例,請參見此代碼

您還可以在MSDN上查找StackWalk64()和相關功能。

為了獲得有用的信息,您應該在發行版的編譯器中打開PDB文件生成:如果您設置安裝程序,以便在客戶計算機上PDB文件與DLL位於同一位置,那么您可以獲取可理解的堆棧會使用函數名稱等進行跟蹤。否則,您將僅獲得函數的DLL名稱和十六進制地址。

我不確定設置硬件斷點的實用性:您可以編寫某種使用Win32調試API的調試器,但這可能比其價值更大。

如果在症狀再次出現時可以添加有限的工具以引發可識別的異常,則可以使用Process Dumper在該異常的任何實例上生成完整的進程轉儲。

我發現我經常引用此工具,它確實是難以調試的生產問題的天賜之物,但鮮為人知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM