我正在使用 Visual Studio 2008 来追踪执行过程中的错误。我已附加到该过程并确定了感兴趣的模块。(碰巧这个模块的调试符号是从 pdb 文件中加载的。)我想在反汇编窗口中显示反汇编代码,以便我可以决定在哪里设置断点。
当我中断进程时,当前正在执行的模块显示在反汇编窗口中。不幸的是,这不是感兴趣的模块。我不知道如何在感兴趣的模块不执行时显示它的代码。
我正在使用 Visual Studio 2008 来追踪执行过程中的错误。我已附加到该过程并确定了感兴趣的模块。(碰巧这个模块的调试符号是从 pdb 文件中加载的。)我想在反汇编窗口中显示反汇编代码,以便我可以决定在哪里设置断点。
当我中断进程时,当前正在执行的模块显示在反汇编窗口中。不幸的是,这不是感兴趣的模块。我不知道如何在感兴趣的模块不执行时显示它的代码。
假设您正在调试一个非托管进程......
当您“调试/中断所有”时,请按照下列步骤操作:
选择“Debug/Windows/Modules”以获取所有已加载模块的列表。在模块窗口的“地址”列下是该模块的内存范围。在反汇编窗口的“地址:”框中,输入模块的起始地址(确保在数字前添加 0x)
您现在应该处于要玩的模块的开头。如果你知道一个函数的地址,你可以直接跳转到那个地址。
这是一个例子:
运行 sol.exe 附加到进程,然后全部中断。查看模块,找到“cards.dll”,您会看到它在 6fc10000 处加载(无论如何,在我的机器上)。
在反汇编窗口中键入该地址(0x6fc10000),它将带您进入模块的开头。
现在说我想实际跳转到一个函数。在 Dependency Walker (depends.exe) 中打开 DLL 以获取函数的偏移量。在我的示例中,我想在函数“cdInit”上设置一个断点。在 Dependecny Walker 中,它显示导出函数 cdInit 的偏移量为 0x000013e6。因此,要使用该函数,我会将模块的起始地址 (0x6fc10000) 添加到偏移量 (0x000013e6) 以获得 0x6fc113e6。
在反汇编框中输入这个地址确实让我直接跳到了那个函数的开头。
在 WinDbg 中做这样的事情要容易得多
uf cards!cdInit
您是否尝试过使用 .Net Reflector?您可以从 DLL 中获取所有代码,甚至可以使用其中的调试消息重新编译它。免费:
http://www.red-gate.com/products/reflector/
干杯