对于具有使用Visual Studio 2010调试外部应用程序的经验的程序员来说,这是一个问题。
目前,我正在开发一个由我工作的人制作的程序的附加组件。为了使这个附加组件与外部程序一起工作,我必须将.dll文件放在由外部程序指定的某个文件夹中。我已将配置设置配置为自动复制.dll文件。我还复制.pdb文件以启用调试选项。
由于这个附加组件只是一个类库,我不能像通常那样调试它。我也没有外部应用程序的源代码。我该如何正确调试这个类库?
这就是我的尝试:
1。附加到流程
见Attach to a Running Process。这似乎工作正常,除了设置几秒钟。这是一个问题,因为大多数异常/断点发生在外部程序启动的最初几秒。将Visual Studio手动附加到进程也很烦人,因为我经常调试这个类库,因此花了很长时间。
2。 Debugger.Launch()
目前,我使用Debugger.Launch()将Visual Studio附加到外部程序。这将显示一个Just In Time提示符,询问我想要使用哪个Visual Studio实例。我发现这比“附加到进程”要慢得多,但这样我确信在任何断点发生之前都附加了调试器。将其置于#if DEBUG
和#end if
之间可确保在创建发布版本时不显示此弹出窗口,这也有帮助。
第3。添加为现有项目
我已将程序的可执行文件作为项目添加到我的解决方案中。通过这样做,我可以将此可执行文件设置为启动项目,按F5将启动它。这样做的最大优点是,我现在可以在启动时尽快调试可执行文件。见:Debug an Executable Not Part of a Visual Studio Solution。有了这个,Visual Studio会在例外情况下中断,但不幸的是它似乎没有加载断点。我尝试使用断点时会显示以下信息:
模块窗口显示:“Binary未使用调试信息构建。”。这可以解决吗?
4。开始行动
SilentDoc指出我也可以使用Properties - >将外部程序设置为启动操作。调试 - >开始行动。请参阅:Change the Start Action for Application Debugging似乎以这种方式正确加载断点。但是,出于某种原因,这会使外部程序在遇到第一个断点/异常时冻结 5分钟。冻结后,事情似乎按预期工作。什么可能导致这种冻结?
编辑:冻结是由外部程序引起的。请参阅接受的答案的评论。
5。图像文件执行选项
正如hmemcpy建议的那样,我也可以使用Launching the Debugger Automatically的“图像文件执行选项”。这似乎与Debugger.Launch()相同,因为它显示相同的Just In Time提示。但是,这个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。如果还有其他选择,请告诉我。
答案 0 :(得分:1)
调试时无法将该可执行文件设置为启动外部程序吗?
Dll项目 - 属性 - 调试 - 启动外部程序...
编辑 - 对不起,我没见过你已经这样做了:S
答案 1 :(得分:1)
这可能是使用Image File Execution Options
可能有帮助的极少数情况之一。我最喜欢在程序启动时附加调试器的技巧之一。它是一个注册工具,允许您在执行之前将调试器附加到应用程序。例如,使用Process Explorer替换Windows任务管理器,或Notepad2替换Notepad.exe
。
您可以阅读所有相关内容here。
以下是您的设置方式:
regedit.exe
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
Debugger
,值为vsjitdebugger.exe
运行可执行文件时,您将看到Just In Time提示,要求您选择调试器:
选择要调试的Visual Studio实例(或启动一个新实例)。或者,您可以附加到流程'此时,然后使用No
按钮关闭对话框,让它附加。
希望有所帮助。
答案 2 :(得分:-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-debugger/。