我的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指令?
答案 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)
答案 3 :(得分:0)
我有一个类似的问题,我正在调试一个C#exe,它通过PInvoke调用我自己的C ++ dll,这是同一个解决方案的所有部分。在我的c#项目中启用本机代码调试允许我调试我的C ++代码。