【问题标题】:How to debug unmanaged dll in Visual studio, when we dont have source for that dll?当我们没有该 dll 的源时,如何在 Visual Studio 中调试非托管 dll?
【发布时间】:2013-08-22 07:16:16
【问题描述】:

在我的应用程序中,我使用的是第三方 dll,并且我没有任何可用的源代码。 现在我在 Windows7 操作系统中遇到了异常,所以我想调试并知道确切的原因是什么。

Reflector 在这种情况下不会帮助我,因为它是一个非托管的 dll。并且反编译器在传递这个 dll(源代码提取)时出错。

要在 Visual Studio 中调试,它需要 PDB 文件和 .pdb 只能从源代码生成。

在调试部分我选择了“启用本机代码调试选项”,在安全部分我选择了作为部分受信任的应用程序的选项来消除异常。

我无法得出结论,可能是什么问题,除了上述之外没有任何想法,如何解决?

据我所知,如果我们没有可用的源代码,我们无法调试非托管 dll。

如果我们有任何相关技术,请任何人提出建议。

我的思考过程:如果我能获得关于哪个 API 失败的运行时信息,我可以选择替代 API 并解决问题。

提前致谢。

问候, 湿婆。

【问题讨论】:

  • 没有调试符号就无法调试。除非你不懂反汇编程序。你从谁那里得到的dll?他们或许能提供帮助。如果你存根 3rd 方的东西,你会得到类似的错误 - 你确定这不是你的代码吗?
  • 可以在 VS 中调试没有源代码的本地代码就好了。它需要一定程度的组装知识,但这应该不是问题……(至少不是可以在 SO 上解决的问题)。
  • @doctorlove:是的,它是一个第三方 dll 和源代码对他们来说是专有的,我不能向他们索要源代码。到目前为止,我们在 Windows XP 中使用这个 dll,它工作正常。现在我们开始测试在Windows7开始崩溃。因此,有了你们所有的建议,我可以将问题报告给第三方并要求他们解决。
  • @AlexeiLevenkov:我对这个 dll 感到不满。所以我的意图是让我们不要依赖那个 dll 并在 .Net 中编写我自己的代码。但结果应该是一样的。如果我可以调试里面的 dll,我可以得到使用的技术,所以我可以写类似的行。我同意你的观点,我们仍然有机会使用汇编代码。
  • 向图书馆的创建者报告是您最安全的选择。请注意,调试和逆向工程之间的界限非常细——在尝试“使用技术,这样我可以用类似的方式编写”之前咨询律师可能是个好主意。

标签: c# dll com visual-studio-debugging


【解决方案1】:

当然你可以调试它。您可以很好地单步执行汇编代码并检查寄存器的状态等。

您似乎真的想通过检查和执行原始源代码来进行调试。如果没有源代码,这显然是不可能的,因为通常不可能从优化的本机可执行文件对源代码进行逆向工程(可以对功能等效的代码进行逆向工程,但这可能与原始源代码大不相同)。本机 dll 通常不包含符号(类、函数、成员等)的名称,但导出的除外,因此无法创建例如带有方法名称的友好堆栈跟踪。

除此之外,即使你有源代码,如果没有符号文件 (.pdb) 也是无用的,因为 pdb 包含有关原始源代码和编译指令之间映射的数据,以及其他信息(符号名称、优化信息等)。

但是,如果您有 pdb 文件但没有源代码,则使用汇编代码进行调试并不难(好吧,这也不是那么容易 :)。这 2 篇文章(http://www.microsoft.com/msj/0298/hood0298.aspxhttp://www.microsoft.com/msj/0698/hood0698.aspx)有足够的信息来调试您可能需要的大多数常见情况。

【讨论】:

  • 非常感谢 Zdeslav,因为您的解释和提供的链接让我更清楚地了解了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2010-12-17
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多