2009-10-12 27 views
8

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

如果我调试我的C#代码,并尝试“步入”P/Invoke调用,它会逐步完成。那里并不令人意外 - 我预料到了;它没有这个DLL的源代码,我没有告诉它看到反汇编视图时没问题。

因此,我将调试器切换到反汇编视图(调试> Windows>反汇编)。现在我看到我的JITted代码中的单个x86指令。我再次尝试进入P/Invoke调用。再一次,它逐步完成 - 即使我明确地告诉它Step Into x86 CALL指令。进入x86 CALL有多难?

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

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

不好。 Visual Studio仍拒绝介入。

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

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

+0

你有没有想过这个? – Dennis 2013-11-11 22:05:00

+1

自从我尝试这么做已经有几年了,但是据我回忆,不,我从来没有把它付诸实施。 – 2013-11-12 03:58:15

回答

1

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

+1

我对编写C++/CLI代码几乎一无所知......有任何链接可以帮助我开始使用此策略? – 2009-10-13 14:13:58

4

This可以帮助您解决问题: (由引力)

CallingConvention = CallingConvention.Cdecl 

而且this提到,你需要分离托管调试和穿越界限时重新连接非托管。您可能需要检查混合调试器的功能,以及MSDN的首选项。

,最后使用Ed Dore'答案:

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

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

此外,如果您使用“调试。附加到 过程”,一定要打到 ‘选择...’按钮,在‘附加到 过程’对话框中,选择两个 托管和本机调试支持。

+0

这些都不能帮助您调用VS2017/Win10中的框架方法:( – 2018-03-09 13:08:12

1

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

幸得billb

而且,因为它是一个第三方库,确保启用仅我的代码是在选项中选中>调试

0

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