2010-01-28 71 views
6

我正在使用Visual Studio 2008來追蹤執行過程中的錯誤。我已附加到流程並確定了感興趣的模塊。 (它發生在這個模塊的調試符號已經從pdb文件中加載)。我想在反彙編窗口中顯示反彙編的代碼,以便我可以決定在哪裏設置斷點。Visual Studio 2008:如何查看當前未執行的DLL的反彙編代碼

當我打破進程時,當前正在執行的模塊顯示在反彙編窗口中。不幸的是,這不是感興趣的模塊。我無法弄清楚如何在未執行時顯示感興趣模塊的代碼。

回答

5

假設你正在調試一個非託管過程...

當「調試/打破一切」,請按照下列步驟操作:

選擇「調試/視窗/模塊」來獲取所有加載的上市模塊。 在「模塊」窗口的「地址」列下是該模塊的內存範圍。 在反彙編窗口的「地址:」框中,輸入模塊的起始地址(確保在數字前加0x)

您現在應該在要玩的模塊的開始處。如果您知道某個功能的地址,則可以跳轉到該地址。

下面是一個例子:

運行SOL.EXE 連接到進程,並打破所有。 看看模塊,找到「cards.dll」,你會看到它在6fc10000(無論如何,我的機器上)加載。

將地址(0x6fc10000)鍵入反彙編窗口,它會將您帶到模塊的開頭。

現在說我想實際跳轉到一個函數。在Dependency Walker(depends.exe)中打開DLL以獲取函數的偏移量。在我的例子中,我想在函數「cdInit」上設置一個斷點。在Dependecny Walker中,它顯示導出函數cdInit的偏移量爲0x000013e6。因此,爲了實現這個功能,我將模塊的起始地址(0x6fc10000)添加到偏移量(0x000013e6)以獲取0x6fc113e6。

將這個地址輸入到反彙編框中確實讓我跳到了該函數的開頭。

0

您是否嘗試過使用.Net Reflector?你可以從你的DLL中獲得所有的代碼,甚至可以用調試消息來重新編譯它。它是免費的:

http://www.red-gate.com/products/reflector/

乾杯

+0

是否與本機代碼的DLL工作? – 2016-03-24 17:13:51

+0

不幸的是,反射器僅適用於託管代碼(.Net)。它不再是免費的:) – 2016-03-25 18:37:40

1

做這樣的東西是遠遠容易 WinDbg中

uf cards!cdInit 
+0

但他問如何在Visual Studio 2008中做到這一點... – GalacticJello 2010-01-29 15:29:16

+0

我說他使用錯誤的工具來完成這項工作。而且這不像他必須爲WinDbg支付額外費用,它是免費的 - 每個開發者都應該安裝它 – 2010-01-29 16:56:36