GDB调试学习

目录

一、gdb调试简介及常用命令

1、编译代码并启动gdb

 2、调试选项

2.1 查看源码(list,l)

 2.2 设置断点(break,b)

2.3 运行程序(run,r)

2.4 start

2.5 单步调试(next,n)

2.6 执行多行代码(continue,c)

2.7 打印变量的值(print,p)

2.8 自动打印变量的值(display,d)

2.9  whatis 查看变量类型

2.10 以更详细的方式显示变量var的类型(pytype)

2.11 删除断点 delete

2.12 结束当前函数(finish)

2.12 结束前循环(until ,u)

2.13 启用/禁用断点

2.14清除 N行上面断点(clear)

2.15 终止一个正在调试的程序 (kill)

2.16 调用函数 call func(参数)

2.17 内存断点 watch

三 其它选项

1.查看当前函数的程序语言

2.显示当前的调试源文件

3.手动设置当前的程序语言为c++

4. 查看可以设置的程序语言

6 分割窗口

四、gdb调试core dump文件

1、core dump是什么

2、常见 core dump 错误

3、gdb调试过程

(1)查看系统是否有对 core 文件的限制(ulimit -a)

(2)编译生成core文件(gcc -g main.c -o main)

(3)调试core文件(gdb main core)

 

五、gdb调试多线程

1、查看进程和线程信息

2. 线程栈结构的查看

3、利用gdb查看线程信息

3.1 调试在运行中的进程 /(线程)gdb attach 主线程ID 

3.2 查看线程的一些信息

4. 利用gdb调试多线程

1) 设置断点

2). 执行线程2的函数,指行完毕继续运行到断点处

3). 只运行当前线程

4)所有线程并发执行

5)总结调试多线程的命令

六、多进程调试

6.1 调试代码

 6.2 调式

6.2.1 follow-fork-mode detach-on-fork

6.2.2 分别在子进程和父进程相应位置下断点

6.2.3 运行程序,查看正在调试的程序 info inferiors

6.2.4 切换调试的进程 inferior

6.2.5 添加新的调试进程 add-inferior 

6.2.6 删除调试进程 remove-inferiors

6.2.7  拷贝进程

6.2.8 detach inferior

6.2.9 kill inferior infno

6.2.10 set schedule-multiple on|off

6.2.11 set follow-exec-mode new|same

6.2.12 set print inferior-events on|off 

6.2.13 maint info program-spaces


一、gdb调试简介及常用命令

1、编译代码并启动gdb

gcc -g test.c -o test
//-g选项告诉gcc在编译程序时加入调试信息
//没有这个选项就会报错:No symbol table is loaded. Use the "file" command
 gdb -q test//启动gdb,加上-q选项屏蔽掉版本等无用信息

 2、调试选项

2.1 查看源码(list,l)

查看源程序代码,默认显示10行,按回车键继续看余下的。

list 5,10   //显示第5行到第10行的代码;
list func   //显示func函数周围的代码,显示范围和list参数有关;
list test.c:5,10  //显示源文件test.c第5行到第10行的代码,一般用于调试含多个源文件的程序。

 2.2 设置断点(break,b)

break(简写 b) :b {行号/filename:行号/funcname/行号 if ifcondition}

break 14     // 在当前文件的第 14 行设置断点
break shell_sort.cpp:12 // 在其它文件指定行设置断点
b print   // 在函数 print() 处设置断点
break 7 if n==6 // if语句满足后在行号处打断点(通常用于循环,断点不要打在判断条件上)
info break 获取断点信息
info breakpoints  // 查看所有断点信息 简写:i b

info breakpoints :显示断点信息

(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
3       breakpoint     keep y   0x0000000000400836 in main at write.c:5
4       breakpoint     keep y   0x00000000004008a6 in main at write.c:26
5       breakpoint     keep y   0x00000000004008c6 in main at write.c:30
(gdb) 
  • Num: 断点编号
  • Disp:断点执行一次之后是否有效 kep:有效 dis:无效
  • Enb: 当前断点是否有效 y:有效 n:无效
  • Address:内存地址
  • What:位置 

2.3 运行程序(run,r)

重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件)

执行被调试的程序,其会自动在第一个断点处暂停执行。

 run     // 开始执行程序

2.4 start

start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。

程序执行过程中使用 run 或者 start 指令,表示的是重新启动程序。

2.5 单步调试(next,n)

逐过程,函数直接执行即不进入函数内步

next    // 继续执行下一条语句,只执行一条。
next num //执行num次下一步

2.6 执行多行代码(continue,c)

continue  // 让程序继续运行,直到下个断点或者结束

2.6 单步调试,跳入自定义函数内部(step,s)

2.7 打印变量的值(print,p)

print i   // 用print命令打印出i的值
print &i  //打印变量的地址
print *i  //打印地址的数据值
print *a@10   //如果a是一个数组,10个元素,会显示10个元素,无论a是double或者是int的都会正确地显示10个元素
print gdb_test(22) //将以整数22作为参数调用 gdb_test() 函数
print gdb_test(a)  //将以变量 a 作为参数调用 gdb_test() 函数

p 还能修改变量的值

print i=2

2.8 自动打印变量的值(display,d)

undisplay:取消追踪观察变量

使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会

display i // 自动打印i的值

2.9  whatis 查看变量类型

(gdb) whatis fd
type = int

2.10 以更详细的方式显示变量var的类型(pytype)

(gdb) ptype var    //这里,会打印出var的结构定义。 

2.11 删除断点 delete

这里的N是断点编号

delete 13(断点编号)
delete 1-10
delete          //删除所有断点

2.12 结束当前函数(finish)

结束当前函数,返回到函数调用点

finish

2.12 结束前循环(until ,u)

until   //结束当前循环
until+行号: 运行至某行,不仅仅用来跳出循环

2.13 启用/禁用断点

disable         //禁用所有断点
enable          //启用所有短点
disable 5
disable 5 10   //启用5和10断点
enable once    //下次用了就被禁用

2.14清除 N行上面断点(clear)

这里的N是行号

clear N
clear       //删除所选定的环境中所有的断点

2.15 终止一个正在调试的程序 (kill)

输入kill就会终止正在调试的程序了

2.16 调用函数 call func(参数)

调用程序中可见的函数,并传递“参数”,如:call gdb_test(55)

2.17 内存断点 watch

1.  watch 变量的类型
    a. 整形变量: int i; watch i;
    b. 指针类型:  char *p; watch p, watch *p;
    它们是有区别的.
      watch p 是查看 *(&p), 是p 变量本身。
      watch (*p) 是 p 所指的内存的内容, 查看地址,一般是我们所需要的。

      我们就是要看莫地址上的数据是怎样变化的,虽然这个地址具体位置只有编译器知道。
    c. watch 一个数组或内存区间
    char buf[128], watch buf,  
    是对buf 的128个数据进行了监视. 此时不是采用硬件断点,而是软中断实现的。
    软中断方式去检查内存变量是比较耗费cpu资源的。
    精确的指明地址是硬件中断。

2. 当你设置的观察点是一个局部变量时。局部变量无效后,观察点无效
 Watchpoint 2 deleted because the program has left the block in
  which its expression is valid.
 

退出gdb(quit,q)

三 其它选项

1.查看当前函数的程序语言

(gdb) info frame

2.显示当前的调试源文件

(gdb) info source

这样会显示当前所在的源代码文件信息,例如文件名称,程序语言等。 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值