用惯了cmake IDE,基本上忘记了gdb的常用命令,但是老的项目用Makefile维护的,只能在dev env进行调试,完全靠printf效率极低,复习并分享下gdb命令,发现网上的资料相当少,质量也不高。
准备
代码文件
TestDbg.cpp
内容如下
//
// Created by laven.xu on 2021/12/2.
//
#include <iostream>
#include <cstdio>
int sum();
int main(int argc, char * argv[]) {
printf("----- hello ------\n");
int sumRet = sum();
//---------------------------------------------------
printf("sumRet = %d\n", sumRet);
return 0;
}
int sum()
{
int sum = 0;
for (int j = 0; j < 100; j++)
{
sum += j;
}
return sum;
}
编译 g++ -g -o test TestDbg.cpp
杀死进程 ps -ef|grep test |grep -v grep| cut -c 9-16 | xargs sudo kill -9
调试
下文命令基本按照使用习惯进行排序分类
+++
运行
run
会直接打印结果,没有任何断点阻塞
+++
打断点
b TestDbg.cpp:13
b funcname
++++
首次运行可以传参
(gdb) run boy girl
Starting program: /home/dev/test/test boy girl
show args看传入的参数列表
+++++
Reading symbols from /home/dev/test/test...done.
(gdb) b TestDbg.cpp:14
Breakpoint 1 at 0x400799: file TestDbg.cpp, line 14.
(gdb) r
Starting program: /home/dev/test/test
----- hello ------
//断点已生效
Breakpoint 1, main (argc=1, argv=0x7fffffffe308) at TestDbg.cpp:14
13 int sumRet = sum()
++++
list
默认上五行下五行
list 行数
list start,end
++
进入函数内部
step
执行完本函数并退出
finish
return value
停止当前函数并返回调用者
+++
c
继续运行
单步执行
n
+++
watch
(gdb) watch sum
Hardware watchpoint 2: sum
(gdb) c
Continuing.
Hardware watchpoint 2: sum
Old value = 3
New value = 6
main (argc=1, argv=0x7fffffffe308) at TestDbg.cpp:12
12 for (int j = 0; j < 100; j++)
(gdb) print j
$8 = 3
+++
print j
$6 = 3
(gdb) print sum
$7 =
+++
info func、files
info local 显示局部变量
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400799 in main(int, char**) at TestDbg.cpp:14
breakpoint already hit 8 times
2 hw watchpoint keep y sum
breakpoint already hit 2 times
++++
(gdb)
disable 第几个断点
delete 第几个断点
++++
(gdb) ptype
显示定义类型
+++
设置局部变量
(gdb) set j=12
“乐分享从我做起!改变自己!!方便他人!!!”,如果你觉得有帮忙请点赞收藏,同时也欢迎您再评论区交流!-- Thanks, Laven