一、符号表

说明 gdb调试的前提是要有符号表。如果程序是release版本,符号表不全,则使用gdb调试时,不能单步调试,成员变量等信息不可查

如何生成符号表

编译代码时加上-g参数,则编译的程序中会带有当前程序的符号表。
如 gcc -o main main.c,则可对main程序进行单步调试


二、调试

假设有一进程test
gdb test //调试某一可执行程序
run(简写为r) //运行进程,假设有入参,则运行run argv


三、断点相关

1.设置断点

设置断点的命令为b

1
2
3
1)b function 将函数function设置为断点
2)b test.c:100 将文件的第100行设置为断点
3)b test.c:100 if tt = 1 将文件test.c的第100行作为断点,当tt等于1时停止
2,查看当前断点信息 info b
3,删除当前断点信息 delete 1 delete加断点的number,或者用d 1
4,使当前断点失效 disable 1 如果断点已失效 用enable 1时断点1继续生效
5,清除所有断点 clear

四、打印变量的值

1,print i 简写为p打印变量i的值

2,p/x i 以十六进制打印变量i的值 八进制(o),二进制(t)


五、调试基本命令

1,bt 查看当前栈空间信息
2,next 简写为n 进行单步调试
3,step 简写为s 遇到函数时进入函数
4,finish 结束当前函数
5,continue 简写为c,遇到断点继续执行用c ;c 3,忽略断点,直到第三次碰到断点
6,untill 简写为u,循环体直接退出
7,set i = 1 当前断点处设置变量i的值为1
8,info locals 显示当前所有局部变量

六、稍微高级点的用法

1,command

在断点处做处理,如下图,当i=5时,attach.c的第16行停住,执行的命令时打印i的值
command后面加数字代表的是对某个断点做command

command

2, frame 2 跳到2号栈框

frame

3,@ 数组打印用@,假设需要打印10个字符,变量为tt,则p@10
4,call 执行某个函数时用

call

6,set follow-fork-mode child/parent 当fork子进程需要跟子进程时用,或跟进父进程使用
7,gdb attach xx 跟进正在运行pid为xxx的程序
8,jump gdb可以改变程序的运行顺序

jump test.c:10 直接跳转到test.c的第10行运行,跳过中间代码
jump +10 直接跳转到当前断点后的第10行,跳过中间代码

9,return 强制返回,剩余代码不再还行
10, up 上移栈针,使上一个函数成为当前函数

七、多线程调试

  • info thread 查看所有线程信息
  • thread x 将程序跳到线程x的栈框
  • break thread_test.c:123 thread all 在所有线程中相应的行上设置断点
  • set scheduler-locking off|on 锁定当前线程,只调试当前线程

八、其他

  • list function 显示某个函数的源码
  • list 显示当前行后面的源程序
  • list - 显示当前行前面的源程序
  • show listsize 查看当前listsize的设置。
  • set listsize count 设置一次显示源代码的行数

九、实战应用

  • strace -f -tt -p [pid] -f 跟踪所有子进程和线程 -tt可以显示时间
  • top -Hp [pid] 可以查看一个进程所有线程的cpu使用情况
  • pstack [pid] 可以查看进程所有线程的调用栈
  • gdb, attach [pid]、info threads、thread [thread num]查看调用栈
  • strace -f -tt -c -p [pid] 加上-c 可以查看一定时间内系统调用的统计
  • ltrace -p [pid] 查看进程调用库函数的

————————————————
版权声明:本文为CSDN博主「qq_23953675」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23953675/article/details/106116247
原文链接:https://blog.csdn.net/qq_23953675/article/details/105291724