我正在向最终用户发送软件。我的软件包含MFC和C#。当任何进程崩溃时,我会自动将完全转储写入我的日志文件夹。我想运行另一个进程,它会嗅探日志文件夹并分析转储,如果有任何.dmp文件写入此文件夹。
我知道在WinDbg的帮助下,如果我们有所有符号,我们可以手动分析转储文件。 但我想要自动化这个程序。 我可以从我的代码中调用windbg来分析我的转储吗?
E.g。 int i=1/0
代码上面的行崩溃了代码。我得到了转储文件。
现在我应该看到一条消息,该特定行引起了这个问题。
答案 0 :(得分:0)
您想要运行监视该文件夹的应用程序,因此请查看FileSystemWatcher class (MSDN)。
接下来,您要通过调用WinDbg来分析转储。您可以使用Process.Start() (MSDN)启动WinDbg。您可以使用-z
命令行参数将转储名称传递给WinDbg。此外,您可以传递-c
命令行参数来运行一些命令。使用$<
,$>
,$><
或$$><
,您甚至可以运行驻留在另一个文件中的命令。请注意,对于此方法,您的用户需要安装WinDbg,并且您需要知道它在文件系统中的位置。您可能无法在您的应用程序中运送WinDbg,因为这是一个许可问题。总而言之,这不是一个很好的方法。
更好的选择是使用DbgHelp functions (MSDN)直接对转储文件进行操作,而不依赖于完整的WinDbg包。但是,这可能会导致很多工作,特别是因为您需要确定它是本机异常(MFC部分)还是.NET异常。在任何情况下,要获取行号,您需要运送应用程序的PDB。
更简单的方法是在程序级别捕获异常并输出您需要的任何内容。在许多情况下,这应该足以诊断问题。在代码的最后,我只是抛出异常,以便程序实际崩溃,你仍然可以生成崩溃转储,以防你需要它。
请注意,此代码有点危险,因为File.WriteAllText()
可能无法在所有情况下使用,例如在OutOfMemoryException的情况下,如果该目录不存在或MFC部分已损坏您的内存。您可能还需要调整此代码以输出InnerException
属性中的信息,以免丢失详细信息。
static void Main(string[] args)
{
try
{
RunMyApp();
}
catch (Exception e)
{
File.WriteAllText(exceptionLogFilename,
"Type: {0}\r\nMessage: {1}\r\nStacktrace:{2}\r\n",
e.GetType().ToString(),
e.Message,
e.StackTrace);
throw;
}
}
也许你再想一想:我期待多少例外?我不能手动在调试器中分析它吗?我真的需要自动分析吗?如果我进行自动分析,我的工具是否足够强大以处理所有情况?或者我最终还会遇到使用调试器的情况?
另一个提示:从您的问题描述看来,您已经实现了自己的未处理异常处理程序。我认为这种方法有点过时,因为我们有Windows Error Reporting LocalDumps,它可以将完整的转储写入磁盘供以后分析。