1

当我的应用程序在我的开发 PC 上进入长循环或无限循环时,我会在 VS 调试器中将其中断,它会告诉我它在做什么。我也想在用户 PC 上以简单的方式执行此操作,以帮助调试。

我在想这样的事情:

  • 在应用程序中,运行一个单独的线程,该线程在某种进程间管道上等待,并在收到来自它的任何内容后,记录主线程的当前堆栈跟踪。(使用 Thread.GetCompressedStack() ?)
  • 发送一个帮助 exe,例如break.exe,当它运行时,连接到另一个进程并向管道写入一些东西。

然后,如果用户报告应用程序冻结,我可以告诉他们尝试运行 break.exe。

这是一个好方法吗?

4

2 回答 2

1

你有几个选择。

  • 任务管理器允许您创建任何正在运行的进程的转储。可以在您的开发机器上检查转储。您可以通过将转储加载到调试器中来检查所有线程的堆栈(我建议为此使用 WinDbg/SOS)。此选项不需要在用户计算机上进行任何额外安装。

  • Process Explorer允许您检查正在运行的进程的线程。如果您有一个重复循环,您可以通过查看堆栈来检测它。

  • WinDbg(带有作为框架一部分的 SOS)可以 xcopy 部署到用户机器上。您可以附加到进程并检查或转储进程内存。

于 2012-04-30T14:08:33.980 回答
0

您可以Debug.WriteLine用于输出调试信息。调试输出的文本可以使用例如 Sysinternals 的DbgView来捕获。

或者,您可以为用户制作一个特殊的调试版本,它将所有必要的信息转储到用户的 %APPDATA% 中的一个文件中。

于 2012-04-30T14:10:25.060 回答