调试在 Visual Studio 之外运行的应用程序

Posted

技术标签:

【中文标题】调试在 Visual Studio 之外运行的应用程序【英文标题】:Debug application running outside Visual Studio 【发布时间】:2012-05-15 11:35:36 【问题描述】:

我使用 VS 2010 Ultimate 开发 C# 应用程序。 通常,这些应用程序会运行很长时间,无需用户交互,当然,它们内部通常也存在错误。

不幸的是,应用程序经常随机崩溃,而您无法重现错误。此外,有时我只有消息“应用程序已停止工作”而没有更多信息。

我可以在客户的机器上安装Visual Studio,但我不能让他运行VS并在调试模式下编译/启动源代码!我需要的是在应用程序启动并崩溃之后启动 VS 。似乎可以这样做,实际上当运行时发生异常时,Windows 会询问您“是否要使用 VS 进行调试?”,但如果我回答“是”,那么 VS 会启动,但根本看不到源代码代码(它也在电脑上),因此我无法检查导致异常的代码行。 VS 只是告诉我“源代码不可用”。其实我无法想象windows怎么能启动VS并知道崩溃的应用程序的源代码在哪里!

有谁知道这个调试场景是如何工作的,以及如何配置它??

非常感谢, 西蒙娜

【问题讨论】:

记录异常详细信息 /callstack 有很长的路要走 How do I use PDB files 的可能重复项 【参考方案1】:

Windbg调试工具解决了目的。

转储进程状态并开始使用 windbg 进行分析。它为您提供异常信息

【讨论】:

嗨 Rockstart,感谢您的建议:只是不知道如何转储进程! 如果您使用的是 WinXP,请使用 ProcessExplorer 创建转储。如果是win7,您可以在任务管理器窗口中右键单击进程并创建转储。请看这里John Robbins's Blog【参考方案2】:

要从已经运行的 Visual Studio 实例进行调试,请选择“调试”菜单项,然后选择“附加到进程...”

接下来,从列表中选择可执行文件,按“附加”(或双击),您现在正在调试应用程序。当您选择“是”并且 Windows 说源代码不可用时,这很可能意味着 PDB 无法加载,因此请确保您已通过在“模块”中检查它来加载模块的符号" 窗口窗格。

【讨论】:

我无法连接到进程,因为当异常发生时,Visual Studio 会启动并自动附加到已崩溃的进程,但这没关系。无论如何,我感谢 Lander,因为我不知道 Modules 面板,而且我在消息“Source not available”下找到了一个链接,上面写着“Find source”:只需单击并找到源文件就可以了!非常感谢! 是的,我相信您一次只能附加一个调试器实例。在抛出异常之前附加,如果你选择中断进程,你可以添加断点和任何你喜欢的东西。【参考方案3】:

如果您想在运行已编译的程序时捕获错误,您应该使用某种日志记录机制。如今,您不必自己编写它,有一个为 .NET 应用程序设计的出色的开源日志记录引擎,它被称为 NLog。它能够将日志保存到文件、电子邮件、控制台或数据库中,几乎可以满足您的所有需求:)。

希望这会有所帮助:)

【讨论】:

谢谢你 Ernestas,我知道 NLog,但是如果我不知道异常发生在哪里,我不知道要记录什么,而且我不能为每个源代码行添加日志行,当然!此外,该软件是多线程的,这使得解释日志输出非常困难,因为它是顺序的......

以上是关于调试在 Visual Studio 之外运行的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

程序在 Visual Studio 之外无法运行

只有在 Visual Studio 之外运行 EXE 时才会出现发布错误

运行 Visual Studio 中托管的调试应用程序和直接运行它有啥区别?

在 Visual Studio 之外启动时程序运行速度较慢

如何在运行时确定您的 C++ 应用程序何时附加了 Visual Studio 调试器?

在 Visual Studio 调试会话期间查找当前目录?