2014-07-07 21 views
0

我正在向最终用户交付软件。我的软件由MFC和C#组成。当任何进程崩溃时,我会自动写入完整转储到我的日志文件夹。我想运行另一个嗅探日志文件夹的进程,并分析转储是否存在写入该文件夹的任何.dmp文件。如何在Windows环境中生成故障转储分析报告

我知道在WinDbg的帮助下,我们可以手动分析转储文件,如果我们有所有的符号。 但我想要自动执行此过程。 我可以从我的代码中调用windbg来分析我的转储吗?

E.g. int i=1/0 上面代码中的代码崩溃了。我得到了转储文件。 现在我应该看到一条消息,那个特定的行导致了这个问题。

+0

那么,对于C#来说,这非常简单 - 只需处理异常。通常情况下,只要你能够合理地处理它(即它不影响应用程序的状态),你可以做到这一点,但你也可以有一个全局的未处理的异常处理程序('Application.ThreadException'和'AppDomain .CurrentDomain.UnhandledException')。即使没有转储,这通常也足以发现错误。如果你发现自己不得不进行自动转储分析,那么你的错误处理代码就会变味,在.NET中更是如此。在本地主机上,您可以在代码中的任何未处理的异常上附加调试器。 – Luaan

+0

欢迎使用Stackoverflow。当我编写答案时,我意识到它不符合Stackoverflow规则,因为:a)它显示很少研究工作。你可能已经发现如何启动WinDbg并传递命令行参数。 b)范围太广泛。有很多方法可以实现你想要的。 c)要回答这个问题(提供你真正需要的)或者太简单(严格回答你的问题,它只是一个“是”)就太难了。请阅读旅程,熟悉StackOverflow,您将来可以从中受益。 –

回答

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,它可以将完整转储写入磁盘供以后分析。