进程crash和coredump文件解析

文章介绍了如何有效地分析程序崩溃问题,包括检查coredump文件限制,使用gdb解析coredump文件以获取堆栈信息,以及通过objdump反汇编库文件定位crash的具体位置,特别是针对__malloc_init函数的示例。

程序crash是很头疼的问题,如何有效的进行分析至关重要,下面记录了常用的分析方法。

coredump文件解析

1.首先通过ulimit -c命令确认系统对coredump文件的限制,如果返回为0,需要通过(ulimit -c unlimited)解除限制。

2.找到嵌入式系统环境下对应程序产生的coredump文件,拷贝到host机器上,使用host机器上的交叉编译工具链解析coredump文件。

例如: ntoaarch64-gdb test-arm test-arm.core

(gdb) bt 指令查看进程挂掉的堆栈信息

#0  0x0000002900050884 in __malloc_init () at /builds/workspace/sdp700/build_aarch64/lib/c/alloc/malloc.c:224
#1  0x000000290005062c in __pthread_once (once_control=0x290009a0f0 <__malloc_once>, init_routine=0x2900050870 <__malloc_init>)
    at /builds/workspace/sdp700/build_aarch64/lib/c/1c/pthread_once.c:62
#2  0x0000002900050d6c in __malloc (size=40) at /builds/workspace/sdp700/build_aarch64/lib/c/alloc/malloc.c:561
#3  0x00000029000514f8 in __cxa_atexit (func=0x2903dd74c0, arg=0x2903e25050, dso=0x2903e25000)
    at /builds/workspace/sdp700/build_aarch64/lib/c/ansi/__cxa_atexit.c:23
#4  0x0000002903dd4e58 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

objdump

进程运行crash的时候也会有相应的crash信息,例如:

Process 9560186 (example-no-torch) terminated SIGSEGV code=1 fltno=11 ip=00000016527818c4(/usr/nfs_share/common/lib/libtest.so@__malloc_init+0x0000000000000014)
mapaddr=00000000000138c4. ref=0000000000000006
Memory fault (core dumped)

从crash信息可以看出mapaddr=00000000000138c4,我们可以使用objdump反汇编对应的库查找对应crash的地方。

例如:aarch64-**-objdump -S -d -C libtest.so

00000000000138b0 <__malloc_init>:
 138b0: b0000240 adrp x0, 5c000 <_DYNAMIC+0x398>
 138b4: a9bf7bfd stp x29, x30, [sp,#-16]!
 138b8: 910003fd mov x29, sp
 138bc: f9462c00 ldr x0, [x0,#3160]
 138c0: f9400000 ldr x0, [x0]
 138c4: 79400c00 ldrh w0, [x0,#6]
 138c8: 7100041f cmp w0, #0x1
 138cc: 540000a9 b.ls 138e0 <__malloc_init+0x30>

从反汇编的地址可以很明显的看出挂在了__malloc_init函数的ldrh指令里。

以上就是几种常用的分析进程crash的方法。

在 Ubuntu 系统中,coredump 文件(核心转储)是在程序异常崩溃时由操作系统生成的文件,记录了程序崩溃时的内存状态线程信息。通过分析 coredump 文件,可以定位程序崩溃的原因,例如段错误、非法指令等。 ### 生成 coredump 文件的条件 在分析之前,需要确保系统已正确配置以生成 coredump 文件: 1. **检查 ulimit 设置** 使用 `ulimit -c` 查看当前系统允许生成的 coredump 文件大小限制。如果输出为 `0`,表示不生成 coredump 文件。 可通过以下命令临时设置限制: ```bash ulimit -c unlimited ``` 永久生效可修改 `/etc/security/limits.conf` 文件,添加: ``` * soft core unlimited ``` 2. **配置 coredump 路径命名格式** 系统默认将 coredump 文件写入当前目录,但可以通过 `/proc/sys/kernel/core_pattern` 文件自定义路径命名格式。例如: ```bash echo "/var/coredumps/core-%e-%p-%t" > /proc/sys/kernel/core_pattern ``` 其中 `%e` 表示程序名称,`%p` 表示进程 ID,`%t` 表示时间戳[^3]。 ### 使用 GDB 分析 coredump 文件 使用 GDB(GNU Debugger)是分析 coredump 文件的常用方法。步骤如下: 1. **安装 GDB** 如果系统未安装 GDB,可通过以下命令安装: ```bash sudo apt install gdb ``` 2. **使用 GDB 加载 coredump 文件** 假设程序名为 `my_program`,coredump 文件为 `core-12345`,则命令如下: ```bash gdb my_program core-12345 ``` 3. **查看崩溃堆栈信息** 进入 GDB 后,输入以下命令查看崩溃时的调用栈: ``` (gdb) bt ``` 该命令会显示函数调用栈,帮助定位崩溃位置。 4. **查看寄存器变量信息** 可使用以下命令查看寄存器内容: ``` (gdb) info registers ``` 查看特定变量的值: ``` (gdb) print variable_name ``` 5. **查看源代码上下文** 如果编译程序时添加了 `-g` 选项(例如使用 `gcc -g`),则可以在 GDB 中查看源代码: ``` (gdb) list ``` ### 使用其他工具分析 除了 GDB,还可以使用 `crash` 工具或 `apport` 系统进行分析: - **crash 工具** 安装 `crash`: ```bash sudo apt install crash ``` 使用方式: ```bash crash /path/to/vmlinux /path/to/corefile ``` - **apport 日志** Ubuntu 系统中,`apport` 服务会自动捕获崩溃信息并记录到 `/var/log/apport.log` 中,可用于初步诊断系统级崩溃问题[^4]。 ### 示例:GDB 分析 coredump 以下是一个简单的 C 程序示例,故意引发段错误: ```c #include <stdio.h> int main() { int *p = NULL; *p = 10; // 触发段错误 return 0; } ``` 编译并运行该程序: ```bash gcc -g segfault.c -o segfault ./segfault ``` 如果系统已配置生成 coredump 文件,可使用 GDB 分析: ```bash gdb segfault core (gdb) bt ``` 输出示例: ``` #0 0x0000555555555145 in main () at segfault.c:5 ``` 这表明崩溃发生在 `segfault.c` 的第 5 行,即对空指针解引用的位置。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值