我能获取C#应用程序中所有线程的堆栈跟踪吗?

23

我在公司的一个较大的应用程序上进行调试,发现了一个并发问题。这个问题只会在运行了很长时间(12个以上小时)后在某些性能较低的机器上出现,并且我从未在调试器中重现过它。因此,我的调试工具基本上仅限于分析日志文件。

C#可以轻松获取抛出异常的线程的堆栈跟踪,但我想额外获取在异常被抛出时正在执行的AppDomain中的每个其他线程的堆栈跟踪。

这种情况是否可能?


3
我前几天也在找类似的东西(然后看到了这个问题:https://dev59.com/QHVC5IYBdhLWcg3wxEJ1)。看起来你可能没那么幸运,但很好看到那些回答过这个问题的人是怎么说的。 - Dan Tao
谢谢Dan,我从你链接的问题中找到了一些非常有用的东西... - Drew Shafer
3个回答

7
在CodePlex上有一个名为Managed Stack Explorer的工具(我相信它起源于微软)。它使用调试和分析API来捕获运行中.Net应用程序中线程的堆栈跟踪,而无需修改应用程序。
您可以运行应用程序直到出现问题,然后使用此工具分析以捕获所有运行线程的当前堆栈跟踪。这种方法的好处是您不需要修改应用程序(对其进行仪器化可能会改变其行为),而且该工具是免费的。

这看起来是最好的解决方案。不过,如果框架在语言内部原生支持它,那肯定会更好。 - Drew Shafer
4
不要认为这在.NET4中仍有支持,即使示例应用程序在安装了.NET4的PC上也不会显示在列表中。 - angularsen
我刚发现了这个(尚未尝试)适用于.net4的项目:https://github.com/artisticcheese/MSE/ - Jako

5

当异常出现时,我建议对进程进行转储。在记录异常的同一位置调用下面的 MakeDumpFile() 方法。

这假设您已在存在问题的机器上安装了Windows调试工具

private static void MakeDumpFile()
    {            
        int pid = Process.GetCurrentProcess().Id;
        Console.WriteLine("Creating dump for pid " + pid);

        //path to adplus executable; ensure you have Debugging tools installed;
        string program = @"C:\Program Files (x86)\Debugging Tools for Windows (x86)\adplus.exe";

        //args for adplus; ensure the crashdump folder exists!
        string args = string.Format(@"-hang -p {0} -o c:\crashdump", pid);

        var startInfo = new ProcessStartInfo(program, args);
        startInfo.UseShellExecute = false;
        startInfo.ErrorDialog = false;
        startInfo.CreateNoWindow = true;
        startInfo.RedirectStandardOutput = true;

        var process = Process.Start(startInfo);
        Console.WriteLine("The following is output from adplus");
        Console.WriteLine(process.StandardOutput.ReadToEnd());
        Console.WriteLine("Finished creating dump.");
    }

进入转储目录,您应该会看到一个名为FULLDUMP_something_.dmp的文件夹。

如果您使用.NET4,可以将其拖入VS2010中并检查所有线程或使用并行线程来查看发生了什么(这真是太棒了!)

如果使用NET3.5或更早版本,则需要使用windbg进行分析。请使用以下命令:

~*e !clrstack

来打印所有托管线程的调用堆栈。如果需要更多帮助,请发布回复或在谷歌上搜索教程。


当我安装调试工具时,我发现安装路径为:C:\Program Files\Windows Kits\8.1\Debuggers\x86 - Charlie

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接