计算机系统讨论课(2) gdb调试常用指令

版权声明:嘤嘤嘤 https://blog.csdn.net/HNUCSEE_LJK/article/details/88692426

预先准备 

  • 编译:gcc –g file.c –o file  (-g: 在生成可执行文件时加入源码信息,使得生成的可执行文件能够进行调试)
  • 进入gdb调试gdb –q file  (-q: 不输出冗余信息)
  • 退出gdb调试:(gdb) quit

 

gdb常用命令

值得一提的是,输入指令时按下一下tab,会自动补全指令;若有多个指令作为候选,再按一下tab,就会出现所有可供选择的命令。

另外,执行一个指令后,按一下回车,表示重复上一次的命令。

  • help

输入help可查看命令的类别,输入help+类别可进一步查看相关的命令,是非常有用的指令。

以下是输入help后gdb展示的信息:

List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

  • 源码

list | l:查看10行源代码

list | l + 行号:查看从指定行开始的源代码

list | l + 函数名:查看指定函数的源代码

set listsize + 长度:命令自定义输出长度(最多一次性显示23行)

  • 断点

break | b + 行号或函数名:设置断点

clear + 行号或函数名:清除指定断点

delete | d + 断点编号:清除指定编号的断点(设置的每个断点都会按顺序分配好编号)

info breakpoints | i b:查看所有断点

  • 运行

 start | s:开始运行程序,并停留在main函数的第一条指令处

run | r:开始运行程序,并停留在设置的第一个断点处

next | n:执行下一行代码,遇到函数不会跟踪进入

step | s:执行下一行代码,遇到函数会跟踪进入

nexti | ni:执行下一行汇编代码,遇到函数不会跟踪进入

stepi | si:执行下一行汇编代码,遇到函数会跟踪进入

finish:连续运行到当前函数返回为止,无法在main函数中使用

  • 打印

print | p + 变量:查看变量的值。

比较特殊的是,打印字符串s时,由于s存储的是字符串的首地址,所以print s打印出来的是从s中存储的地址开始,向后若干个字节中的数据对应的ASCII字符。要只打印出字符串(即'\0'前的数据),需要在变量名前加上(char*),即print (char*)s。

print | p + $寄存器:查看寄存器的值

print | p + &变量或寄存器:查看变量或寄存器的地址

print后加斜杠/和一个参数(如p/f),可进行格式化输出。

  • x 或 a:按十六进制格式显示变量。
  • u:按十六进制格式显示无符号整型。
  • d:按十进制格式显示变量。
  • o:按八进制格式显示变量。
  • t:按二进制格式显示变量。
  • c:按字符格式显示变量。
  • f:按浮点数格式显示变量。
  • 信息

info breakpoints | i b:查看所有断点的信息

info locals | i locals:查看当前函数中变量的值

info registers | i reg:查看所有整数寄存器的值

  • 反汇编

disassemble | disass + 函数名:查看指定函数的汇编代码

比较初级的调试步骤大概是:

  1. 用list指令查看源代码
  2. 根据源码用break设置断点
  3. 用start或run运行程序
  4. 用next或step执行下一行代码(如果是汇编代码,用nexti或stepi)
  5. 在程序的运行过程中通过print或info locals查看变量的值(如果是汇编代码,用info registers)

猜你喜欢

转载自blog.csdn.net/HNUCSEE_LJK/article/details/88692426