Visual Studio 2008:如何查看当前未执行的DLL的反汇编代码

时间:2010-01-28 14:38:53

标签: visual-studio disassembly

我正在使用Visual Studio 2008来追踪执行过程中的错误。我已加入该流程并确定了感兴趣的模块。 (碰巧这个模块的调试符号已从pdb文件加载。)我想在Disassembly窗口中显示反汇编的代码,以便我可以决定在哪里设置断点。

当我中断过程时,当前正在执行的模块显示在“反汇编”窗口中。不幸的是,这不是感兴趣的模块。我无法弄清楚如何在没有执行的情况下显示感兴趣的模块的代码。

3 个答案:

答案 0 :(得分:5)

假设您正在调试非托管进程...

当您“调试/全部中断”时,请按照下列步骤操作:

选择“Debug / Windows / Modules”以获取所有已加载模块的列表。 在“模块”窗口的“地址”列下,是该模块的内存范围。 在反汇编窗口的“地址:”框中,键入模块的起始地址(确保在数字前添加0x)

您现在应该处于要玩的模块的开头。如果您知道函数的地址,则可以跳转到该地址。

以下是一个例子:

运行sol.exe 附加到流程,并打破所有。 查看模块,找到“cards.dll”,你会看到它加载到6fc10000(在我的机器上,无论如何)。

在反汇编窗口中键入该地址(0x6fc10000),它将带您进入模块的开头。

现在说我想跳转到一个功能。在Dependency Walker(depends.exe)中打开DLL以获取函数的偏移量。在我的例子中,我想在函数“cdInit”上设置一个断点。在Dependecny Walker中,它显示导出函数cdInit的偏移量为0x000013e6。因此,为了获得该功能,我将模块的起始地址(0x6fc10000)添加到偏移量(0x000013e6)以获得0x6fc113e6。

在反汇编框中键入此地址确实会让我直接跳到该函数的开头。

答案 1 :(得分:1)

在WinDbg中,做这样的事情

uf cards!cdInit

答案 2 :(得分:0)

您是否尝试过使用.Net Reflector?您可以从DLL中获取所有代码,甚至可以使用调试消息重新编译它。它是免费的:

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

干杯