【问题标题】:Can I get the stack traces of all threads in my c# app?我可以在我的 c# 应用程序中获取所有线程的堆栈跟踪吗?
【发布时间】:2010-04-27 18:47:58
【问题描述】:

我正在调试我在工作中破解的大型应用程序中的一个明显的并发问题。有问题的错误仅在运行许多(12 多个)小时后才出现在某些性能较低的机器上,而且我从未在调试器中重现它。因此,我的调试工具基本上仅限于分析日志文件。

C# 可以轻松获取引发异常的线程的堆栈跟踪,但我还想另外获取在引发异常时在我的 AppDomain 中当前正在执行的每个其他线程的堆栈跟踪。

这可能吗?

【问题讨论】:

  • 前几天我自己也在寻找类似的东西(遇到了这个问题:stackoverflow.com/questions/190236/…)。看起来你可能不走运,但还是很高兴看到那些回答这个问题的人不得不说什么。
  • 谢谢丹,我从你的链接问题中提取了一些非常有用的东西......

标签: c# multithreading debugging concurrency stack-trace


【解决方案1】:

CodePlex 上有一个名为Managed Stack Explorer 的工具(我相信它源自微软)。它使用调试和分析 API 来捕获正在运行的 .Net 应用程序中线程的堆栈跟踪,而无需修改应用程序。

您可以运行您的应用程序,直到您遇到问题,然后使用此工具对其进行分析,以捕获所有正在运行的线程的当前堆栈跟踪。这种方法的好处是您的应用程序无需修改(检测它可能会改变其行为),并且该工具是免费的。

【讨论】:

  • 这看起来是最好的解决方案。如果框架在语言中原生支持它当然会很好,但是......
  • 不要认为 .NET4 不再支持这一点,即使是示例应用程序也不会出现在安装了 .NET4 的 PC 的列表中。
  • 我刚刚为 .net4 找到了这个(尚未尝试):github.com/artisticcheese/MSE
【解决方案2】:

我建议在发生异常时转储进程。在您记录异常的同一位置调用 MakeDumpFile() 方法,如下所示。

这假设您在有问题的机器上安装了 Debugging Tools For 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

打印所有托管线程的调用堆栈。如果您需要更多帮助让 windbg 回帖或谷歌获取教程。

【讨论】:

  • 我在安装调试工具的时候发现安装路径是:C:\Program Files\Windows Kits\8.1\Debuggers\x86
【解决方案3】:

我自己没有尝试过,但它可能有用http://www.debuginspector.com/

【讨论】:

    猜你喜欢
    • 2012-06-27
    • 2014-03-30
    • 1970-01-01
    • 2019-11-05
    • 2010-09-17
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多