什么是GDB
GDB(GNU Debugger)是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。

如何判定程序是否开启调试

对于C程序来说,需要在编译时加上-g参数,保留调试信息,否则不能使用GDB进行调试。

可以通过gdb 或者 readelf来判断

# 如果没有调试信息,会提示no debugging symbols found
gdb YOURAPP


# 使用readelf读取段信息,如果没有输出,则没有调试信息
readelf -S YOURAPP|grep debug

常见的无法生成core文件的原因:

1、ulimit -c 达到上限

# 排查及解决方法如下

# 查看ulimit 设置
ulimit -c

# 临时修改ulimit 设置, 或者永久修改/etc/security/limits.conf
ulimit -c ulimited

2、core文件目录不存在 或 进程无core目录写入权限

# 排查及解决方法如下

# 查看core_pattern相关设置
sysctl -a|grep kernel.core
# 或者
cat /proc/sys/kernel/core_pattern

# CentOS 8.0默认设置是 |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e

# CentOS 8.3默认设置是 |/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t %P %I %h %e

如上, 在CentOS 8.0中, 系统使用的是systemd-coredump来生成core, 相关配置文件是/etc/systemd/coredump.conf , 对应的core文件生成目录是/var/lib/systemd/coredump, 文件以lz4格式压缩,需要先解压才能使用gdb查看:

cd /var/lib/systemd/coredump
# 解压
lz4 core.YOURAPP.xxxxxxxxxxxxxxxxxxxx.lz4

# 查看
gdb YOURAPP core.YOURAPP.xxxxxxxxxxxxxxxxxxxx

在CentOS 8.3 中, 系统使用abrt-hook-ccpp来生成core文件(这需要abrtd保持运行状态,可以使用systemctl status abrtd查看),abrt全称Automatic Bug Reporting Tool, 是用于bug上报的工具, 配置文件为/etc/abrt/abrt.conf,它生成的core文件目录为/var/spool/abrt, 生成的core已经分子目录保存,子目录中的coredump文件即是我们需要的core文件

ls -al /var/spool/abrt

drwxr-x---.  3 root abrt 4096 Apr 16 16:25 YOURAPP-2021-04-16-15:47:59-460448
-rw-------.  1 root root   28 Apr 16 16:25 last-ccpp

gdb相关命令

# 启动调试
gdb YOURAPP

# 设置程序命令行参数
(gdb) set args some-args
(gdb) run

# 查看backtrace
(gdb) bt
(gdb) bt full

# 调试运行中的程序(通过绑定pid的方式)
(gdb) attach $PID

3、系统空间不足

# 排查及解决方法如下

# 查看磁盘空间
df -h

# 清理磁盘上不需要的文件

相关参考:
https://www.jianshu.com/p/05539de0bd8c
https://blog.csdn.net/cp3alai/article/details/93968796
Linux下使用gdb调试core文件 – 云+社区 – 腾讯云
gdb 调试利器 — Linux Tools Quick Tutorial

发表评论