运行
gdb调试,编译时一定要加上-g选项,否则没有debug调试信息
- run(r),遇到断点处停止运行,等待下一步命令;
- continue(c),继续运行到下一个断点或结束;
- next(n),单步调试,遇到函数调用不进函数体,直接返回结果;
- step(s),单步调试,遇到函数调用进入函数体;
- until,在循环体调试时,可以直接跳出循环体;
- until+行号,运行至某行;
- finish,运行程序,知道当前函数结束返回值,打印返回时的堆栈地址和返回值及参数等信息;
- call 函数(参数),调用程序中可见的函数;
- quit(q),退出gdb。
设置断点
- break+行号(b+n),在第n行出设置断点;
- break+行号 if (条件语句) (b+n if (i>9)),条件断点,满足条件时停止;
- break+函数名(b+func),在函数的入口处设置断点;
- delete 断点号n,删除第n个断点;
- disable断点号n,暂停第n个断点;
- enable短点号n,开启第n个断点;
- clear 行号n,清除第n行断点;
- info b,显示当前程序的断点设置情况;
- delete breakpoints,清除所有断点;
查看源代码
- list(l),显示程序源代码,默认每次显示10行;
- list+行号,显示行号前后10行代源码;
- list+函数名,显示当前函数的源代码;
- list,接着上一次命令继续显示源代码;
打印表达式
- print 表达式(p+表达式);打印有效表达式的值,可以是函数调用;
- watch 表达式,设置一个监视点,表达式被改变,gdb将终止调试;
- whatis,查询变量和函数;
- info function,查询所有函数;
- info locals,显示当前堆栈页的所有变量;
- info args,显示当前函数的参数名及其值
- info line +“行号”,“函数名”,“文件名:行号”,“文件名:函数名”,显示函数运行时的内存地址
查看运行信息
- where/bt,显示当前运行的堆栈列表;
- bt backtrace,显示当前调用的堆栈;
- up/down 改变当前栈显示的深度;
- set args 参数,指定运行时的参数;
- show args 参数,查看设置的参数;
- info program,查看程序是否在运行,进程号,或被暂停的原因;
多窗口显示
- layout,分割窗口,一遍测试,一遍查看代码;
- layout src,显示源码;
- layout asm,显示反汇编;
- layput regs,显示源代码/反汇编和CPU寄存器;
- layout split,显示源代码和反汇编窗口;
- Ctrl+L,刷新窗口。
查看堆栈信息
- bt(backtrace):打印当前函数调用栈的所有信息,包括:栈的层编号,当前函数名,函数参数值,寒素所在的文件,行号和函数执行到的语句
(gdb) bt
#0 func (tmp=@0x7fffffffe0cc: 0) at test.cpp:20
#1 0x0000000000400968 in main () at test.cpp:28
-
bt n:只打印栈顶上n层的栈信息;
-
f n(frame):查看某n层栈的信息,n从0开始,若没有参数,n默认为0;
-
up n:向栈的上面移动n层,n从0开始,若没有参数,n默认为0;
-
down n:向栈的下面以用n层,n从 0开始,若没有参数,你默认为0;
-
disassemble:显示当前执行的机器码;
-
p 动态数组变量名@len:显示动态数组的值
-
info registers:查看寄存器的情况。(除了浮点寄存器)
-
info all-registers查看寄存器的情况。(包括浮点寄存器)
多线程调试
多线程编译时要加上 -lpthread选项
- info threads:查看当前可调试的线程,线程号前有*号,表示当前所在的线程;
- thread + 线程号:可以进行线程切换;
- gdb attach 主线程ID:将运行的线程加入到gdb中
- info inferiors:查看当前进程信息
- show scheduler-locking:查看当前线程锁定模式
- set scheduler-locking [on|off|step]:on锁定当前线程,off不锁定任何线程。step散步调试时会使用
- thread apply all bt:所有线程打印当先堆栈信息;
shell命令
- ps aux|grep a.out:查看当前运行的进程
- ps -aL|grep a.out:查看当前运行的轻量级进程
- pstree -p 主线程id:查看主线程和新线程的关系
- ps stack 线程ID:查看线程调用栈结构
详细讲解:
GDB实用插件(peda, gef, gdbinit)全解_OSKernelLAB(gatieme)-优快云博客_gdb gef