我需要编写一个工具,监听一些目标进程(在客户环境中崩溃),一旦崩溃,它应该通过启动DebugDiag生成转储,并将命令行参数传递给它。代码需要用C#编写。我已经完成了一些编码,但该工具从未检测到启动的过程。 这是代码:
static void Main(string[] args)
{
ManagementEventWatcher startWatch = new ManagementEventWatcher(
new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
startWatch.EventArrived
+= new EventArrivedEventHandler(startWatch_EventArrived);
startWatch.Start();
Console.WriteLine("Press ENTER to exit");
Console.ReadLine();
startWatch.Stop();
}
static void startWatch_EventArrived(object sender, EventArrivedEventArgs e)
{
string name = e.NewEvent.Properties["ProcessName"].Value as string;
Console.WriteLine("Process started: {0}", name);
if (name != null && name.Contains("My Process.exe"))
{
string procpath = "C:\\Program Files\\DebugDiag";
string filename = Path.Combine(procpath, "DbgHost.exe");
var proc = System.Diagnostics.Process.Start(filename, "-dump My Process.exe");
}
}
还请告知这是否是将命令行参数传递给DebugDiag的方法 @Bruno,我使用ProcDump实现了你的建议。现在它工作一次,这意味着当我启动我的目标进程(32位)时,ProcDump也会启动,但是我的应用程序是这样的,当我在其中启动工作区时,它会启动另一个具有相同名称的进程,这次ProcDump失败了,在调试时我发现它引发了一个异常,说32位进程无法调试64位进程,而我的所有目标进程都只是32位... 代码:
static void startWatch_EventArrived(object sender, EventArrivedEventArgs e)
{
string name = e.NewEvent.Properties["ProcessName"].Value as string;
Console.WriteLine("Process started: {0}", name);
if (name != null && name.Contains("MyProcess.exe"))
{
string procpath = "C:\\Procdump";
string filename = Path.Combine(procpath, "procdump.exe");
var proc = System.Diagnostics.Process.Start(filename, "-e -f -mp -n 25 -w -accepteula MyProcess.exe MyProcess_crash");
}
}
答案 0 :(得分:3)
使用Procdump.exe。 它是由sysinternals开发的完整工具 dump,minidump等。 它可以通过命令行调用 看到 https://technet.microsoft.com/en-us/sysinternals/dd996900.aspx