gdb 调试工具

"learning……"

Posted by Ryan on January 10, 2025

简单和规律确实能带来放松

安装gdb

ubuntu环境下用apt下载,centos只需要把apt替换成yum即可

1
2
sudo apt update
sudo apt install gdb

编译准备

正常编译,不带有gdb调试信息

1
g++ test.cpp -o test

加入gdb调试信息

1
g++ -g test.cpp -o test

gdb常用命令

如果希望程序可调试,编译时需要加入-g选项,且不能使用-O优化编译选项

常用调试命令

命令可以写全,也可以写简写

  • set args设置程序参数
  • b代表break命令,后面跟行号,例如17
  • r代表run命令
  • n代表next命令,执行当前语句,如果该语句是函数调用,不会进入函数内部
  • s代表step命令,执行当前语句,如果该语句是函数调用,进入函数内部,如果是第三方库,则不会进入,因为没有源代码
  • c代表continue命令,程序继续执行,如果遇到断点再次停止,如果没遇到就一直执行
  • p代表print命令,可以查看变量的值,如果p后面是表达式,还可以查看表达式的值
  • q代表quit命令,可以退出gdb
  • set val命令可以手动改变变量的值,例如set val i=8可以在循环内改变循环变量当前的值
1
2
3
4
5
6
7
8
9
10
(gdb) set args ryan xy iou
(gdb) b 17
(gdb) r
(gdb) n
(gdb) c
(gdb) s
(gdb) p name1
(gdb) p strlen(name1)
(gdb) q
(gdb) set val i=8

gdb调试core文件

如果程序运行过程中发生了内存泄漏,会被内核强制停止,提示“段错误(吐核)”,内存的状态保存在core文件中,方便分析

1
2
ulimit -a            //查看当前用户的资源限制参数
ulimit -c unlimited  //-c是core选项,在-a之后会展示所有可选选项,unlimited是改的数值,代表无限

完成以上设置后,当程序“挂掉”后,会产生“尸体”文件,即ls后发现多了core.8277这样类似的core文件,进入core命令如下

1
gdb demo core.8277   //gdb+程序+程序的“尸体”

进入之后输入以下命令可以查看函数调用栈,来定位程序在哪里挂掉

1
(gdb) bt

gdb调试运行中的程序

程序不动了,或者说从头开始模拟不出当前的运行环境,所以需要调试当前正在运行的程序

1
2
3
pidof demo1              //搜出进程编号
ps -ef|grep demo1        //搜出进程编号
gdb demo -p 38965        //gdb+程序名+进程编号,权限不够+sudo

如果调试,则程序会停下来,退出调试,程序继续运行
进入后与正常调试无二,可以用bt查看函数调用栈,各种常用命令