【发布时间】:2026-01-05 20:40:01
【问题描述】:
我正在使用 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/
干杯
【讨论】: