目录
2.10 以更详细的方式显示变量var的类型(pytype)
(1)查看系统是否有对 core 文件的限制(ulimit -a)
(2)编译生成core文件(gcc -g main.c -o main)
3.1 调试在运行中的进程 /(线程)gdb attach 主线程ID
6.2.1 follow-fork-mode detach-on-fork
6.2.3 运行程序,查看正在调试的程序 info inferiors
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
这样会显示当前所在的源代码文件信息,例如文件名称,程序语言等。