在disassemby视图中进入P / Invoke调用

时间:2009-10-12 23:01:49

标签: visual-studio debugging pinvoke step-into

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

如果我调试我的C#代码,并尝试“逐步进入”P / Invoke调用,它将转而执行。这并不奇怪 - 我预料到了;它没有这个DLL的源代码,我没有告诉它我看到反汇编视图是可以的。

所以我将调试器切换到反汇编视图(Debug> Windows> Disassembly)。现在我在JITted代码中看到了各个x86指令。我再次尝试进入P / Invoke调用。再次,它反过来 - 即使我明确告诉它Step Into a x86 CALL指令。进入x86 CALL有多难?

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

  • 在工具>选项>调试>一般情况下,“仅启用我的代码”未经检查。
  • 在项目>属性>选中“调试”选项卡“启用非托管代码调试”。

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

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

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

4 个答案:

答案 0 :(得分:4)

This可以帮助您解决问题: (由Graviton提供)

CallingConvention = CallingConvention.Cdecl

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

最后,使用Ed Dore'回答:

  

在“工具。选项”对话框中,选择   调试类别,并确保   “启用我的代码”设置是   选中。来自项目   属性,选择“调试”选项卡,然后选择   然后确保“启用非托管   代码调试“已检查。

     

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

     

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

信用转到billb

此外,由于它是第三方库,因此请确保在选项>中取消选中启用仅我的代码。调试。

答案 3 :(得分:0)

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