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