常见 core dump 原因分析signal 11 - SIGSEGV

signal 6 - SIGABRT

free 多次

char *p = malloc(100);
free(p);
free(p);

fclose 多次

// fclose 内部调用 free
FILE *fp = fopen("test.txt", "wb+");
printf("%p\n", fp);
fclose(fp);
printf("%p\n", fp);
fclose(fp);
printf("%p\n", fp);
查看栈回溯,跟 free 多次一样,查看 glibc/libio


signal 11 - SIGSEGV

引用空指针成员

struct Hello *p = NULL;
printf("%d\n", p->a);

fclose 空指针

// fclose 内部引用 FILE 成员
FILE *fp = NULL;
fclose(fp);
跟引用空指针成员一致。


Coredump通常是在程序崩溃后生成的一个核心转储文件,用于分析程序错误。然而,直接向systemd发送信号并不常见,因为systemd是一个系统服务管理器,并不是应用程序,它不具备接收信号的能力。 如果你想在程序崩溃通知systemd或者收集额外的日志信息,一种常见的做法是在程序内部设置信号处理器,当接收到特定信号(如SIGUSR1、SIGUSR2等),主动将崩溃的核心转储信息发送到systemd的日志或者其他位置,而不是发送信号给systemd本身。 这里有几个步骤可以参考: 1. **捕获信号**: 在C/C++中,你可以使用`sigaction`函数来注册信号处理器,例如处理SIGUSR1信号: ```c #include <signal.h> void handle_signal(int signum) { // 将core dump写入或发送到systemd日志 // 或者写入某个文件路径如"/var/log/coredump" } int main() { struct sigaction action, old_action; memset(&action, 0, sizeof(action)); action.sa_handler = handle_signal; // 设置信号处理器 if (sigaction(SIGUSR1, &action, &old_action) == -1) { perror("Failed to set signal handler"); return 1; } // ...其他程序代码... // 如果发生崩溃并创建了core dump,handle_signal会被调用 } ``` 2. **检查systemd配置**: 确保systemd的日志级别足够高,以便记录程序崩溃的信息。这通常通过修改`journalctl.conf`或`systemd-journald.conf`中的配置来实现。 3. **信号触发条件**: 你需要在程序的适当刻引发这个信号,比如异常处理部分或者定期检查点。 4. **安全考虑**: 需要注意的是,如果程序不是以root权限运行,发送信号给systemd可能会受限,因此可能需要特殊权限或者使用某种代理机制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值