【问题标题】:Visual Studio 2008: How to view disassembled code for a DLL that is not executing at the momentVisual Studio 2008:如何查看当前未执行的 DLL 的反汇编代码
【发布时间】:2026-01-05 20:40:01
【问题描述】:

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

当我中断进程时,当前正在执行的模块会显示在反汇编窗口中。不幸的是,这不是感兴趣的模块。我不知道如何在感兴趣的模块不执行时显示它的代码。

【问题讨论】:

    标签: visual-studio disassembly


    【解决方案1】:

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

    当您“调试/中断所有”时,请按照以下步骤操作:

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

    您现在应该位于要玩的模块的开头。如果你知道一个函数的地址,你可以直接跳转到那个地址。

    这是一个例子:

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

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

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

    在反汇编框中输入这个地址确实让我直接跳到那个函数的开头。

    【讨论】:

      【解决方案2】:

      在 WinDbg 中做这样的事情容易

      uf cards!cdInit
      

      【讨论】:

      • 我是说他使用了错误的工具来完成这项工作。而且他不需要为 WinDbg 支付额外费用,它是免费的 - 每个开发人员都应该安装它
      【解决方案3】:

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

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

      干杯

      【讨论】:

      • 很遗憾,反射器仅适用于托管代码 (.Net)。它也不再免费 :)
      最近更新 更多