【问题标题】:WinDbg -- debugging mixed x64 managed/unmanaged codeWinDbg -- 调试混合 x64 托管/非托管代码
【发布时间】:2009-12-21 20:32:13
【问题描述】:

我正在使用 WinDbg(Native x64 -- NOT Itanium)来调试一个 x64(非托管)应用程序,该应用程序同时加载了托管和非托管 DLL。

我正在尝试在其中一个非托管 DLL 中设置断点。当断点被击中并且我单步执行时,显示的指令与它们应有的完全不同。我用两个不同的反汇编程序验证了 WinDbg 在我逐步执行时没有显示正确的反汇编。

当附加到应用程序时,我得到这样的一行:

ModLoad: 00000000`XXXXXXXX 00000000`YYYYYYYY  C:\MyDLL.DLL

我调整了两个反汇编器中的地址,以反映基地址 XXXXXXXX。

可能是什么问题?

【问题讨论】:

  • 我发现了这个(从来没有完全回答过):stackoverflow.com/questions/1398826/… 也许这有帮助?
  • 反汇编一般有意义吗?我会普遍偏爱windbg,因为它在实时过程中使用有效的IP进行解码,这有利于而不是仅仅依赖静态分析(无论反汇编程序有多好)。你能透露一些汇编代码来比较吗?
  • 这是“调用 someFunc”与“mov ebx,esp”。即使踩到其他点也不匹配。击中断点似乎不一致;我设置了应该被命中但没有被命中的断点。

标签: visual-studio debugging unmanaged windbg managed-code


【解决方案1】:

uf modname!FuncName 是否返回正确的结果?如果你在奇怪的地方反汇编/断点,你有时可以欺骗 WinDbg。请记住,x86/x64 是一个可变宽度指令集,因此如果您开始阅读一条指令的中途,反汇编程序会感到困惑。

【讨论】:

  • 您认为 .NET 解释器会改变现状吗?
  • 如果我执行“u
    ”,则不匹配。我不是用符号调试。我也尝试移动地址一点,无助于获得正确的反汇编。
  • 如果你不使用符号,WinDbg 会给你垃圾信息。找到你需要的 DLL 的符号
  • 我不相信。我使用过 WinDbg,它给了我一个很好的反汇编(与静态反汇编完美匹配)。当我从全原生 x86 迁移到混合模式 x64 时,我才开始遇到问题。
  • 嗯,让我换个说法——当你没有符号时,WinDbg 将是不可信的,但并不总是不正确的。无论如何,如果您比较原始字节与 WinDbg 通过 db @rip 报告的内容会发生什么?
【解决方案2】:

在某处我注意到这可能与您的 DLL 中不正确的入口点有关。但我不知道如何处理这些信息(我是初学者)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2011-09-04
    • 2013-08-24
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多