3

这是针对有使用 Visual Studio 2010 调试外部应用程序经验的程序员的问题。

目前,我正在为我工​​作的人制作的程序开发一个附加组件。为了使这个附加组件与外部程序一起工作,我必须将 .dll 文件放在外部程序指定的某个文件夹中。我配置了构建设置,以便自动复制 .dll 文件。我还复制 .pdb 文件以启用调试选项。

由于这个插件只是一个类库,我不能像往常一样调试它。我也没有外部应用程序的源代码。我应该如何正确调试这个类库?

这是我尝试过的:

1. 附加到进程
请参阅附加到正在运行的进程。这似乎工作正常,除了需要几秒钟来设置。这是一个问题,因为大多数异常/断点发生在外部程序启动的最初几秒钟。手动将 Visual Studio 附加到进程也很烦人,因为我经常调试这个类库,因此一段时间后会花费很多时间。

2. Debugger.Launch()
目前我使用Debugger.Launch()将 Visual Studio 附加到外部程序。这将显示一个 Just In Time 提示,询问我要使用哪个 Visual Studio 实例。我发现这比“附加到进程”要慢得多,但这样我确信调试器在任何断点发生之前就已附加。将其放置在两者之间#if DEBUG#end if确保在我创建发布版本时不会显示此弹出窗口,这也有帮助。

3. 添加为现有项目
我已将程序的可执行文件作为项目添加到我的解决方案中。通过这样做,我可以将此可执行文件设置为启动项目,然后按 F5 将启动它。这样做的最大优点是,我现在可以在可执行文件启动后立即对其进行调试。请参阅:调试不属于 Visual Studio 解决方案的可执行文件。有了这个,Visual Studio 在异常处中断,但不幸的是它似乎没有加载断点。当我尝试使用断点时,会显示以下信息: 断点 模块窗口显示:“二进制文件未使用调试信息构建。”。这可以解决吗?

4. 启动动作
SilentDoc 注意到我也可以设置一个外部程序作为启动动作,使用属性 -> 调试 -> 启动动作。请参阅:更改应用程序调试的启动操作它似乎以这种方式正确加载断点。但是,由于某种原因,这会使外部程序在遇到第一个断点/异常时冻结5 分钟。完成冻结后,事情似乎按预期工作。什么可能导致这种冻结?

编辑:冻结是由外部程序引起的。请参阅已接受答案的评论。

5. Image File Execution Options
正如 hmemcpy 所建议的,我也可以使用“Image File Execution Options”来自动启动调试器。这似乎与 Debugger.Launch() 相同,因为它显示相同的 Just In Time 提示。然而,这个即时“调试器”根本不调试:断点和异常被忽略。此外,在使用发布版本时,我不能简单地禁用 Just In Time 提示。

摘要
选项 1 加载断点,在断点/异常处中断,但需要太多时间。
选项 2 加载断点,在断点/异常处中断,但是太慢了。
选项 3 不加载断点,也不会在断点/异常处中断。
选项 4 加载断点,但在第一个断点/异常处冻结 5 分钟。
选项 5 不加载断点,也不会在断点/异常处中断。

附加信息
外部程序和类库都是用VB.NET编写的,我使用的是Visual Studio 2010 Ultimate,目标框架是.NET Framework 4.0。

选项 1 和 2 对我有用,但一段时间后,所有这些对话框和提示都会变得烦人,并减慢我的速度。选项 3 和 4 似乎更适合我,所以如果有人能告诉我如何让它们工作,那就太好了。选项 5 似乎也不那么有趣,我不想一直使用 regedit.exe。如果还有其他选择,请告诉我。

4

3 回答 3

1

调试时不能将该可执行文件设置为启动外部程序吗?

Dll项目-属性-调试-启动外部程序...

编辑 - 对不起,我没有看到你已经这样做了:S

于 2012-09-28T09:11:32.017 回答
1

Image File Execution Options这可能是使用可能有用的少数情况之一。我最喜欢的在程序启动时附加调试器的技巧之一。它是一个注册工具,除其他外,它允许您在应用程序执行之前将调试器附加到应用程序。例如,同样的技巧允许用Process ExplorerNotepad2Notepad.exe替换您的 Windows 任务管理器。

您可以在此处阅读所有相关信息。

以下是您的设置方式:

  • regedit.exe
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  • 创建一个名为您的 exe 的新密钥(例如:yourprogram.exe)
  • 在您的 exe 下创建一个新的字符串值。字符串值的名称是Debugger,值是vsjitdebugger.exe

运行可执行文件时,您将看到 Just In Time 提示,要求您选择调试器:

vsjit调试器

选择要调试的 Visual Studio 实例(或启动一个新实例)。或者,此时您可以“附加到进程”,然后使用No按钮关闭对话框,让它附加。

希望有帮助。

于 2012-10-08T09:28:49.590 回答
-1

我认为您的方法很好 - 您只需要确保您的 dll 文件包含有关其 PDB 文件的信息(例如,使用dumpbin /pdbpath:verbose <your dll>),并且 PDB 文件中的源路径在您的调试机器上是有效的(例如,使用, srctool -r <your pdb>)。将 PDB 文件放在 dll 文件旁边也应该正常工作。

前段时间我写了一篇文章,描述了使用 PDB 文件的这些工具和其他工具,所以它可能对你有用:http: //lowleveldesign.wordpress.com/2011/12/09/pdb-file-out-of-调试器/

于 2012-09-28T12:17:38.873 回答