2013-07-23 75 views
4

我有一個作爲Windows服務運行的應用程序。今天,我被告知該服務已經死亡。我發現了一個事件查看器條目,其基本信息是:錯誤模塊kernel32.dll,版本6.0.6002.18740,時間戳0x50b58c3d,異常代碼0xc0000005,錯誤偏移量0x0003fc2e如何從故障偏移量中確定調用的kernel32.dll函數

我確定我的代碼中存在一個錯誤。我可以從offset中確定kernel32.dll函數(異常來自哪裏)?我打算在我的代碼中退回來電。

+1

如果這是一個經常發生,你需要將你的程序配置爲[使微型轉儲(http://wintellect.com/blogs/jrobbins/how-to- capture-a-minidump-let-me-count-the-ways),您可以調試並獲取完整堆棧跟蹤等信息。 –

+1

+1斯科特說的。確切的錯誤地址不太可能有用,因爲它將在幫助函數中。你需要一個堆棧跟蹤。 –

回答

7

我同意在評論說,但無論如何,我認爲答案可能是有用的。以下是如何使用SDK中的Windows調試工具查找函數名稱,前提是EventViewer報告kernel32.dll中的失敗指令的偏移量。

首先,安裝Windows調試工具和配置微軟的公共符號服務器路徑。可以在線獲得說明,例如,此視頻:http://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-Building-your-USB-thumbdrive

啓動Windows調試程序附加到您的進程或系統中的任何進程。 kernel32.dll是任何進程加載的第一個DLL之一,它不太可能被重新裝訂。所以kernel32.dll的基地址在所有進程中都是一樣的。在調試器

0:006> lm m kernel32 
start end  module name 
7c800000 7c8f6000 kernel32 (pdb symbols)   c:\debuggers\symbols\kernel32.pdb\A22E3A9843CC45B4A2BFA31377127D422\kernel32.pdb 

運行「列表模塊」命令KERNEL32.DLL的

獲取基址所以基址是7c800000。現在運行「拆解單指令」使用命令DLL基地址和偏移量:

0:006> u 0x7c800000+0x0003fc2e l 1 
kernel32!BasepCopyFileExW+0x859: 
7c83fc2e 53    push ebx 

所以BasepCopyFileExW是函數名稱。 (您的系統上,結果可能會有所不同。)