什么是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