【问题标题】:Stepping into a P/Invoke call in disassemby view在反汇编视图中进入 PInvoke 调用
【发布时间】:2014-10-14 00:23:26
【问题描述】:

我的 C# 代码正在通过 P/Invoke 调用非托管的第三方库函数,并且该非托管函数有一些奇怪的副作用。我想调试它,看看它在做什么。

如果我调试我的 C# 代码,并尝试“进入”P/Invoke 调用,它会改为跳过。这并不奇怪——我预料到了;它没有这个 DLL 的源代码,而且我没有告诉它我可以看到反汇编视图。

所以我将调试器切换到反汇编视图(调试 > Windows > 反汇编)。现在我在我的 JITted 代码中看到了单独的 x86 指令。我再次尝试进入 P/Invoke 调用。再一次,它改为跳过——即使我明确告诉它进入 x86 CALL 指令。进入 x86 CALL 有多难?

到目前为止,我的谷歌搜索已经向我展示了几个可能会影响这一点的选项,我已经设置了它们:

  • 在工具 > 选项 > 调试 > 常规中,未选中“仅启用我的代码”。
  • 在“项目”>“属性”>“调试”选项卡中,选中“启用非托管代码调试”。

不好。 Visual Studio 仍然拒绝介入。

我没有第三方 DLL 的 PDB,但这没关系。我不关心源代码或符号信息。 (嗯,实际上它们会非常好,但我已经知道我不会得到它们。)Visual Studio 可以进行 x86 调试(这就是反汇编视图是 for 的),以及所有我想做的是步入x86代码。

我还需要做什么才能让 VS 允许我在 P/Invoke 调用中单步执行 x86 指令?

【问题讨论】:

  • 你有没有想过这个问题?
  • 我已经有好几年没有尝试这样做了,但我记得,不,我从来没有让它发挥作用。

标签: visual-studio debugging pinvoke step-into


【解决方案1】:

This可以帮你解决问题: (由引​​力子)

CallingConvention = CallingConvention.Cdecl

另外this 提到您需要在跨越边界时分离托管调试器并重新连接非托管调试器。您可能需要检查混合调试器的功能及其来自 MSDN 的首选项。

最后,使用Ed Dore' 回答:

在 Tools.Options 对话框下,选择 调试类,并确保 “仅启用我的代码”设置为 未经检查。从项目 属性,选择调试选项卡,然后 然后确保“启用非托管 代码调试”被选中。

一旦你把这些摆平了, 你应该得到混合模式 调试支持工作。

此外,如果您使用“Debug.Attach To 进程”,一定要打 “附加到”中的“选择...”按钮 处理”对话框,然后选择两者 托管和本机调试支持。

【讨论】:

  • 这些都不能帮助在 VS2017/Win10 中调用框架方法:(
【解决方案2】:

我会尝试从 C# 到 C++/CLI 代码,然后从 C++ 到第三方代码。一旦您使用 C++(并且没有 P/Invoke 基础架构),反汇编视图可能会更好。

【讨论】:

  • 我对编写 C++/CLI 代码一无所知...有任何链接可以帮助我开始使用此策略吗?
【解决方案3】:

在您的 C# 项目属性的调试选项卡中,选中启用本机代码调试。在 VS 2012 中为我工作。

归功于billb

此外,由于它是第三方库,请确保在选项 > 调试中未选中 Enable Just My Code。

【讨论】:

    【解决方案4】:

    我有一个类似的问题,我正在调试一个通过 PInvoke 调用我自己的 C++ dll 的 C# exe,所有这些都是同一解决方案的一部分。在我的 c# 项目中启用本机代码调试允许我调试我的 C++ 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2018-11-06
      • 2015-07-10
      相关资源
      最近更新 更多