fix(chat): persist packaged renderer diagnostics

This commit is contained in:
2977094657
2026-03-16 15:53:11 +08:00
Unverified
parent 64c3e5e826
commit 7c5a18a3b5
5 changed files with 187 additions and 0 deletions
+37
View File
@@ -1359,6 +1359,34 @@ function getRendererConsoleLogPath() {
}
}
function getRendererDebugLogPath() {
try {
const dir = app.getPath("userData");
fs.mkdirSync(dir, { recursive: true });
return path.join(dir, "renderer-debug.log");
} catch {
return null;
}
}
function appendRendererDebugLog(line) {
const logPath = getRendererDebugLogPath();
if (!logPath) return;
try {
fs.appendFileSync(logPath, line, { encoding: "utf8" });
} catch {}
}
function stringifyDebugDetails(details) {
if (details == null) return "";
if (typeof details === "string") return details;
try {
return JSON.stringify(details);
} catch (err) {
return `[unserializable:${err?.message || err}]`;
}
}
function setupRendererConsoleLogging(win) {
if (!debugEnabled()) return;
@@ -1575,6 +1603,15 @@ function registerWindowIpc() {
}
});
ipcMain.on("debug:log", (event, payload) => {
const scope = String(payload?.scope || "renderer").trim() || "renderer";
const message = String(payload?.message || "").trim() || "(empty)";
const url = String(payload?.url || event?.sender?.getURL?.() || "").trim();
const details = stringifyDebugDetails(payload?.details);
const suffix = details ? ` details=${details}` : "";
appendRendererDebugLog(`[${nowIso()}] [${scope}] ${message} url=${url}${suffix}\n`);
});
ipcMain.handle("app:setCloseBehavior", (_event, behavior) => {
try {
const next = setCloseBehavior(behavior);
+61
View File
@@ -1,5 +1,65 @@
const { contextBridge, ipcRenderer } = require("electron");
function sendDebugLog(scope, message, details) {
try {
ipcRenderer.send("debug:log", {
scope: String(scope || "renderer"),
message: String(message || ""),
details: details == null ? {} : details,
url: typeof location !== "undefined" ? String(location.href || "") : "",
});
} catch {}
}
sendDebugLog("preload", "script-start", {
userAgent: typeof navigator !== "undefined" ? String(navigator.userAgent || "") : "",
});
if (typeof document !== "undefined") {
document.addEventListener("readystatechange", () => {
sendDebugLog("preload", "document-readystate", {
readyState: String(document.readyState || ""),
});
});
}
if (typeof window !== "undefined") {
window.addEventListener("DOMContentLoaded", () => {
sendDebugLog("preload", "dom-content-loaded");
});
window.addEventListener("load", () => {
sendDebugLog("preload", "window-load");
});
window.addEventListener("error", (event) => {
sendDebugLog("preload", "window-error", {
message: String(event?.message || ""),
filename: String(event?.filename || ""),
lineno: Number(event?.lineno || 0),
colno: Number(event?.colno || 0),
});
});
window.addEventListener("unhandledrejection", (event) => {
const reason = event?.reason;
sendDebugLog("preload", "window-unhandledrejection", {
reason:
reason instanceof Error
? {
name: String(reason.name || "Error"),
message: String(reason.message || ""),
stack: String(reason.stack || ""),
}
: String(reason || ""),
});
});
window.setTimeout(() => {
sendDebugLog("preload", "set-timeout-0");
}, 0);
}
contextBridge.exposeInMainWorld("wechatDesktop", {
// Marker used by the frontend to distinguish the Electron desktop shell from the pure web build.
__brand: "WeChatDataAnalysisDesktop",
@@ -8,6 +68,7 @@ contextBridge.exposeInMainWorld("wechatDesktop", {
close: () => ipcRenderer.invoke("window:close"),
isMaximized: () => ipcRenderer.invoke("window:isMaximized"),
isDebugEnabled: () => ipcRenderer.invoke("app:isDebugEnabled"),
logDebug: (scope, message, details = {}) => sendDebugLog(scope, message, details),
getAutoLaunch: () => ipcRenderer.invoke("app:getAutoLaunch"),
setAutoLaunch: (enabled) => ipcRenderer.invoke("app:setAutoLaunch", !!enabled),