From e65f4f6025a3e26fb6ac0e654e4ada632ee4b4a2 Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Sat, 15 Feb 2025 13:43:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A5=94=E6=BA=83=E6=8D=95?= =?UTF-8?q?=E8=8E=B7=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/main.c b/main.c index 91c27c33..15a8bff3 100644 --- a/main.c +++ b/main.c @@ -4,6 +4,8 @@ #define XWAYLNAD 1 #include #include +#include +#include #include #include #include @@ -4288,7 +4290,56 @@ void handle_foreign_destroy(struct wl_listener *listener, void *data) { } } + +void signalhandler(int signalnumber) +{ + void *array[64]; + size_t size; + char **strings; + size_t i; + char filename[1024]; + + // 获取当前用户家目录 + const char *homedir = getenv("HOME"); + if (!homedir) { + // 如果获取失败,则无法继续 + return; + } + + // 构建日志文件路径 + snprintf(filename, sizeof(filename), "%s/.config/maomao/crash.log", homedir); + + // 打开日志文件 + FILE *fp = fopen(filename, "a"); + if (!fp) { + // 如果无法打开日志文件,则不处理 + return; + } + + // 获取堆栈跟踪 + size = backtrace(array, 64); + strings = backtrace_symbols(array, size); + + // 写入错误信息和堆栈跟踪到文件 + fprintf(fp, "Received signal %d:\n", signalnumber); + for (i = 0; i < size; ++i) { + fprintf(fp, "%zu %s\n", i, strings[i]); + } + + // 关闭文件 + fclose(fp); + + // 释放分配的内存 + free(strings); + + // 不调用 exit 以允许生成核心转储文件 +} + + void setup(void) { + + signal(SIGSEGV, signalhandler); + init_baked_points(); int i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE};