代码之家  ›  专栏  ›  技术社区  ›  Matt

在我的.NET代码通过dllimport调用非托管dll中的函数后,是否有任何方法调试正在进行的操作?

  •  4
  • Matt  · 技术社区  · 15 年前

    在我的.NET代码通过dllimport调用非托管dll中的函数后,是否有任何方法调试正在进行的操作?

    我通过dllimport在非托管的内部公开一个dll函数。当我在单步执行代码时调用一个函数时,会发生一些事情,它永远不会返回。

    有什么我可以做的,可能是用调试视图或任何东西来获取任何信息吗?或者我是索尔?

    1 回复  |  直到 15 年前
        1
  •  6
  •   Nimrand    15 年前

    首先,确保在项目属性的“调试”选项卡中启用了本机代码调试。

    如果您有要调用的dll的源代码,那么您应该能够设置它,这样您就可以像处理托管代码一样进入本机dll。最简单的方法是在同一个解决方案中添加本机dll的源代码,然后链接到该项目的输出。您需要确保Visual Studio可以在运行C应用程序时访问本机dll和该dll的pdb。

    如果没有dll的源代码,那么我建议在调用本机方法之前设置一个断点。然后,让程序继续运行,并在一两秒钟后手动暂停程序。确保您仍在查看调用本机dll的同一线程,然后查看调用堆栈查看器。如果您看到一行显示“[外部代码]”,请确保选中上下文菜单中的“显示外部代码”。如果选中该选项,调用堆栈可能能够告诉您当前正在执行的方法。文本将为灰色,表示该方法位于外部dll中。如果正在进行Windows方法调用,则首先安装Windows符号文件可能会允许调试器向您提供更多信息。( http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx )您还可以暂停并继续调试程序几次,以查看调用堆栈在不同执行点的外观。从这些信息中,您可能能够了解出哪里出了问题。

    另外,尝试传递不同的参数,从最简单的情况开始,看看是否有相同的行为。最后,确保您的所有编组元数据都是正确的。