Я предлагаю снять дамп процесса при возникновении исключения. В том же месте, где вы регистрируете исключение, вызовите метод 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
для печати стека вызовов всех управляемых потоков. Если вам нужна дополнительная помощь, чтобы вернуть Windbg, отправьте сообщение назад или в Google для обучения.