You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WPF中让WebView2进程崩溃以生成崩溃报告?

仅让WebView2进程崩溃生成转储的实现方法

方法一:通过页面脚本触发渲染进程崩溃

WebView2的渲染进程独立于WPF主进程,你可以调用Chromium内置的调试方法触发崩溃,只会影响WebView2进程,还能触发CoreWebView2.ProcessFailed事件:

// 需确保CoreWebView2已完成初始化
await webView2.CoreWebView2.ExecuteScriptAsync("window.crash()");

window.crash()是Chromium提供的调试接口,执行后会直接让WebView2的渲染进程崩溃,主进程不受影响,同时会触发ProcessFailed事件,方便后续处理。

方法二:通过Windows API终结WebView2进程

先获取WebView2的进程ID,再调用Windows API模拟崩溃终止进程:

1. 获取WebView2进程ID

// 获取WebView2关联的进程ID
int webViewProcessId = webView2.CoreWebView2.ProcessId;

2. 调用Windows API终止进程

引入Win32 API的P/Invoke声明,然后执行终止操作:

using System.Runtime.InteropServices;

public static class Win32ProcessApi
{
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);

    [DllImport("kernel32.dll")]
    public static extern bool CloseHandle(IntPtr hObject);
}

// 执行崩溃操作
const uint PROCESS_TERMINATE = 0x0001;
const uint STATUS_ACCESS_VIOLATION = 0xC0000005; // 模拟访问违例崩溃

IntPtr processHandle = Win32ProcessApi.OpenProcess(PROCESS_TERMINATE, false, webViewProcessId);
if (processHandle != IntPtr.Zero)
{
    // 用访问违例的错误码终止进程,模拟真实崩溃
    Win32ProcessApi.TerminateProcess(processHandle, STATUS_ACCESS_VIOLATION);
    Win32ProcessApi.CloseHandle(processHandle);
}

配置系统自动生成崩溃转储

要让Windows自动保存WebView2的崩溃转储,需配置系统错误报告:

  • 打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
  • 若不存在LocalDumps项,右键新建项并命名为LocalDumps
  • 在LocalDumps下添加以下值:
    • 字符串值DumpFolder:设置转储保存路径(如C:\WebView2CrashDumps)
    • DWORD值DumpType:设为1(小型转储)或2(完整转储)
    • DWORD值DumpCount:设置保留的转储文件数量

说明

  • 你之前用的System.Environment.FailFast是让整个WPF主进程崩溃,所以会导致应用退出,无法单独影响WebView2进程。
  • 之前报错OpenProcess未识别,是因为你直接在PowerShell中执行了C++ API函数名,它不是PowerShell命令,需要通过C#的P/Invoke方式调用。

内容的提问来源于stack exchange,提问作者Riyafa Abdul Hameed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:06:19