在应用程序中,程序崩溃造成的原因往往是出现野指针。
1).内存越界
2).指针没有初始化
3).指针指向已被释放的地址(例如指向调用函数的局部变量地址)
4).空间释放后指针没有执行NULL,再次使用指针可能造成问题
往往再多进程多线程的应用程序中,出现程序崩溃,除了日志方式的查看,我们也使用coredump来进行问题定位,生产的core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等
1.查看coredump是否开启
使用ulimit -a命令,查看core file size是否为0,是的话表示没有开启
root@rk3588-buildroot:/# ulimit -a
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31624
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31624
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
2.开启coredump
- 设置coredump size大小为无限制
ulimit -c unlimited #该命名只在该终端窗口有效
我们通过修改kernel的参数,可以指定内核所生成的coredump文件的文件名。例如,Easwy使用下面的命令使kernel生成名字为core_filename_time_pid格式的core dump文件。
echo /usr/core_%e_%t_%p > /proc/sys/kernel/core_pattern
在core_pattern模板中使用变量见下面的列表:
%%单个%字符
%p代表dump进程的进程ID
%u代表dump进程的实际用户ID
%g代表dump进程的实际组ID
%s导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h主机名
%e程序文件名
2 在交叉编译时候加上 -g
3.生成coredump文件
root@rk3588-buildroot:/# ./node_shell
Segmentation fault (core dumped)
root@rk3588-buildroot:/# ls -al /usr/core_log/
total 512
drwxr-xr-x 2 root root 1024 Mar 23 22:17 .
drwxr-xr-x 1 root root 1024 Mar 21 22:01 ..
-rw------- 1 root root 823296 Mar 23 22:17 core_node_shell_1711232275_1355
4.gdb调试
gdb ./node_shell core_node_shell_1711232275_1355