首页 文章

调试外部程序库? (Visual Studio 2010)

提问于
浏览
3

对于具有使用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会在例外情况下中断,但不幸的是它似乎没有加载断点 . 尝试使用断点时显示以下信息:
breakpoint
模块窗口显示:"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 回答

  • 1

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

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

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

  • 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

    • 创建一个名为exe的新密钥(例如:yourprogram.exe)

    • 在exe下创建一个新的字符串值 . 字符串值的名称是 Debugger ,值为 vsjitdebugger.exe

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

    vsjitdebugger

    选择要调试的Visual Studio实例(或启动一个新实例) . 或者,此时您可以'attach to process',然后使用 No 按钮关闭对话框,让它附加 .

    希望有所帮助 .

  • -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/ .

相关问题