一、内核配置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"