C# 卸下撞车垃圾

C# 卸下撞车垃圾,c#,command-line,debugdiag,C#,Command Line,Debugdiag,我需要编写一个工具,用于侦听某些目标进程(在客户环境中崩溃),一旦它崩溃,它应该通过启动DebugDiag并向其传递命令行参数来生成转储。代码需要用C语言编写。我已经做了一些编码,但该工具从未检测到启动的进程。 代码如下: static void Main(string[] args) { ManagementEventWatcher startWatch = new ManagementEventWatcher( new WqlEventQuery("SELECT * FRO

我需要编写一个工具,用于侦听某些目标进程(在客户环境中崩溃),一旦它崩溃,它应该通过启动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的方法 @布鲁诺,我用ProcDump实现了你的建议。现在它只工作一次,这意味着当我启动我的目标进程(32位)时,ProcDump也会启动,但我的应用程序是这样的:当我在其中启动一个工作区时,它会启动另一个同名进程,而这次ProcDump无法启动,调试时,我发现它抛出了一个异常,表示32位进程无法调试64位进程,并且我的所有目标进程都是32位的。。。 代码:

使用Procdump.exe。 它是由sysinternals开发的一个完整工具,用于生成 转储、小型转储等。 它可以通过命令行调用 看见

Windows和DebugDiag对此有内置支持()-为什么要重新发明轮子?我知道有内置支持。但是,我不能期望我的客户进行配置。相反,他们应该能够启动一个简单的.exe(即我的代码)并执行必要的操作。这不是降低我的查询级别的确切原因。我并不打算重新发明任何轮子。
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");
    }
}