前言
研发语言是C或者C 的小伙伴,无论是从事服务端开发,还是客户端开发,都需要掌握linux系统下关于C/C 代码的调试能力。
正文
1. 入门示例
1.1 代码
首先,我们通过一段存在问题的代码来演示整个调试过程以及问题分析定位的方法和手段。
示例代码:
代码语言:javascript复制#include<stdlib.h>
int main()
{
int *ptr = NULL;
*ptr = 0;
return 0;
}
1.2 编译
编译命令:
g -g -o dump dump.cc
执行dump可执行命令,会提示段错误:
Segmentation fault (core dumped)
注意:后面的括号非常重要,只有提示“core dumped”时才表示生成了coredump文件。
1.3 设置路径
一般,coredump文件的生成路径会声明在/proc/sys/kernel/core_pattern文件中,默认值如下:
另外,我们也可以自己指定coredump文件的存储路径,比如/data/coredump,同时,还可以指定具体的文件名称的格式,比如core.%e.%p.%t,其中%e表示程序名称,%p表示进程名称,%t表示时间。
具体的命令如下:
echo "/data/coredump/core.%e.%p.%t" > /proc/sys/kernel/core_pattern
然后,把coredump文件拷贝到可执行文件同级目录下,指定coredump文件再次运行可执行文件,命令如下:
gdb dump core.dump.2714.1683101747
运行结果如下:
通过结果可以知道,程序在第5行发生了异常。
2. 注意事项
2.1 没有指明调试信息
如果在调试运行时提示如下信息:
Reading symbols from ...(no debugging symbols found)...done.
很可能是因为在程序编译时没有指定-g参数,如果没有符号表信息,我们是无法正常调试的。
2.2 coredump文件没有生成
常见的原因有两个,一是没有设置coredump文件大小,因为默认是0,所以不生成,可以使用如下命令:
ulimit -c unlimited
二是权限问题,可以尝试切换root用户再次运行可执行程序。
2.3 coredump文件命名规则
除了上文提到的%e、%p、%t三种命名格式,还有如下几种:
%u表示添加当前uid;
%g表示添加当前gid;
%s表示添加导致产生core的信号;
%h 表示添加主机名。
作者简介: