我正在调试我在工作中遇到的一个大型应用程序中的一个明显的并发问题。这个问题在运行了很多(12+)小时后才会在某些性能较低的机器上出现,我从来没有在调试器中复制过它。因此,我的调试工具基本上仅限于分析日志文件。我可以在我的c#应用程序中获得所有线程的堆栈跟踪吗?
C#可以很容易地得到引发异常的线程的堆栈跟踪,但是我想另外获取抛出异常时当前在我的AppDomain中执行的其他每个线程的堆栈跟踪。
这可能吗?
我正在调试我在工作中遇到的一个大型应用程序中的一个明显的并发问题。这个问题在运行了很多(12+)小时后才会在某些性能较低的机器上出现,我从来没有在调试器中复制过它。因此,我的调试工具基本上仅限于分析日志文件。我可以在我的c#应用程序中获得所有线程的堆栈跟踪吗?
C#可以很容易地得到引发异常的线程的堆栈跟踪,但是我想另外获取抛出异常时当前在我的AppDomain中执行的其他每个线程的堆栈跟踪。
这可能吗?
CodePlex上有一个名为Managed Stack Explorer(我相信来自微软)的工具。它使用调试和分析API来捕获正在运行的.Net应用程序中线程的堆栈跟踪,而无需修改应用程序。
您可以在遇到问题之前运行应用程序,然后使用此工具分析它以捕获所有正在运行的线程的当前堆栈跟踪。这种方法的好处是你可以不修改你的应用程序(它可能会改变它的行为),而且这个工具是免费的。
这看起来像是最好的解决方案。如果框架本身在语言中支持它,那肯定会很好,但是...... – 2010-04-27 21:39:05
不要再认为.NET4支持这个功能,即使示例应用程序没有显示在装有.NET4的PC上的列表中。 – angularsen 2012-03-21 11:59:50
我haven't试过这个我自己,但它可能是使用http://www.debuginspector.com/
的发生异常时我建议采取的进程的转储。在你记录异常的地方,调用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 – Charlie 2014-03-17 17:10:35
我只是在前几天寻找这样的东西(并且发现了这个问题:http://stackoverflow.com/questions/190236/how-do-i-make-a-thread-dump-in-在Net-a-LA-JVM线程转储)。看起来你可能不走运,但看到回答这个问题的人不得不说什么,仍然很好。 – 2010-04-27 18:58:46
谢谢丹,我从你的链接问题中抽出一些非常有用的东西... – 2010-04-27 21:39:30