最近在LINUX下调试C/C++,以前在W下都是基于VS自带的调试工具来debug,换到LINUX后,怎么调试呢?刚开始嫌麻烦就直接使用print方法,随着程序复杂度增加,print效率低下并且已经解码不了问题,对于nginx服务来说,core文件又该怎么调试呢?
答案就是GDB,引用一段官方描述,GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具,对于一名Linux下工作的c++程序员,gdb是必不可少的工具。
1.GDB调试普通可执行文件
g++ -g3 -o0 xxx 编译时加上-g3 -o0
gdb —args ./test xxx 带参数运行
gdb test 直接运行test
b main break,设置断点
b n 在第n行设置断点
r run,如果有错误会直接运行到错误处
step 单步调试
n 下一步
p xxx 打印信息
p (*(p+4))@6 打印p指向的第4个地址中6个字节的数据
bt 打印当前栈中的所有信息(函数调用时所有数据会压入栈中)
2.GDB调试core文件
程序down掉时,会在core文件中保存堆栈信息,需要加入-g来编译,可使用gdb来调试
sudo gdb xxx.core
sudo gdb xxx.core
bt 打印当前的函数调用栈的所有信息
up n 表示向栈的上面移动n层,可以不打n,表示向上移动一层。
down n 表示向栈的下面移动n层,可以不打n,表示向下移动一层。
p args 打印变量p的值
l 显示代码
l -10 显示上面10行的代码
l 10 显示下面10行的代码
set print pretty on 可以按行显示
3.Debug配置及debug实例
备注:需要使用Debug模式编译
- cmake生成的makefile可以添加debug选项
- 自行写的makefile可以加g++后加上-g3 -o3
linux系统下默认是不产生core文件的,对于nginx服务,需要进行配置,打开此功能;
ulimit -c unlimited 打开linux core文件功能
ulimit -a 查看是否已打开
worker_rlimit_core 4000M; 设置最大nginx core文件大小
working_directory xxx; 配置core文件目录
如果出现no debugging symbols found,说明没有加debug编译。
加上debug后再次编译,并加上断点(b),运行®。
习惯gdb后,代码调试效率有了质的飞跃,工欲善其事,必先利其器,对LINUX下C开发者来说,掌握GDB确实很有必要。
参考:
[1] https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html
[2] https://www.yanbinghu.com/2019/04/20/41283.html
[3] https://www.cnblogs.com/mister-lv/p/6022841.html