這裏的情況:幫助postmorten調試Win32應用程序
背景
我有一個混合模式.NET /機應用程序在Visual Studio 2008開發
我的意思通過混合模式,前端是用C++ .NET編寫的,調用本地C++庫。本地代碼執行應用程序中的大部分工作,包括根據需要啓動新線程。 .NET代碼僅用於UI目的(贏取表單)。
我有一個測試版的計算機上運行的應用程序的發佈版本。
本機庫在完全優化的情況下進行編譯,但也啓用了調試(「調試信息格式」設置爲「程序數據庫」)。
這意味着我在PDB文件中有應用程序的調試符號。
問題
所以無論如何,在測試中的一個具有它偶爾崩潰在XP的應用程序有問題。我已經能夠使用Dr Watson的幾次運行獲得碰撞的小型轉儲。
當我調試到它(使用minidump - 我實際上並沒有真正調試真正的應用程序)時,所有調試符號都被正確加載:我可以正確地看到所有本機線程的完整堆棧跟蹤。其他線程(大概是.NET線程)沒有堆棧跟蹤,但它們至少可以顯示線程在哪個dll上啓動(即ntdll.dll)。
它正確地報告其失敗的線程(「未處理的異常在用戶(5)的.dmp 0x0563d652:0000005:訪問衝突讀取位置00000000)。
然而,當我走進它的線程顯示什麼是有用的。在堆棧跟蹤中,有一個條目只有內存地址「0563d652()」(甚至不是「ntldll.dll」)。
當我進入dissasembly時,它只顯示約30條指令的隨機部分。內存地址的任何一邊都只是「???」,它幾乎看起來不是我的源代碼的一部分(是不是你的二進制文件順序加載到內存中?是否正常在隨機存放一組彙編語句MI沒有地方的蠢貨?)。
我的問題
所以基本上我的問題是threfold。
1)任何人都可以解釋調試器缺乏信息?
2)銘記,我不能顯示在我的代碼發生錯誤,任何人都可以提出失敗
3的一個原因)我可以做任何事情來幫我診斷在這個當前的問題未來?
幫助!
約翰
更新:
這裏是WinDBG中
# ChildEBP RetAddr
WARNING: Frame IP not in any known module. Following frames may be wrong.
00 099bf414 02d0e7fc 0x563d652
01 00000000 00000000 0x2d0e7fc
怪異呵呵發生故障的線程的堆棧轉儲?甚至不顯示一個DLL。
是否有可能損壞了堆棧/堆,導致線程剛剛損壞......?
不,使用Visual Studio 2008集成調試器。我會給WinDbg一個去 - 好建議,謝謝。 – John 2009-04-09 13:14:55
與WinDBG相同的結果我很害怕。 至於SOS,它建議你使用一個完整的轉儲而不是一個小型轉儲(這是我所有的)。將看看我能否得到一個完整的轉儲來嘗試。 – John 2009-04-09 13:35:24
好吧,在某種意義上,轉儲也可能是完全轉儲 - 取決於它創建的選項。 此外,使用windbg總是一個好主意; o) – deemok 2009-04-09 17:57:49