2010-01-11 116 views
1

如何恢復堆棧跟蹤函數名稱而不是<UNKNOWN>Windows堆棧跟蹤中的函數名稱

 
    Event Type: Error 
    Event Source: abcd 
    Event Category: None 
    Event ID: 16 
    Date:  1/3/2010 
    Time:  10:24:10 PM 
    User:  N/A 
    Computer: CMS01 
    Description: 
    Server.exe caused a in module at 2CA001B:77E4BEF7 

    Build 6.0.0.334 

    WorkingSetSize: 1291071488 bytes 

    EAX=02CAF420 EBX=00402C88 ECX=00000000 EDX=7C82860C ESI=02CAF4A8 
    EDI=02CAFB68 EBP=02CAF470 ESP=02CAF41C EIP=77E4BEF7 FLG=00000206 
    CS=2CA001B DS=2CA0023 SS=7C820023 ES=2CA0023 FS=7C82003B GS=2CA0000 

    2CA001B:77E4BEF7 (0xE06D7363 0x00000001 0x00000003 0x02CAF49C) 
    2CA001B:006DFAC7 (0x02CAF4B8 0x00807F50 0x00760D50 0x007D951C) 
    2CA001B:006DFC87 (0x00003561 0x7F6A0F38 0x008E7290 0x00021A6F) 
    2CA001B:0067E4C3 (0x00003561 0x00000000 0x02CAFBB8 0x02CAFB74) 
    2CA001B:00674CB2 (0x00003561 0x006EBAC7 0x02CAFB68 0x02CAFA64) 
    2CA001B:00402CA4 (0x00003560 0x00000000 0x00000000 0x02CAFBB8) 
    2CA001B:00402B29 (0x00003560 0x00000001 0x02CAFBB8 0x00000000) 
    2CA001B:00683096 (0x00003560 0x563DDDB6 0x00000000 0x02CAFC18) 
    2CA001B:00688E32 (0x02CAFC58 0x7C7BE590 0x00000000 0x00000000) 
    2CA001B:00689F0C (0x02CAFC58 0x7C7BE590 0x00000000 0x00650930) 
    2CA001B:0042E8EA (0x7F677648 0x7F677648 0x00CAFD6C 0x02CAFD6C) 
    2CA001B:004100CA (0x563DDB3E 0x00000000 0x00000000 0x008E7290) 
    2CA001B:0063AC39 (0x7F677648 0x02CAFD94 0x02CAFD88 0x77B5B540) 
    2CA001B:0064CB51 (0x7F660288 0x563DD9FE 0x00000000 0x00000000) 
    2CA001B:0063A648 (0x00000000 0x02CAFFEC 0x77E6482F 0x008E7290) 
    2CA001B:0063A74D (0x008E7290 0x00000000 0x00000000 0x008E7290) 
    2CA001B:77E6482F (0x0063A740 0x008E7290 0x00000000 0x00000000) 
+2

這是什麼意思?「不是真正的問題」? – 2010-01-11 16:08:04

+1

@尼爾,我懷疑在編輯之前,人們在閱讀所要求的內容時有困難。 – 2010-01-11 17:15:59

回答

0

嘗試從IDE運行相同的內容,暫停它並跳轉到程序集中的地址。然後你可以切換到源代碼並查看那裏的功能。

至少這是它在Delphi中的工作原理。我也知道Visual Studio中的這種可能性。

如果你沒有內置在你的IDE,你必須使用像OllyDbg的調試器。運行導致錯誤的exe並暫停OllyDbg中的應用程序。從堆棧跟蹤轉到地址。 在IDE中打開一個類似的應用程序項目,運行它並暫停它。搜索您在OllyDbg中看到的相同二進制模式,然後切換到源代碼。

我知道的最後一種可能是分析地圖文件,如果你在構建過程中構建它的話。

+0

我在VS 2005中加載了exe文件,輸入這個地址0xE06D7363到地址下拉菜單中,它顯示???在顯示屏上,請幫忙? – Sanjiv 2010-01-11 17:16:18

+0

在VS 2005中啓動應用程序,在調試模式下運行它。在斷點處停下來。右鍵單擊任何源代碼行,然後單擊「轉到Dissasembly」。你會找到Adresses。 – 2010-01-11 19:53:10

1

獲得程序,objdump它完全相同的構建,並看看是在地址什麼功能。如果符號名已從可執行文件中刪除,這可能有點困難。

如果程序代碼以任何方式動態的,你可能有它碰上一個調試器找到函數的地址。

如果程序被故意混淆和討厭,並且它在運行時以某種方式隨機分配了它的函數地址(像病毒這樣的逃避東西,或者防拷貝代碼有時會這樣做),那麼所有的投注都關閉。

一般: 找出導致崩潰的最簡單的方法就是按照需要重現它在調試器中運行應用程序的實例步驟。所有其他方法都困難得多。這就是爲什麼開發人員經常不花費時間來解決沒有已知方法重現的錯誤的原因。

0

您需要時發生崩潰時有調試信息文件(.PDB)旁邊的exe文件。
然後,希望您的崩潰轉儲代碼可以加載它並使用它中的信息。

0

我用StackWalker - 只是把它編譯成你的程序的源代碼,如果它崩潰,你可以在那時產生一個堆棧跟蹤,包括函數名。

0

最常見的原因是你實際上沒有模塊在指定的地址。這可能發生,例如當您取消引用未初始化的函數指針時,或者使用無效的this指針調用虛擬函數。

這可能不是這裏的情況:「77E4BEF7」是非常高的概率在Windows DLL,並006DFAC7在你的模塊中的地址。你不需要這樣的PDB文件:Windows應該總是知道模塊名稱(.EXE或.DLL) - 事實上,它首先需要該模塊名稱才能找到正確的PDB文件。

現在,剩下的問題是爲什麼你沒有模塊信息。這我從上面的信息不能告訴。您需要有關實際系統的信息。例如,如果有DEP嗎?您的流程是否啓用了DEP?