gdb分析coredump

一、内核配置coredump输出目录

配置coredump的输出格式以及路径:
echo “/mnt/usb/coredump/core.%e.%p” > /proc/sys/kernel/core_pattern

二、编译带调试信息的二进制

一般而言,发布的二进制文件不带调试信息,需要修改Makefile增加 -g 选项。

三、gdb分析

1. 启动gdb

arm-linux-gnueabihf-gdb

2.加载二进制

(gdb) file tee-supplicant
Reading symbols from tee-supplicant...done.

3.加载coredump文件

(gdb) core-file core.tee-supplicant.1488
[New LWP 1499]
[New LWP 1488]
warning: Could not load shared library symbols for 5 libraries, e.g. /usr/lib/libteec.so.1.0.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
Core was generated by `./tee-supplicant'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0xf6ed2790 in ?? ()
[Current thread is 1 (LWP 1499)]

4.查看并加载动态库

查看缺少的动态库:

(gdb) info sharedlibrary
From        To          Syms Read   Shared Object Library
                        No          /usr/lib/libteec.so.1.0
                        No          /lib/libpthread.so.0
                        No          /lib/libm.so.6
                        No          /lib/libc.so.6
                        No          /lib/ld-linux-armhf.so.3

设置动态库路径:

(gdb) set solib-search-path 动态库路径
如果存在多个路径,动态库路径之间以冒号隔离。
在这里插入图片描述

5.查看发生异常时保存的堆栈信息

(gdb) where
在这里插入图片描述

6.跳转到对应堆栈并查看变量

跳转到堆栈0:

(gdb) f 0

跳转到堆栈1:

(gdb) f 1

跳转到堆栈2:

(gdb) f 2
通过跳转到不同的堆栈,可以查看发生异常时的变量信息,例如:

跳转到堆栈2 -> 查看传入的待解析数据

(gdb) f 2
#2  0x0000cb8e in tty_read_thread () at src/tty.c:247
247                     if (tdNmeaExtract(tmp, rlen, &stTDData))   /* 提取完成 */
(gdb) p tmp
$1 = "$GPGSV,61,133,17,03,00,150,,07,68,215,25,08,35,046,,0*66\r\n9,M,-29.0,M,,*61\r\n05.787"

你可能感兴趣的:(gdb)