我有一个在 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++ 专家,无法遵循其他答案。
您想这样做是为了测试您在事件中的日志记录吗?正如 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();
Chromium
具有用于测试目的的内置网址,我相信Edge Chromium
也支持这些网址。使用 WebView2
进行快速测试表明它们按预期工作。有许多不同的选项(我在这里只列出其中的一个子集)。
edge://inducebrowsercrashforrealz
edge://crash
edge://gpucrash
edge://memory-exhaust/
您应该能够在浏览器实例中加载
edge://crashes
以查看生成的所有崩溃报告。
提示:在使浏览器进程崩溃之前,先测试渲染进程和 GPU 进程崩溃。