对于具有使用Visual Studio 2010调试外部应用程序的经验的程序员来说,这是一个问题 .
目前,我正在开发一个由我工作的人制作的程序的附加组件 . 为了使这个附加组件与外部程序一起工作,我必须将.dll文件放在由外部程序指定的某个文件夹中 . 我已将配置设置配置为自动复制.dll文件 . 我还复制.pdb文件以启用调试选项 .
由于这个附加组件只是一个类库,我不能像通常那样调试它 . 我也没有外部应用程序的源代码 . 我该如何正确调试这个类库?
这是我试过的:
1. Attach to Process
见Attach to a Running Process . 这似乎工作正常,除了设置几秒钟 . 这是一个问题,因为大多数异常/断点发生在外部程序启动的最初几秒 . 将Visual Studio手动附加到进程也很烦人,因为我经常调试这个类库,因此需要花费很多时间 .
2. Debugger.Launch()
目前我使用Debugger.Launch()将Visual Studio附加到外部程序 . 这将显示一个Just In Time提示符,询问我想要使用哪个Visual Studio实例 . 我发现这比"Attach to Process"慢得多,但这样我确信在任何断点发生之前都附加了调试器 . 将其置于 #if DEBUG
和 #end if
之间可确保在创建发布版本时此弹出窗口不显示,这也有帮助 .
3. Add as Existing Project
我已将程序的可执行文件作为项目添加到我的解决方案中 . 通过这样做,我可以将此可执行文件设置为启动项目,按F5将启动它 . 这样做的最大优点是,我现在可以在启动时尽快调试可执行文件 . 见:Debug an Executable Not Part of a Visual Studio Solution . 有了这个,Visual Studio会在例外情况下中断,但不幸的是它似乎没有加载断点 . 尝试使用断点时显示以下信息:
模块窗口显示:"Binary was not built with debug information." . 这可以解决吗?
4. Start Action
SilentDoc指出我还可以使用Properties - > Debug - > Start Action将外部程序设置为启动操作 . 请参阅:Change the Start Action for Application Debugging似乎以这种方式正确加载断点 . 但是,由于某种原因,这会使外部程序在遇到第一个断点/异常时冻结 5 minutes . 冻结后,事情似乎按预期工作 . 什么可能导致这种冻结?
Edit :冻结是由外部程序引起的 . 请参阅接受的答案的评论 .
5. Image File Execution Options
正如hmemcpy建议的那样,我也可以使用"Image File Execution Options"作为Launching the Debugger Automatically . 这似乎与Debugger.Launch()相同,因为它显示相同的Just In Time提示 . 但是,这个Just In Time "debugger"不会只是禁用Just In Time提示 .
Summary
选项1加载断点,断点/异常中断,但需要花费太多时间 .
选项2加载断点,断点/异常中断,但速度太慢 .
选项3在断点/异常时不会中断 .
选项4加载断点,但在第一个断点/异常时冻结5分钟 .
选项5在断点/异常时不会中断 .
Additional information
外部程序和类库都是用VB.NET编写的,我使用的是Visual Studio 2010 Ultimate,目标框架是.NET Framework 4.0 .
选项1和2对我有用,但过了一段时间,所有这些对话框和提示都变得烦人,让我慢下来 . 选项3和4似乎更适合我,所以如果有人能告诉我如何让他们工作,那将是伟大的 . 选项5看起来也不那么有趣,我不想一直使用regedit.exe . 如果还有其他选择,请告诉我 .
3 回答
调试时,无法将该可执行文件设置为启动外部程序吗?
DLL项目 - 属性 - 调试 - 启动外部程序...
编辑 - 对不起,我没有看到你已经这样做了:S
这可能是使用
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
创建一个名为exe的新密钥(例如:yourprogram.exe)
在exe下创建一个新的字符串值 . 字符串值的名称是
Debugger
,值为vsjitdebugger.exe
运行可执行文件时,您将看到Just In Time提示,要求您选择调试器:
选择要调试的Visual Studio实例(或启动一个新实例) . 或者,此时您可以'attach to process',然后使用
No
按钮关闭对话框,让它附加 .希望有所帮助 .
我认为您的方法很好 - 您只需要确保您的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/ .