使用 dmesg 和 addr2line 分析程序 core 原因

当一个名为tagent的进程在响应时意外退出且未生成core文件时,通过dmesg日志分析发现程序在13:27:17左右崩溃。通过解析dmesg中的时间差获取到精确时间戳,并确认了程序的coredump。接着使用addr2line定位到问题发生在xxx.cpp的第38行,函数plugin_conn_send。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到这样一种情况:发现进程 tagent 在发送响应时退出了,退出原因未知,因为没有 core 文件,无从分析。core 文件生成目录和 ulimit 都没有任何问题,就是不生成 core 文件:

$ cat /proc/sys/kernel/core_pattern
core.%p_%e

$ ulimit -c
unlimited

写了个小程序也能生成 core, 没有 core 文件,只能另觅他径了。

dmesg

dmesg 发现如下两行:

[3612464.102140] tagent[29001]: segfault at 7f499fee11d8 ip 00000000004267aa sp 00007f499fee11e0 error 6 in 
`addr2line` 是一个 **调试工具**,用于将 **内存地址转换为对应的源代码位置**(文件名行号),常用于分析程序崩溃(如 `Core Dump`)或调试信息(如 `DWARF`)。以下是关键点解析: --- ### **1. 核心功能** - **输入**:程序中的内存地址(如 `0x4005a6`)。 - **输出**:对应的 **源代码文件名 + 行号** 或 **函数名**(需编译时包含调试符号)。 - **依赖**:要求可执行文件或共享库编译时带有 `-g` 选项(生成调试信息)。 --- ### **2. 典型使用场景** - **分析崩溃日志**: ```bash addr2line -e /path/to/executable 0x4005a6 ``` 输出示例: `/home/user/main.c:42`(表示地址 `0x4005a6` 对应 `main.c` 文件的第 42 行)。 - **与 `backtrace` 结合**: 解析 `gdb` 或 `Core Dump` 中的调用栈地址。 --- ### **3. 常用参数** | 参数 | 作用 | |--------------------|---------------------------------------| | `-e <executable>` | 指定目标可执行文件路径 | | `-f` | 显示函数名(而不仅是行号) | | `-C` | 解码 C++ 符号(Demangle) | | `-p` | 美化输出格式(包含地址源码位置) | --- ### **4. 工作流程示例** 1. **编译带调试符号的程序**: ```bash gcc -g -o test test.c ``` 2. **获取崩溃地址**(如通过 `gdb` 或 `dmesg`)。 3. **解析地址**: ```bash addr2line -e test -f -p 0x4005a6 ``` 输出示例: `main() at /path/test.c:42` --- ### **5. 注意事项** - **无调试符号时**:输出 `??:0`(需确保编译时加了 `-g`)。 - **动态链接库**:需同时提供库文件路径(如 `-e /lib/x86_64-linux-gnu/libc.so.6`)。 - **剥离符号表后**:若使用 `strip` 删除了符号表,`addr2line` 将失效。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值