-->

在disassemby视图步入一个P /调用呼叫(Stepping into a P/Invoke

2019-08-17 21:46发布

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

如果调试我的C#代码,并试图“进入”的P / Invoke调用,它来代替步骤结束。 这并不奇怪 - 我期待; 它没有这个DLL的来源,我没有告诉它我没事跟看到汇编视图。

所以我的调试器切换到汇编视图(调试>窗口>拆卸)。 现在,我看到我的实时编译代码的个人x86指令。 我再次尝试步入P / Invoke调用。 再次,它在步代替 - 尽管我清楚地告诉它要步入一个x86 CALL指令。 有多难踏入一个x86的电话吗?

我的谷歌搜索迄今已经指示我几个可能影响此选项,并且我已经将它们设置:

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

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

我没有对第三方DLL中的PDB,但是这不应该的问题。 我不关心源代码或符号信息。 (嗯,其实他们会是非常好的,但我已经知道我不会让他们。)Visual Studio可以做的x86调试(这是反汇编视图 ),以及所有我想要做的就是踏进在x86代码。

还有什么,我需要做的就是VS,让我步入了x86指令P内/ Invoke调用?

Answer 1:

这可能会帮助您解决问题:(由引力)

CallingConvention = CallingConvention.Cdecl

同时此提到,你需要分离托管调试和穿越界限时重新连接非托管。 您可能需要检查混合调试器的功能,它是从MSDN喜好。

最后,用埃德多尔”的回答:

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

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

另外,如果你用“Debug.Attach到进程”,务必打在“附加到进程”对话框中的“选择”按钮,然后选择托管和本地调试支持。



Answer 2:

有一件事我会尝试从C#和C ++ / CLI代码去,然后再从C ++的第三方代码。 一旦你在C ++(和自由的P / Invoke的基础设施),您可能有反汇编视图更好的运气。



Answer 3:

在你的C#项目属性,在调试选项卡,勾选启用原生代码调试。 在VS 2012为我工作。

幸得billb 。

此外,由于它是一个第三方库,确保启用仅我的代码是在选项选>调试。



Answer 4:

我有我在那里调试C#EXE调用通过PInvoke的我自己的C ++的dll,相同的解决方案的一部分类似的问题。 在我的C#项目启用原生代码调试,让我调试我的C ++代码。



文章来源: Stepping into a P/Invoke call in disassemby view