在Visual Studio中调试第三方DLL?

19

我正在使用第三方DLL。 在某些特定情况下,DLL中的一个函数会抛出异常。 我能够在Visual Studio中调试DLL吗?

在获得Andrew Rollings的回答后,我可以查看代码,但是否有任何简单的方法在Visual Studio中通过代码进行调试?


1
把代码提取到文件中,将它们添加到一个dll项目中并重新编译dll。 将此项目添加到您的解决方案中,并更改引用以指向该项目。 然后您就可以进行调试了。 - Andrew Rollings
我有一个类似的问题。所有的资源都属于我,但我不能只是将它们添加到引用项目中。涉及到超过20个项目...而且下面的解决方案都没有真正帮助到我。 - TimothyP
8个回答

17
如果DLL是用.NET语言编写的,您可以使用像.NET Reflector这样的工具反编译它,然后针对源代码进行调试。
或者您可以向供应商询问是否有源代码可用。那可能是最简单的方法。

这是一个 .Net 的 dll 文件,我有一个反编译器,让我试一下。谢谢。 - Biswanath
2
NET Reflector 6附带了一个Visual Studio插件,让您可以在没有源代码的程序集上使用Visual Studio的逐步调试。 - Jeeva Subburaj

6
建立在Andrew的回答基础上,您只需将反编译的源代码作为项目中的新库对待,并在源代码中设置断点。删除所有对第三方DLL的引用,以便执行的是反编译的代码。
其他注意事项:
- 反编译代码可能违反法律或违反与第三方供应商的许可协议。一定要与有关人员进行审查。 - 如果您向其他开发人员进行交付或将其检入更大的源代码树中,请确保删除对反编译版本的引用。很容易忘记这一点!

3
提高对违法或违反许可协议可能性的意识,点赞(+1)。 - JeffH

4

我找到了两种方法:

1) 从使用项目访问DLL项目。 这需要在Visual Studio的不同项目中构建DLL,并通过另一个项目访问DLL(假设您有源代码)。 有多种方法可以实现此目标:

  • 您可以在DLL中添加Trace.WriteLine语句,它们将显示在Visual Studio的“输出”窗口中。
  • 您可以在DLL代码中添加System.Diagnostics.Debugger.Break()语句。当在Visual Studio中运行调用项目时,程序执行将停止在此处。 从这里,您可以访问调用堆栈(包括DLL本身中的所有函数调用)并设置断点(尽管断点图标将显示为禁用状态,而悬停文本的断点将读取“当前不会命中断点。未为此文档加载任何符号”)。
  • 如果DLL引发异常(如果异常被DLL捕获和处理,则可以从“输出”窗口中看到),则可以告诉Visual Studio始终在抛出该类型的异常时中断。 按下Ctrl + Alt + E,找到正在抛出的异常类型,并单击该异常的“Throw”列。从这里开始,就像您使用了System.Diagnostics.Debugger.Break()一样(参见上面)。

2) 将使用进程附加到DLL项目。 这需要将Visual Studio调试器钩入运行中的进程。

  • 在Visual Studio中打开DLL项目。
  • 运行使用DLL的应用程序(由于该进程已经有一个调试器附加到它,因此无法从另一个Visual Studio实例中运行此应用程序)。
  • 从这里,您可以添加断点并逐步执行在Visual Studio中加载的DLL代码(尽管断点将显示为禁用状态,与方法1相同)。

3

3

对我有用的一些调试第三方库以及 .NET 本身的方法是使用 WinDbg。这是微软提供的一个很棒的调试器,我用它来解决了一些深层次的框架问题。

如果是托管 DLL,你需要使用 Son of Strike (SOS) 扩展。它也可以调试本机代码。你需要了解一些关于调用堆栈和汇编/CIL 指令的知识,才能更好地使用它。你应该能够确定异常以及导致异常的原因。我们曾经使用 WinDbg/SOS 发现,在 HttpWebResponse 中,如果你使用 Gzip 压缩下载页面,而服务器返回了错误的 Gzip 头,.NET 将在线程池中运行解压缩操作,并且可能会导致进程崩溃。祝你调试愉快。


我认为这个解决方案可能对于OP的问题来说有些过度,但对于像内存泄漏、IIS中的随机崩溃等严重错误来说确实非常有益。无论如何,这是一个不错的答案,只有我们中的少数人在这些日子里使用它哈哈。 - yakya

1

0

我认为.NET Reflector有一些调试插件。这将是一个更好的想法,因为反编译和重新编译代码通常会失败,并且您需要在代码中进行许多更改才能修复它。

尝试使用.NET Reflector调试器。它可能会对您有很大帮助。


0

.NET Reflector 6附带了一个Visual Studio插件,让您可以在没有源代码的程序集上使用Visual Studio的逐步调试功能。

请查看此博客文章:

http://www.simple-talk.com/community/blogs/alex/archive/2009/09/22/74919.aspx 以获取更多详细信息。

这仍然是一个非常早期的版本。因此不能保证它会正常工作,并且可能会破坏您的Visual Studio配置或项目配置。确保您对使用此插件的任何项目进行备份(或源代码控制)。

下载链接: http://www.red-gate.com/MessageBoard/viewforum.php?f=109


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接