我正在調試我在工作中遇到的一個大型應用程序中的一個明顯的併發問題。這個問題在運行了很多(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