如何在wpf中崩溃webview2以生成崩溃报告?

问题描述 投票:0回答:2

我有一个在 wpf 中运行的 webview。如何仅使 webview 进程崩溃以在 Windows 上生成故障转储?

我愿意在 C# 代码中或通过外部 API 执行此操作。我尝试使用以下代码尝试使进程崩溃:

System.Environment.FailFast("Error happened")

但它似乎退出整个应用程序,而不仅仅是 webview2 进程,并且似乎没有调用 CoreWebView2.ProcessFailed 事件

我还尝试按照this答案中的方法从外部崩溃进程,但收到错误:

The term 'OpenProcess' is not recognized as the name of a cmdlet, function,
。我不是 C++ 专家,无法遵循其他答案。

c# .net wpf windows webview2
2个回答
0
投票

您想这样做是为了测试您在事件中的日志记录吗?正如 Jimi 建议的那样,您可以终止应用程序使用的 WebView2 进程之一,并且将引发该事件。

我不建议在生产中使用此代码,但这里有一个示例。

var currentProcess = Process.GetCurrentProcess();
var wv2Processes = Process.GetProcessesByName("msedgewebview2");

foreach (var process in wv2Processes) 
{
    //Make sure its one that belongs to our application!
    var parentProcessId = GetParentProcessId(process.Id);

    if (parentProcessId == currentProcess.Id)
    {
        process.Kill(); //This will cause the CoreWebView2 ProcessFailed event to fire
        return;
    }
}

以及获取父进程的方法。

int GetParentProcessId(int processId)
{
    using (var process = Process.GetProcessById(processId))
    using (var query = new ManagementObjectSearcher($"SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {processId}"))
    using (var queryCollection = query.Get())
    {
        foreach (var mo in queryCollection)
        {
            return Convert.ToInt32(mo["ParentProcessId"]);
        }
        return 0;
    }
}

希望这有用!

编辑:

看来我把它弄得太复杂了,并且 Web 视图实例已经提供了进程 ID。

var processToKill = Process.GetProcessById((int)webView.CoreWebView2.BrowserProcessId);
processToKill.Kill();

0
投票

Chromium
具有用于测试目的的内置网址,我相信
Edge Chromium
也支持这些网址。使用
WebView2
进行快速测试表明它们按预期工作。有许多不同的选项(我在这里只列出其中的一个子集)。

  • 浏览器进程崩溃:
    edge://inducebrowsercrashforrealz
  • 渲染器进程崩溃:
    edge://crash
  • GPU 进程崩溃:
    edge://gpucrash
  • 内存不足:
    edge://memory-exhaust/

您应该能够在浏览器实例中加载

edge://crashes
以查看生成的所有崩溃报告。

提示:在使浏览器进程崩溃之前,先测试渲染进程和 GPU 进程崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.