运行(run/continue/next/step/until/finish/call/quit)
run(简写r): 运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入;
continue(简写c):继续执行,到下一个断点处(无断点即执行到结束或崩溃)
next(简写n): 单步跟踪程序,当遇到函数调用时,直接调用,不进入函数;
step(简写s):单步调试如果有函数调用,则进入函数,与命令n区分;
until:运行程序直到退出循环体; / until+行号: 运行至某行(退出循环)
finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。(退出函数)
call 函数(参数):调用函数并传递参数,如:call gdb_test(55)
quit:简记为 q ,退出gdb
断点
info breakpoints
设置断点(在某个函数入口或指定行号处)
break +函数名/行号 • 1
disable [breakpoints] [num…] #breakpoints 参数可有可无;num…表示可以有多个参数 #如果指定 num…,disable 命令会禁用指定编号的断点;反之若不设定 num…,则 disable 会禁用当前程序中所有的断点。 enable +num #可再次开启某号断点。
eg:
(gdb)dis 1 #表示禁用断点1
delete 断点号n:删除第n个断点 clear 行号n:清除第n行的断点
函数堆栈中进行调试
up #返回到达当前步骤的上一步
down #进入下一个堆栈中的函数
(gdb) backtrace [-full] [n]
(gdb)bt
跳转到堆栈中的某个函数
该命令会依次打印出当前栈帧的如下信息:
1、当前栈帧的编号,以及栈帧的地址;
2、当前栈帧对应函数的存储地址,以及该函数被调用时的代码存储的地址
3、当前函数的调用者,对应的栈帧的地址;
4、编写此栈帧所用的编程语言;
5、函数参数的存储地址以及值;
6、函数中局部变量的存储地址;
7、栈帧中存储的寄存器变量。
frame
eg :
f 2 #跳转到堆栈中 编号为2的函数中
打印信息
ctrl + x + a 快捷键可以浏览当前所在代码上下几行。
set args作为程序运行时参数
#include <stdio.h> int main(int argc,char**argv){ printf("argv[0] is %s\n",argv[0]); printf("argv[1] is %s\n",argv[1]); printf("argv[2] is %s\n",argv[2]); }
#调试运行结果 (gdb) set args hello world (gdb) r Starting program: /home/huqw/test/a.out hello world argv[0] is /home/huqw/test/a.out argv[1] is hello argv[2] is world
set还可以将变量的值进行修改,可以查看自己期待得到的结果
#include<stdio.h> int main(){ int a = 5; printf("a is %d\n",a); printf("a is %d\n",a); return 0; }
Breakpoint 1, main () at set_param.c:4 4 printf("a is %d\n",a); (gdb) n a is 5 5 printf("a is %d\n",a); (gdb) print a $1 = 5 (gdb) set var a=3 (gdb) print a $2 = 3 (gdb) n a is 3
查看某个变量或者表达式的值
print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a
watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a
查看某个内存地址中的值
x :查看内存地址中的值 x/[number][format] <addr> 其中number,format和u都是可选参数,addr为查看变量的内存地址
eg :
(gdb) print input (gdb) x/20 0x400c90 #表示查看0x400c90到向后0x400c90+20的内容
查看当前文件的程序语言
info source #会显示当前文件名,编译路径
分割窗口
layout