11

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

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

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

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

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

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

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

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

4

4 回答 4

4

可能会帮助您解决问题:(由 Graviton 提供)

CallingConvention = CallingConvention.Cdecl

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

最后,使用Ed Dore 的回答:

在 Tools.Options 对话框下,选择 Debugging 类别,并确保未选中“Enable Just My Code”设置。从项目属性中,选择调试选项卡,然后确保选中“启用非托管代码调试”。

一旦你解决了这些问题,你应该让混合模式调试支持工作。

此外,如果您使用“Debug.Attach To Process”,请务必点击“Attach To Process”对话框中的“Select...”按钮,并选择托管和本机调试支持。

于 2011-04-12T07:04:07.603 回答
1

我会尝试的一件事是从 C# 到 C++/CLI 代码,然后从 C++ 到第三方代码。一旦你在 C++ 中(并且没有 P/Invoke 基础设施),你可能会对反汇编视图有更好的运气。

于 2009-10-13T01:58:19.267 回答
1

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

归功于billb 。

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

于 2012-10-19T23:13:30.803 回答
0

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

于 2014-10-13T16:23:26.830 回答