这是针对有使用 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。如果还有其他选择,请告诉我。