在Visual Studio中调试第三方DLL?

我正在使用第三方DLL。 对于某些特定情况,DLL中的函数抛出exception。 是否可以在Visual Studio中调试DLL?

在Andrew Rollings的回答之后,我能够查看代码,但有没有简单的方法来调试Visual Studio中的代码?

如果DLL是.NET语言,您可以使用.NET Reflector等工具对其进行反编译,然后针对源代码进行调试。

或者您可以询问供应商是否有源代码。 这可能是最简单的方法。

在Andrew的答案的基础上,您只需将反编译的源代码视为项目中的新库,并在源代码中设置断点。 删除对第三方DLL的所有引用,以便它是正在执行的反编译代码。

其他事情:

  • 您可能通过反编译代码或违反与第三方供应商的许可协议来违法。 务必与某人一起审核。
  • 如果要发送给其他开发人员,或者检查更大的源代码树,则需要确保删除对反编译版本的引用。 容易忘记这个!

我遇到过两种方法:

1)从使用项目访问DLL项目。 这涉及在Visual Studio的单独实例中构建DLL,然后通过Visual Studio中的不同项目访问DLL(假设您拥有源代码)。 有很多方法可以实现这个目标:

  • 您可以在DLL中添加Trace.WriteLine语句,这些语句将显示在Visual Studio的“输出”窗口中。
  • 您可以将System.Diagnostics.Debugger.Break()语句添加到DLL代码中。 在Visual Studio中运行调用项目时,程序执行将停在那里。 从这里你可以添加访问调用堆栈(包括DLL本身中的所有函数调用)并设置断点(尽管断点的图标将显示为禁用,断点的hover文本将显示为“断点当前不会被命中。此文档未加载任何符号“)。
  • 如果DLL抛出exception(如果DLL捕获并处理exception,您可以从“输出”窗口中看到),您可以告诉Visual Studio在抛出该类型的exception时始终中断。 按Ctrl + Alt + E ,找到要抛出的exception类型,然后单击该exception的“投掷”列。 从这里开始就像使用了System.Diagnostics.Debugger.Break() (见上文)。

2)将使用过程附加到DLL项目。 这涉及将Visual Studio调试器挂钩到正在运行的进程中。

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

调试几个第三方库以及.NET本身对我有用的东西是WinDbg 。 它是微软的一个很棒的调试器,我用它来解决框架内部发生的一些棘手的问题。

如果它是托管DLL,则需要使用Son of Strike (SOS)扩展。 它也可以调试本机。 您需要了解一些关于callstacks和assembly / CIL指令的信息,以便善于使用它。 您应该能够确定exception以及导致exception的原因。 我们使用WinDbg / SOS来查找例如在HttpWebResponse中,如果您使用Gzip压缩下载页面并且服务器返回错误的Gzip标头,.NET会在线程池中运行解压缩,崩溃将取消您的进程。 快乐的调试。

正如Cesar Reyes在Stack Overflow问题中提到的Visual Studio – 附加源代码以供参考 , ReSharper 5(及更高版本)具有此function。

.NET Reflector 6附带一个Visual Studio Addin,允许您在没有源代码的程序集上使用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

我以为.NET Reflector得到了一些调试插件。 这是一个更好的主意,因为反编译和重新编译代码通常会失败,并且您需要对代码进行很多更改才能修复它。

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

我们在这里应该提到的另一个选项是dotPeek 1.2(来自ReSharper创建者的免费反编译器)。 这篇文章描述了如何配置VS符号服务器和dotPeek 1.2来调试VisualStudio中的反编译代码: http ://blog.jetbrains.com/dotnet/2014/04/09/introducing-dotpeek-1-2-early- 访问程序