2009-04-09 114 views
1

這裏的情況:幫助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。

是否有可能損壞了堆棧/堆,導致線程剛剛損壞......?

回答

3

您是否在使用WinDbg?如果是這樣,你是否在使用延長子的兒子?

Bugslayer: Son-of-Strike

- 或 -

Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects

+0

不,使用Visual Studio 2008集成調試器。我會給WinDbg一個去 - 好建議,謝謝。 – John 2009-04-09 13:14:55

+0

與WinDBG相同的結果我很害怕。 至於SOS,它建議你使用一個完整的轉儲而不是一個小型轉儲(這是我所有的)。將看看我能否得到一個完整的轉儲來嘗試。 – John 2009-04-09 13:35:24

+0

好吧,在某種意義上,轉儲也可能是完全轉儲 - 取決於它創建的選項。 此外,使用windbg總是一個好主意; o) – deemok 2009-04-09 17:57:49

1

我們遇到過類似於MSVC2K5 SP1中的代碼錯誤無效的問題,但如果您安裝了MSVC2K5 SP2運行時,則會導致錯誤,而該錯誤並未指向有效的代碼。問題的

的部分是,當你開始執行數據代碼,你可以做任何事情,所以你甚至不能回到一個有效的堆棧跟蹤崩潰的位置變得無用。

我們有這種事發生在我們,當新的.NET運行時安裝安裝MSVC C++運行時中的SxS目錄中的新版本。

最後,我們解決該問題的方法是使崩潰頻繁發生,並根據需要添加儘可能多的日誌以對其進行本地化。

1

一旦你抓住並安裝windbg的副本並在那裏打開轉儲文件,你可以發佈錯誤線程的堆棧嗎? 我們可以從那裏開始。

0

您的EIP只是損壞。
假設ESP是有效的,你可以查看調用堆棧,只需鍵入:
DDS ESP [進入]
DDS [進入]

您也可以使用內存窗口:
設置地址:ESP
將格式設置爲:指針&符號