From cf86cbd3879de568c60abb6242b6bbe95aee86d9 Mon Sep 17 00:00:00 2001 From: MeowOS Date: Mon, 31 Aug 2026 04:39:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(crash):=20meow=5Fcrash=20=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=BA=A7=E5=B4=A9=E6=BA=83=E6=8D=95=E8=8E=B7=20(agent?= =?UTF-8?q?-187)=20=E2=80=94=20svcd=20=E6=9C=8D=E5=8A=A1=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E9=80=80=E5=87=BA=E4=B8=8A=E6=8A=A5(AF=5FUNIX=20best-effort,?= =?UTF-8?q?=E4=B8=8D=E5=B4=A9svcd)+dmesg=E5=A2=9E=E9=87=8F=E6=89=ABsegfaul?= =?UTF-8?q?t/oops;=20=E8=90=BD=E7=9B=98=20TF=20MeowOS/logs/crash=5F.log=20=E6=97=A0=E5=8D=A1=E5=9B=9E=E9=80=80/tmp+=E8=BF=81?= =?UTF-8?q?=E7=A7=BB;=20CLI=20dump/tail;=20S89=20=E9=A2=84=E7=BD=AE=20cras?= =?UTF-8?q?h.conf(=E4=B8=BB=E4=BC=9A=E8=AF=9D=E8=A1=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit meow_crash 62781084; meow_svcd da6ebc66→605646c4(仅+68行上报挂点); 宿主5场景全过(上报链路/dmesg增量/无卡迁移/铁律验证/CLI) --- patch_v2/meow_crash/build_crash.sh | 28 ++ patch_v2/meow_crash/meow_crash | Bin 0 -> 125836 bytes patch_v2/meow_crash/meow_crash.c | 676 ++++++++++++++++++++++++++++ patch_v2/meow_crash/meow_crash.conf | 16 + patch_v2/meow_crash/meow_crash.md | 81 ++++ patch_v2/meow_crash/meow_crash_host | Bin 0 -> 74624 bytes patch_v2/meow_svcd/S89meow_svcd | 16 + patch_v2/meow_svcd/meow_svcd | Bin 119020 -> 133580 bytes patch_v2/meow_svcd/meow_svcd.c | 69 ++- patch_v2/meow_svcd/meow_svcd_host | Bin 76152 -> 76232 bytes 10 files changed, 885 insertions(+), 1 deletion(-) create mode 100755 patch_v2/meow_crash/build_crash.sh create mode 100755 patch_v2/meow_crash/meow_crash create mode 100644 patch_v2/meow_crash/meow_crash.c create mode 100644 patch_v2/meow_crash/meow_crash.conf create mode 100644 patch_v2/meow_crash/meow_crash.md create mode 100755 patch_v2/meow_crash/meow_crash_host diff --git a/patch_v2/meow_crash/build_crash.sh b/patch_v2/meow_crash/build_crash.sh new file mode 100755 index 0000000..548d088 --- /dev/null +++ b/patch_v2/meow_crash/build_crash.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# build_crash.sh — meow_crash 交叉编译(mipsel 静态)+ 宿主编译可选。 +# +# 目标:R3 Pro II / MeowOS(mipsel-linux-muslsf,静态)。meow_crash 极简无外部依赖, +# 仅 POSIX + Linux 基础接口(同一套自管道/poll/AF_UNIX 模式,同 meow_svcd)。 +# +# 用法: +# ./build_crash.sh # 交叉编译 → patch_v2/meow_crash/meow_crash(mipsel 静态) +# ./build_crash.sh host # 宿主编译 → patch_v2/meow_crash/meow_crash_host(集成测试用) +set -e +cd "$(dirname "$0")" +ROOT="$HOME/Project/R3ProII" +CC="$ROOT/.tools/zig-mipsel-cc" + +if [ "$1" = "host" ]; then + HOST_CC="${CC_HOST:-cc}" + "$HOST_CC" -Os -Wall -Wextra meow_crash.c -o meow_crash_host + echo "== host build ==" + ls -la meow_crash_host + file meow_crash_host + exit 0 +fi + +"$CC" -Os -Wall -Wextra -static meow_crash.c -o meow_crash +echo "== meow_crash (mipsel static) ==" +ls -la meow_crash +md5sum meow_crash +file meow_crash diff --git a/patch_v2/meow_crash/meow_crash b/patch_v2/meow_crash/meow_crash new file mode 100755 index 0000000000000000000000000000000000000000..ead5c0f13260b40150b862cc851b2ac8c76aab7a GIT binary patch literal 125836 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 W@q84Yd2NLFdmOazwSsi?^Zx;l`wkZX literal 0 HcmV?d00001 diff --git a/patch_v2/meow_crash/meow_crash.c b/patch_v2/meow_crash/meow_crash.c new file mode 100644 index 0000000..a17e589 --- /dev/null +++ b/patch_v2/meow_crash/meow_crash.c @@ -0,0 +1,676 @@ +/* meow_crash.c — MeowOS 系统级崩溃捕获守护进程(二期组件 meow_crash)。 + * + * 定位(用户定案,见 FRAMEWORK_DESIGN §10 / APPS.md §4.5 / + * devdocs/plan/SYS_BASELINE.md / devdocs/plan/APP_LOG_MANAGER.md): + * - svcd 托管的小守护(板载 `/usr/bin/meow_crash` + services.d 板载 conf, + * trigger=boot);svcd fork+exec 直接拉起,故本进程【前台常驻】(不 daemonize)。 + * - 捕获源: + * ① svcd 服务异常退出(非 0 / 被信号杀)——svcd 在 reap_children 检测到异常 + * 退出时经 AF_UNIX `/tmp/meow_crash.sock` 单行上报(SVC 行,best-effort); + * ② 内核 oops / 应用崩溃——周期性扫描 dmesg 尾部【新增】,记录上次读取偏移, + * 增量捕获含 "segfault"/"oops" 的行(v1 以 ① 为主,② 为辅助;不强求扫 core)。 + * - 落盘:TF 卡 `MeowOS/logs/crash_.log` 追加写(一行一条:时间戳/uptime/ + * 来源/详情);无卡 → `/tmp/meow_crash.log`(256KB 滚动);卡出现后自动迁移 + * (语义对齐 launcher log_poll_card);总量并入 logs/ 1GB 上限纪律(按 mtime 删最旧)。 + * - CLI:`dump`(打印本 boot 崩溃清单)/ `tail N`;root 免鉴权。读日志文件, + * 不依赖守护进程在线。 + * - 铁律:svcd 死亡通知全程非阻塞、可失败(connect 失败即放弃,绝不重试); + * 服务崩绝不能带崩 svcd(本进程只读 svcd 的一条消息做落盘,无共享内存)。 + * + * 编译(mipsel 静态,见 build_crash.sh): + * ~/Project/R3ProII/.tools/zig-mipsel-cc -Os -Wall -Wextra -static meow_crash.c -o meow_crash + * 宿主编译(集成测试):gcc -Os -Wall -Wextra meow_crash.c -o meow_crash_host + */ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* ---- 默认路径 / 常量 ---- */ +#define CRASH_CARD_DEFAULT "/usr/data/mnt/sd_0" /* TF 卡挂载点 */ +#define CRASH_LOGS_REL "MeowOS/logs" /* 卡上日志目录(同 launcher) */ +#define CRASH_SOCK_DEFAULT "/tmp/meow_crash.sock" /* svcd 崩溃上报 socket */ +#define CRASH_TMP_LOG "/tmp/meow_crash.log" /* 无卡回退(tmpfs) */ +#define CRASH_TMP_MAX (256u * 1024u) /* tmp 滚动上限(对齐 boot_buf) */ +#define CRASH_LOG_SIZE_LIMIT (1u << 30) /* logs/ 总量 1GB 纪律 */ +#define CRASH_LINE_MAX 1024 /* 单行上限 */ +#define CRASH_SCAN_MS 1000 /* poll_card/dmesg 扫描间隔 */ +#define CRASH_TICK_MAX_MS 1000 /* poll 上限 */ +#define CRASH_CLEANUP_MS 60000 /* 1GB 清理节流 */ +#define CRASH_PATH_MAX 512 +#define CRASH_SOCK_PATH_MAX 108 +#define CRASH_BOOTTS_LEN 64 +#define CRASH_DMESG_MAX (128u * 1024u) /* dmesg 单次抓取上限 */ +#define CRASH_SEEN_MAX 64 /* 关键字行去重环深度 */ +#define CRASH_SIGTERM_CHAR 'T' + +/* ---- 全局状态 ---- */ +static char g_card[256] = CRASH_CARD_DEFAULT; +static char g_sock[CRASH_SOCK_PATH_MAX] = CRASH_SOCK_DEFAULT; +static char g_bootts[CRASH_BOOTTS_LEN] = ""; /* "%Y%m%d_%H%M%S"(去 meow_ 前缀) */ +static int g_log_fd = -1; /* 卡日志 fd;-1=未开(落 /tmp) */ +static int g_on_card = 0; +static int g_shutdown = 0; +static int g_sigpipe[2] = {-1, -1}; /* 信号自管道 */ +static int g_listen_fd = -1; + +/* dmesg 增量扫描状态 */ +static char g_dmesg_prev[CRASH_DMESG_MAX]; /* 上次完整输出(前缀比对) */ +static size_t g_dmesg_prev_len = 0; +static int g_seen_idx = 0; /* 去重环游标 */ +static char g_seen[CRASH_SEEN_MAX][CRASH_LINE_MAX]; /* 最近关键字行(防环回重复) */ + +static unsigned long long now_ms(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (unsigned long long)ts.tv_sec * 1000 + (unsigned long long)ts.tv_nsec / 1000000; +} + +static int safe_strcpy(char *dst, size_t cap, const char *src) +{ + if (!dst || cap == 0) return -1; + int n = snprintf(dst, cap, "%s", src ? src : ""); + return (n >= 0 && (size_t)n < cap) ? 0 : -1; +} + +/* /proc/uptime 首字段 → 秒(整数)。失败返回 0。 */ +static long read_uptime_sec(void) +{ + int fd = open("/proc/uptime", O_RDONLY); + if (fd < 0) return 0; + char b[64]; + ssize_t n = read(fd, b, sizeof b - 1); + close(fd); + if (n <= 0) return 0; + b[n] = '\0'; + return (long)atof(b); +} + +/* 本 boot 时间戳 "%Y%m%d_%H%M%S":复用 /tmp/meow_bootts(launcher 缓存), + * 同一 boot 会话跨进程共用。读不到则按 墙钟 - uptime 计算,并以 launcher 同款 + * "meow_%Y%m%d_%H%M%S" 格式缓存,保证 launcher/meow_crash 取到同一 bootts。 */ +static void boot_ts(char *out, size_t n) +{ + out[0] = '\0'; + int fd = open("/tmp/meow_bootts", O_RDONLY); + if (fd >= 0) { + char b[CRASH_BOOTTS_LEN]; + ssize_t r = read(fd, b, sizeof b - 1); + close(fd); + if (r > 0) { + b[r] = '\0'; + char *p = b; + if (strncmp(p, "meow_", 5) == 0) p += 5; /* 剥 launcher 前缀,只留 ts */ + snprintf(out, n, "%s", p); + if (out[0]) return; + } + } + time_t now = time(NULL); + time_t up = (time_t)read_uptime_sec(); + time_t boot = now - up; + struct tm tm; + localtime_r(&boot, &tm); + strftime(out, n, "%Y%m%d_%H%M%S", &tm); + char cached[CRASH_BOOTTS_LEN]; + snprintf(cached, sizeof cached, "meow_%s", out); + fd = open("/tmp/meow_bootts", O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd >= 0) { ssize_t w = write(fd, cached, strlen(cached)); (void)w; close(fd); } +} + +/* ---- 卡可用性 / 日志打开 ---- */ + +static int card_available(void) +{ + const char *nc = getenv("MEOW_CRASH_NOCARD"); + if (nc && nc[0] == '1') return 0; /* 测试钩子:强制无卡 */ + + char logs[CRASH_PATH_MAX]; + if (snprintf(logs, sizeof logs, "%s/%s", g_card, CRASH_LOGS_REL) + >= (int)sizeof logs) return 0; + + /* 默认卡路径 → 必须真实挂载(防把 rootfs 当卡);被 --card/env 覆写则视为普通目录 + * (供宿主集成测试把 --card 指向临时目录即可走「有卡」路径)。 */ + if (strcmp(g_card, CRASH_CARD_DEFAULT) == 0) { + FILE *f = fopen("/proc/mounts", "r"); + if (!f) return 0; + char needle[CRASH_PATH_MAX]; + char line[CRASH_PATH_MAX]; + snprintf(needle, sizeof needle, " %s ", g_card); + int found = 0; + while (fgets(line, sizeof line, f)) { + if (strstr(line, needle)) { found = 1; break; } + } + fclose(f); + if (!found) return 0; + } + + (void)mkdir(logs, 0755); + return access(logs, W_OK) == 0; +} + +/* 把 logs/ 下超过 1GB 的部分按 mtime 删最旧(统计 meow_* 与 crash_*)。 */ +static void log_cleanup_old(void) +{ + char logs[CRASH_PATH_MAX]; + if (snprintf(logs, sizeof logs, "%s/%s", g_card, CRASH_LOGS_REL) + >= (int)sizeof logs) return; + DIR *d = opendir(logs); + if (!d) return; + + struct lf { char name[64]; long long size; long long mtime; } files[128]; + int n = 0; + struct dirent *de; + while ((de = readdir(d)) != NULL && n < 128) { + const char *nm = de->d_name; + if (strncmp(nm, "meow_", 5) != 0 && strncmp(nm, "crash_", 6) != 0) continue; + char path[CRASH_PATH_MAX]; + if (snprintf(path, sizeof path, "%s/%s", logs, nm) >= (int)sizeof path) continue; + struct stat st; + if (stat(path, &st) != 0 || !S_ISREG(st.st_mode)) continue; + size_t nl = strlen(nm); + if (nl >= sizeof files[n].name) nl = sizeof files[n].name - 1; + memcpy(files[n].name, nm, nl); + files[n].name[nl] = '\0'; + files[n].size = (long long)st.st_size; + files[n].mtime = (long long)st.st_mtime; + n++; + } + closedir(d); + + long long total = 0; + for (int i = 0; i < n; i++) total += files[i].size; + /* 选择排序:mtime 升序(最旧在前) */ + for (int i = 0; i < n; i++) + for (int j = i + 1; j < n; j++) + if (files[j].mtime < files[i].mtime) { + struct lf t = files[i]; files[i] = files[j]; files[j] = t; + } + int deleted = 0; + for (int i = 0; i < n && total > (long long)CRASH_LOG_SIZE_LIMIT; i++) { + char path[CRASH_PATH_MAX]; + if (snprintf(path, sizeof path, "%s/%s", logs, files[i].name) + >= (int)sizeof path) continue; + if (unlink(path) == 0) { total -= files[i].size; deleted++; } + } + if (deleted) + fprintf(stderr, "[meow_crash] log_cleanup deleted %d old log(s)\n", deleted); +} + +/* 打开卡日志 crash_.log。成功返回 0(置 g_log_fd/g_on_card)。 */ +static int log_open_card(void) +{ + if (g_log_fd >= 0) return 0; + if (!card_available()) return -1; + char ts[CRASH_BOOTTS_LEN]; + boot_ts(ts, sizeof ts); + char path[CRASH_PATH_MAX]; + if (snprintf(path, sizeof path, "%s/%s/crash_%s.log", g_card, CRASH_LOGS_REL, ts) + >= (int)sizeof path) return -1; + int fd = open(path, O_WRONLY | O_APPEND | O_CREAT, 0644); + if (fd < 0) return -1; + g_log_fd = fd; + g_on_card = 1; + return 0; +} + +/* 追加一行:优先卡日志;卡日志未开/写失败 → /tmp(256KB 滚动)。 */ +static void append_line(const char *line) +{ + if (g_log_fd >= 0) { + ssize_t w = write(g_log_fd, line, strlen(line)); + if (w < 0) { close(g_log_fd); g_log_fd = -1; g_on_card = 0; } + else return; + } + /* /tmp 回退(tmpfs,滚动到 256KB) */ + struct stat st; + if (stat(CRASH_TMP_LOG, &st) == 0 && st.st_size > (long long)CRASH_TMP_MAX) + unlink(CRASH_TMP_LOG); + int fd = open(CRASH_TMP_LOG, O_WRONLY | O_APPEND | O_CREAT, 0644); + if (fd >= 0) { ssize_t w = write(fd, line, strlen(line)); (void)w; close(fd); } +} + +/* 卡出现后把 /tmp 缓冲迁移进卡日志(语义对齐 launcher log_poll_card)。 */ +static void poll_card(void) +{ + if (g_log_fd >= 0) return; + if (log_open_card() != 0) return; + int fd = open(CRASH_TMP_LOG, O_RDONLY); + if (fd >= 0) { + char chunk[1024]; + ssize_t cn; + while ((cn = read(fd, chunk, sizeof chunk)) > 0) { + if (write(g_log_fd, chunk, cn) < 0) { + close(fd); + g_log_fd = -1; g_on_card = 0; + return; + } + } + close(fd); + unlink(CRASH_TMP_LOG); + fprintf(stderr, "[meow_crash] /tmp buffered crash log moved to card\n"); + } +} + +/* 以当前时间/uptime 落一条「自身来源」事件(dmesg 用)。 */ +static void emit_event(const char *source, const char *detail) +{ + char line[CRASH_LINE_MAX]; + long epoch = (long)time(NULL); + long up = read_uptime_sec(); + int l = snprintf(line, sizeof line, "%ld %ld %s %s\n", epoch, up, source, detail); + if (l > 0) append_line(line); +} + +/* 落 svcd 上报的来源事件(用 svcd 拍下的 epoch/uptime,即崩溃时刻)。 */ +static void emit_svc(const char *detail, long epoch, long up) +{ + char line[CRASH_LINE_MAX]; + int l = snprintf(line, sizeof line, "%ld %ld svc %s\n", epoch, up, detail); + if (l > 0) append_line(line); +} + +/* ---- 崩溃上报 socket(svcd → meow_crash) ---- */ + +/* 解析一行 svcd 死亡通知:SVC */ +static void handle_conn(int fd) +{ + char buf[CRASH_LINE_MAX]; + ssize_t n = read(fd, buf, sizeof buf - 1); + if (n <= 0) return; + buf[n] = '\0'; + while (n > 0 && (buf[n - 1] == '\n' || buf[n - 1] == '\r')) buf[--n] = '\0'; + if (n == 0) return; + + char name[128], kind[8]; + int num; + long epoch, up; + if (sscanf(buf, "SVC %127s %7s %d %ld %ld", name, kind, &num, &epoch, &up) == 5) { + char detail[CRASH_LINE_MAX]; + if (strcmp(kind, "exit") == 0) snprintf(detail, sizeof detail, "%s exit=%d", name, num); + else if (strcmp(kind, "sig") == 0) snprintf(detail, sizeof detail, "%s signal=%d", name, num); + else return; /* 未知 kind,丢弃 */ + emit_svc(detail, epoch, up); + } +} + +/* ---- dmesg 增量扫描(来源②) ---- */ + +static char *read_dmesg(void) +{ + const char *src = getenv("MEOW_CRASH_DMESG_FILE"); + if (src && src[0]) { /* 测试钩子:从文件读假 dmesg */ + FILE *f = fopen(src, "r"); + if (!f) return NULL; + char *out = malloc(CRASH_DMESG_MAX); + if (!out) { fclose(f); return NULL; } + int off = 0; + while (off < (int)CRASH_DMESG_MAX - 1) { + int r = (int)fread(out + off, 1, CRASH_DMESG_MAX - 1 - off, f); + if (r <= 0) break; + off += r; + } + fclose(f); + out[off] = '\0'; + return out; + } + FILE *f = popen("PATH=/bin:/sbin:/usr/bin:/usr/sbin dmesg 2>/dev/null", "r"); + if (!f) return NULL; + char *out = malloc(CRASH_DMESG_MAX); + if (!out) { pclose(f); return NULL; } + int off = 0; + while (off < (int)CRASH_DMESG_MAX - 1) { + int r = (int)fread(out + off, 1, CRASH_DMESG_MAX - 1 - off, f); + if (r <= 0) break; + off += r; + } + pclose(f); + out[off] = '\0'; + return out; +} + +/* 行内是否含 "segfault"/"oops"(大小写不敏感)。 */ +static int is_crash_line(const char *s) +{ + static const char *keys[] = {"segfault", "oops"}; + size_t len = strlen(s); + for (int k = 0; k < 2; k++) { + size_t kl = strlen(keys[k]); + for (size_t i = 0; i + kl <= len; i++) { + size_t j = 0; + int m = 1; + for (; j < kl; j++) { + char c = s[i + j]; + if (c >= 'A' && c <= 'Z') c += (char)('a' - 'A'); + if (c != keys[k][j]) { m = 0; break; } + } + if (m) return 1; + } + } + return 0; +} + +/* 去重环:行已在环内则返回 0(不重复落盘),否则入环返回 1。 */ +static int seen_push(const char *line) +{ + for (int i = 0; i < CRASH_SEEN_MAX; i++) + if (g_seen[i][0] && strcmp(g_seen[i], line) == 0) return 0; + snprintf(g_seen[g_seen_idx], CRASH_LINE_MAX, "%s", line); + g_seen_idx = (g_seen_idx + 1) % CRASH_SEEN_MAX; + return 1; +} + +/* 扫描 dmesg 尾部新增:记录上次读取偏移(g_dmesg_prev_len),正常追加只扫新增段; + * 环回/替换则全量扫并靠去重环防重复。 */ +static void scan_dmesg(void) +{ + char *cur = read_dmesg(); + if (!cur) return; + + const char *start = cur; + if (g_dmesg_prev_len > 0) { + size_t curlen = strlen(cur); + if (curlen >= g_dmesg_prev_len && + memcmp(cur, g_dmesg_prev, g_dmesg_prev_len) == 0) { + start = cur + g_dmesg_prev_len; /* 正常追加:只扫新增 */ + } else { + start = cur; /* 环回/替换:全量扫 + 去重 */ + } + } + + const char *p = start; + while (*p) { + const char *nl = strchr(p, '\n'); + size_t linelen = nl ? (size_t)(nl - p) : strlen(p); + if (linelen > 0) { + char tmp[CRASH_LINE_MAX]; + size_t cl = linelen < CRASH_LINE_MAX - 1 ? linelen : CRASH_LINE_MAX - 1; + memcpy(tmp, p, cl); + tmp[cl] = '\0'; + while (cl > 0 && tmp[cl - 1] == '\r') tmp[--cl] = '\0'; /* 去尾 \r */ + if (is_crash_line(tmp)) { + if (seen_push(tmp)) emit_event("dmesg", tmp); + } + } + if (!nl) break; + p = nl + 1; + } + + size_t curlen = strlen(cur); + size_t keep = curlen < CRASH_DMESG_MAX - 1 ? curlen : CRASH_DMESG_MAX - 1; + memcpy(g_dmesg_prev, cur, keep); + g_dmesg_prev[keep] = '\0'; + g_dmesg_prev_len = keep; + free(cur); +} + +/* ---- 信号 / socket ---- */ + +static void sig_handler(int sig) +{ + g_shutdown = 1; + char c = CRASH_SIGTERM_CHAR; + ssize_t w = write(g_sigpipe[1], &c, 1); + (void)w; + (void)sig; +} + +static int setup_signals(void) +{ + if (pipe(g_sigpipe) != 0) return -1; + int rf = fcntl(g_sigpipe[0], F_GETFL, 0); + if (rf >= 0) fcntl(g_sigpipe[0], F_SETFL, rf | O_NONBLOCK); + int wf = fcntl(g_sigpipe[1], F_GETFL, 0); + if (wf >= 0) fcntl(g_sigpipe[1], F_SETFL, wf | O_NONBLOCK); + + struct sigaction sa; + memset(&sa, 0, sizeof sa); + sa.sa_handler = sig_handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sigaction(SIGTERM, &sa, NULL); + sigaction(SIGINT, &sa, NULL); + signal(SIGPIPE, SIG_IGN); + return 0; +} + +static int setup_socket(void) +{ + unlink(g_sock); + int fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { fprintf(stderr, "[meow_crash] socket: %s\n", strerror(errno)); return -1; } + struct sockaddr_un a; + memset(&a, 0, sizeof a); + a.sun_family = AF_UNIX; + safe_strcpy(a.sun_path, sizeof a.sun_path, g_sock); + if (bind(fd, (struct sockaddr *)&a, sizeof a) != 0) { + fprintf(stderr, "[meow_crash] bind %s: %s\n", g_sock, strerror(errno)); + close(fd); + return -1; + } + (void)chmod(g_sock, 0666); + if (listen(fd, 8) != 0) { + fprintf(stderr, "[meow_crash] listen: %s\n", strerror(errno)); + close(fd); + return -1; + } + g_listen_fd = fd; + return 0; +} + +static int run_daemon(void) +{ + if (setup_signals() != 0) return 1; + if (setup_socket() != 0) return 1; + boot_ts(g_bootts, sizeof g_bootts); + log_open_card(); /* 有卡即写卡;否则落 /tmp */ + log_cleanup_old(); + + fprintf(stderr, "[meow_crash] up: card=%s sock=%s bootts=%s log=%s\n", + g_card, g_sock, g_bootts, g_on_card ? "card" : CRASH_TMP_LOG); + + struct pollfd pfds[2]; + nfds_t nfds = 2; + unsigned long long last_scan = 0; + unsigned long long last_cleanup = 0; + + while (!g_shutdown) { + pfds[0].fd = g_listen_fd; pfds[0].events = POLLIN; pfds[0].revents = 0; + pfds[1].fd = g_sigpipe[0]; pfds[1].events = POLLIN; pfds[1].revents = 0; + + int r = poll(pfds, nfds, (int)CRASH_TICK_MAX_MS); + if (r < 0) { + if (errno == EINTR) continue; + fprintf(stderr, "[meow_crash] poll: %s\n", strerror(errno)); + break; + } + if (g_shutdown) break; + + if (pfds[0].revents & POLLIN) { + int cfd = accept(g_listen_fd, NULL, NULL); + if (cfd >= 0) { handle_conn(cfd); close(cfd); } + } + if (pfds[1].revents & POLLIN) { + char tmp[64]; + while (read(g_sigpipe[0], tmp, sizeof tmp) > 0) { /* drain */ } + } + + if (now_ms() - last_scan >= (unsigned long long)CRASH_SCAN_MS) { + last_scan = now_ms(); + poll_card(); /* 卡出现 → 迁移 /tmp 缓冲 */ + scan_dmesg(); /* 增量捕获 dmesg 新增 oops/segfault */ + } + if (now_ms() - last_cleanup >= (unsigned long long)CRASH_CLEANUP_MS) { + last_cleanup = now_ms(); + log_cleanup_old(); /* 总量并入 logs/ 1GB 上限 */ + } + } + + if (g_listen_fd >= 0) close(g_listen_fd); + unlink(g_sock); + if (g_log_fd >= 0) close(g_log_fd); + fprintf(stderr, "[meow_crash] shutdown\n"); + return 0; +} + +/* ---- CLI:dump / tail(读日志文件,免鉴权,不依赖守护在线) ---- */ + +/* 定位本 boot 崩溃日志文件(卡优先,无卡/不存在回退 /tmp)。返回 0=找到可读文件。 */ +static int find_log_path(char *out, size_t n) +{ + if (card_available()) { + char ts[CRASH_BOOTTS_LEN]; + boot_ts(ts, sizeof ts); + if (snprintf(out, n, "%s/%s/crash_%s.log", g_card, CRASH_LOGS_REL, ts) < (int)n + && access(out, R_OK) == 0) return 0; + } + if (access(CRASH_TMP_LOG, R_OK) == 0) { snprintf(out, n, "%s", CRASH_TMP_LOG); return 0; } + return -1; +} + +/* 解析行首三字段:epoch / uptime / source,返回剩余 detail 指针。原地改写入参(写 NUL)。 */ +static int parse_parts(char *line, time_t *epoch, long *up, char *src, size_t srcn, char **rest) +{ + char *p = line; + char *sp = strchr(p, ' '); + if (!sp) return -1; + *sp = '\0'; + *epoch = (time_t)atol(p); + p = sp + 1; + sp = strchr(p, ' '); + if (!sp) return -1; + *sp = '\0'; + *up = atol(p); + p = sp + 1; + sp = strchr(p, ' '); + if (!sp) return -1; + *sp = '\0'; + snprintf(src, srcn, "%s", p); + p = sp + 1; + *rest = p; + return 0; +} + +/* 打印时把 epoch 转可读时间戳。 */ +static void print_reformatted(char *line) +{ + time_t epoch; + long up; + char src[16], *rest; + if (parse_parts(line, &epoch, &up, src, sizeof src, &rest) == 0) { + struct tm tm; + char tbuf[32]; + if (localtime_r(&epoch, &tm)) strftime(tbuf, sizeof tbuf, "%Y-%m-%d %H:%M:%S", &tm); + else snprintf(tbuf, sizeof tbuf, "%lld", (long long)epoch); + printf("%s up=%lds [%s] %s", tbuf, up, src, rest); + } else { + fputs(line, stdout); + } +} + +static int cmd_dump(void) +{ + char path[CRASH_PATH_MAX]; + if (find_log_path(path, sizeof path) != 0) { printf("(no crash events this boot)\n"); return 0; } + printf("# crash log: %s\n", path); + FILE *f = fopen(path, "r"); + if (!f) { printf("(cannot open %s)\n", path); return 0; } + char line[CRASH_LINE_MAX]; + int cnt = 0; + while (fgets(line, sizeof line, f)) { print_reformatted(line); cnt++; } + fclose(f); + if (cnt == 0) printf("(empty)\n"); + return 0; +} + +static int cmd_tail(int n) +{ + char path[CRASH_PATH_MAX]; + if (find_log_path(path, sizeof path) != 0) { printf("(no crash events this boot)\n"); return 0; } + FILE *f = fopen(path, "r"); + if (!f) { printf("(cannot open %s)\n", path); return 0; } + if (n <= 0) n = 20; + if (n > 100) n = 100; + + enum { CAP = 100 }; + char ring[CAP][CRASH_LINE_MAX]; + int cnt = 0; + char line[CRASH_LINE_MAX]; + while (fgets(line, sizeof line, f)) { + snprintf(ring[cnt % CAP], CRASH_LINE_MAX, "%s", line); + cnt++; + } + fclose(f); + + int avail = cnt < CAP ? cnt : CAP; /* 环内实际存的条数 */ + int shown = cnt < CAP ? cnt : n; + int startat; + if (cnt < CAP) startat = 0; + else startat = cnt - n; + if (startat < 0) startat = 0; + if (shown > avail) shown = avail; + + char buf[CRASH_LINE_MAX]; + for (int i = 0; i < shown; i++) { + snprintf(buf, sizeof buf, "%s", ring[(startat + i) % CAP]); + print_reformatted(buf); + } + return 0; +} + +static void usage(const char *a0) +{ + fprintf(stderr, + "usage: %s [options] [command]\n" + " commands: dump | tail [N] (root 免鉴权;无命令=启动守护进程)\n" + " options:\n" + " --card TF 卡挂载点 (default %s)\n" + " --sock 崩溃上报 socket (default %s)\n" + " -h, --help\n", + a0, CRASH_CARD_DEFAULT, CRASH_SOCK_DEFAULT); +} + +int main(int argc, char **argv) +{ + const char *cmd_tok[8]; + int cmd_n = 0; + for (int i = 1; i < argc; i++) { + const char *a = argv[i]; + if (strcmp(a, "--card") == 0 && i + 1 < argc) safe_strcpy(g_card, sizeof g_card, argv[++i]); + else if (strcmp(a, "--sock") == 0 && i + 1 < argc) safe_strcpy(g_sock, sizeof g_sock, argv[++i]); + else if (strcmp(a, "-h") == 0 || strcmp(a, "--help") == 0) { usage(argv[0]); return 0; } + else if (a[0] == '-') { usage(argv[0]); return 2; } + else if (cmd_n < 8) cmd_tok[cmd_n++] = a; + } + + const char *e; + if ((e = getenv("MEOW_CRASH_CARD")) && e[0]) safe_strcpy(g_card, sizeof g_card, e); + if ((e = getenv("MEOW_CRASH_SOCK")) && e[0]) safe_strcpy(g_sock, sizeof g_sock, e); + + setvbuf(stdout, NULL, _IONBF, 0); + + if (cmd_n == 0) return run_daemon(); /* svcd 空参拉起 → 前台常驻 */ + if (strcmp(cmd_tok[0], "dump") == 0) return cmd_dump(); + if (strcmp(cmd_tok[0], "tail") == 0) { + int n = 20; + if (cmd_n > 1) n = atoi(cmd_tok[1]); + return cmd_tail(n); + } + usage(argv[0]); + return 2; +} diff --git a/patch_v2/meow_crash/meow_crash.conf b/patch_v2/meow_crash/meow_crash.conf new file mode 100644 index 0000000..0cf0f94 --- /dev/null +++ b/patch_v2/meow_crash/meow_crash.conf @@ -0,0 +1,16 @@ +# meow_crash.conf — meow_crash 板载服务配置(services.d,trigger=boot) +# 部署目标:/usr/data/meow/services.d/meow_crash.conf(Data 区,首启预置) +# +# 字段语义与 meow_svcd 一致: +# exec/args/enabled/restart/backoff_ms/max_restart/trigger/cap +# - trigger=boot:板载服务恒存在即启动(拔卡保留)。 +# - restart=on-fail:崩溃后退避重启(默认 backoff 2000ms,最多 5 次)。 +# - caps:本机平台未定,保留为空。 +exec=/usr/bin/meow_crash +args= +enabled=1 +restart=on-fail +backoff_ms=2000 +max_restart=5 +trigger=boot +cap= diff --git a/patch_v2/meow_crash/meow_crash.md b/patch_v2/meow_crash/meow_crash.md new file mode 100644 index 0000000..a6109e9 --- /dev/null +++ b/patch_v2/meow_crash/meow_crash.md @@ -0,0 +1,81 @@ +# meow_crash — MeowOS 系统级崩溃捕获(二期组件) + +> 状态:设计落盘 + 实现(agent 任务)。`meow_crash` 是 svcd 托管的小守护,负责把 +> svcd 服务的异常退出与内核 oops/应用崩溃记录到日志,供事后排查。 +> 定位见 FRAMEWORK_DESIGN §10(Supervisor 树 / 崩溃隔离)、APPS.md §4.5(统一日志系统)、 +> devdocs/plan/SYS_BASELINE.md(svcd 子进程化,监护挂点)、devdocs/plan/APP_LOG_MANAGER.md。 + +## 1. 角色 + +`meow_crash` = 崩溃事件**记录器**(只读一条上报消息落盘,无共享内存、无 dlopen), +由 svcd 以 `fork+exec+setpgid` 托管(`/usr/bin/meow_crash` + `services.d/meow_crash.conf` +trigger=boot)。svcd 托管服务均为前台常驻(svcd waitpid),故 meow_crash +**不 daemonize**,svcd 崩则它是子进程被 waitpid 感知;它崩则 svcd 按 `on-fail` 重启它, +且其崩溃不影响 svcd(崩溃隔离)。 + +## 2. 捕获源 + +### ① svcd 服务异常退出(主源) +svcd 在 `reap_children()` 检测到**异常退出**(非 0 退出码 / 被信号杀,且非受控 +stop/restart)时,经 AF_UNIX `/tmp/meow_crash.sock` 发**单行**文本(best-effort): + +``` +SVC +``` + +- 全程非阻塞:客户端 socket 置 O_NONBLOCK;connect 失败即放弃(可短 poll POLLOUT + ≤150ms 用于本地 listen backlog 排空,绝不重试)。**svcd 绝不被此带崩。** +- meow_crash 不在线 → 该条丢弃(符合「若 crash 不在线则跳过」)。 + +### ② 内核 oops / 应用崩溃(辅助,v1 不强求) +周期性(1s)`dmesg` 抓取,记录上次读取偏移(`g_dmesg_prev_len`),只扫**新增**段, +捕获含 `segfault`/`oops`(大小写不敏感)的行。环回/替换时全量扫并靠去重环防重复。 +v1 不扫描 `/tmp` core 转储(不强求,留作后续)。 + +## 3. 落盘 + +- 有卡:`/MeowOS/logs/crash_.log` 追加写。`` 复用 + `/tmp/meow_bootts`(launcher 缓存的 boot 时间戳,`meow_` 前缀剥掉),同一 boot + 会话跨进程共用;读不到则按 墙钟-uptime 计算并缓存。 +- 无卡/写失败:`/tmp/meow_crash.log`(tmpfs,256KB 滚动,超出即重建)。 +- 卡出现:`poll_card()` 把 /tmp 缓冲整段搬入卡日志后删除(对齐 launcher + `log_poll_card` 语义)。 +- 总量:`log_cleanup_old()` 统计 logs/ 下 `meow_*` 与 `crash_*`,超过 1GB 按 mtime + 删最旧(与 launcher 的 LOG_SIZE_LIMIT 同纪律,launcher 只管 meow_*,本守护并管)。 + +一行一条格式: +``` + +``` +- `source`:`svc`(来自 svcd)或 `dmesg`(内核行)。 +- `detail`:` exit=` / ` signal=` / 内核行原文。 + +## 4. CLI(root 免鉴权,读文件,不依赖守护在线) + +| 命令 | 说明 | +|---|---| +| `meow_crash dump` | 打印本 boot 崩溃清单(卡 `crash_.log`;无卡/无文件回退 /tmp) | +| `meow_crash tail [N]` | 打印最近 N 条(默认 20,上限 100) | +| `meow_crash`(无命令) | svcd 拉起 → 前台常驻守护 | + +`dump`/`tail` 把 epoch 转可读 `YYYY-MM-DD HH:MM:SS` 展示。 + +## 5. 测试钩子(宿主集成测试) + +| 钩子 | 作用 | +|---|---| +| `--card ` / `MEOW_CRASH_CARD` | 覆写卡挂载点(宿主指向临时目录即走「有卡」路径) | +| `--sock ` / `MEOW_CRASH_SOCK` | 覆写上报 socket | +| `MEOW_CRASH_NOCARD=1` | 强制无卡(验证 /tmp 回退 + 后续迁移) | +| `MEOW_CRASH_DMESG_FILE=` | 从文件读「假 dmesg」(宿主注入内核行) | + +## 6. 边界 / 诚实标注 + +- **v1 不扫描 core 转储**(任务:「不强求」)。当前只做 svcd 上报 + dmesg 增量。 +- **svcd 上报的 skip 语义**:受控 stop(stop_requested)与 restart 命令 + (restart_pending)的退出**不**上报,只记真实异常退出(避免把管理员停服务当崩溃)。 +- **dmesg 捕获**依赖设备 `dmesg` 可用(busybox;root)。宿主用 `MEOW_CRASH_DMESG_FILE` + 注入。首扫会捕获本 boot 已存在的 crash 行(内核环在重启时清空,不会跨 boot 混入)。 +- **固件打包需知 / 板载 conf 预置**:本任务按约束未改 `S89meow_svcd` 与固件脚本。 + 需在**打包/首启预置**阶段把 `patch_v2/meow_crash/meow_crash.conf` 落到 + `/usr/data/meow/services.d/meow_crash.conf`(参照 S89 对 mdnsd/perf/power 的预置方式)。 diff --git a/patch_v2/meow_crash/meow_crash_host b/patch_v2/meow_crash/meow_crash_host new file mode 100755 index 0000000000000000000000000000000000000000..fa468d8c236c369d3665105ceb938928e98cc372 GIT binary patch literal 74624 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 /usr/data/meow/services.d/meow_crash.conf <<'EOF' +exec=/usr/bin/meow_crash +args= +enabled=1 +restart=on-fail +backoff_ms=2000 +max_restart=5 +trigger=boot +cap= +EOF + chmod 644 /usr/data/meow/services.d/meow_crash.conf + echo -n "provisioned crash.conf " + fi else echo -n "skip svc confs (/usr/data/meow not writable) " fi diff --git a/patch_v2/meow_svcd/meow_svcd b/patch_v2/meow_svcd/meow_svcd index 1d2ddf5f35ffe34c1a752b69a77e3d230ed4d5d5..a86acdae7f54a3aae03704e05e1bdf1b21ab68cc 100755 GIT binary patch delta 46390 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 diff --git a/patch_v2/meow_svcd/meow_svcd.c b/patch_v2/meow_svcd/meow_svcd.c index 8eb18fb..4474504 100644 --- a/patch_v2/meow_svcd/meow_svcd.c +++ b/patch_v2/meow_svcd/meow_svcd.c @@ -97,6 +97,8 @@ #define SVCD_SOCK_PATH_MAX 108 #define SVCD_SIGCHLD_CHAR 'C' /* 自管道字节(拉起 poll) */ #define SVCD_SIGTERM_CHAR 'T' +#define SVCD_CRASH_SOCK "/tmp/meow_crash.sock" /* meow_crash 崩溃上报 socket(best-effort) */ +#define SVCD_CRASH_POLL_MS 150 /* 上报 connect 的排空等待上限(绝不重试) */ /* ---- ANSI 终端配色(status 回显用;仅客户端 stdout 为 TTY 时保留,非 TTY 去色) ---- */ #define AN_RESET "\033[0m" @@ -532,6 +534,65 @@ static void sig_term(int sig) (void)w; } +/* /proc/uptime 首字段 → 秒(整数)。失败返回 0。 */ +static long svcd_uptime(void) +{ + int fd = open("/proc/uptime", O_RDONLY); + if (fd < 0) return 0; + char b[64]; + ssize_t n = read(fd, b, sizeof b - 1); + close(fd); + if (n <= 0) return 0; + b[n] = '\0'; + return (long)atof(b); +} + +/* 服务异常退出 → 上报 meow_crash(best-effort,绝不阻塞/重试 svcd)。 + * + * 铁律:服务崩不崩 svcd。上报全程非阻塞: + * - 客户端 socket 置 O_NONBLOCK; + * - connect 失败即放弃;若 EINPROGRESS/EWOULDBLOCK,短 poll(POLLOUT) ≤150ms 排空 + * 本地 listen backlog,仍不可写即丢弃; + * - 单行小消息一次 write(失败即弃),绝不重试。 + * meow_crash 不在线(connect ECONNREFUSED 等)→ 静默丢,不影响 svcd 任何状态。 + */ +static void notify_crash(const char *name, int status) +{ + const char *kind; + int num; + if (WIFSIGNALED(status)) { kind = "sig"; num = WTERMSIG(status); } + else { kind = "exit"; num = WIFEXITED(status) ? WEXITSTATUS(status) : 1; } + + char msg[256]; + snprintf(msg, sizeof msg, "SVC %s %s %d %ld %ld\n", + name, kind, num, (long)time(NULL), svcd_uptime()); + + int fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) return; + int fl = fcntl(fd, F_GETFL, 0); + if (fl >= 0) fcntl(fd, F_SETFL, fl | O_NONBLOCK); + + struct sockaddr_un a; + memset(&a, 0, sizeof a); + a.sun_family = AF_UNIX; + safe_strcpy(a.sun_path, sizeof a.sun_path, SVCD_CRASH_SOCK); + + if (connect(fd, (struct sockaddr *)&a, sizeof a) != 0) { + if (errno == EINPROGRESS || errno == EWOULDBLOCK) { + struct pollfd pf; + pf.fd = fd; pf.events = POLLOUT; pf.revents = 0; + int r = poll(&pf, 1, SVCD_CRASH_POLL_MS); + if (r <= 0 || !(pf.revents & POLLOUT)) { close(fd); return; } + } else { + close(fd); + return; + } + } + ssize_t w = write(fd, msg, strlen(msg)); + (void)w; + close(fd); +} + /* 排空 SIGCHLD 自管道,waitpid 匹配所有已退出子进程。 */ static void reap_children(void) { @@ -545,7 +606,13 @@ static void reap_children(void) for (int i = 0; i < g_nsvc; i++) if (g_svcs[i].pid == pid) { idx = i; break; } if (idx < 0) { svcd_log("reap unknown pid=%d", (int)pid); continue; } - apply_exit(&g_svcs[idx], status); + svc_t *s = &g_svcs[idx]; + /* 服务异常退出(非 0 / 被信号杀)且非受控 stop/restart → 上报 meow_crash。 + * 必须在 apply_exit 前判(apply_exit 会清 stop_requested/restart_pending)。 */ + int failed = !(WIFEXITED(status) && WEXITSTATUS(status) == 0); + if (failed && !s->stop_requested && !s->restart_pending) + notify_crash(s->name, status); + apply_exit(s, status); } build_status_file(); } diff --git a/patch_v2/meow_svcd/meow_svcd_host b/patch_v2/meow_svcd/meow_svcd_host index 201815e74343c3662fa383f23b30fc11a79efd19..65fa79f1809b10162a4f38098fcaee0842d3e49f 100755 GIT binary patch delta 16501 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 JHuM+z{U6W!^z8ru delta 16128 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