GDB调试的探讨
爷来填坑辣。
PS:本Blog仅介绍本人常用用法,如有其他请在下面补充。
GDB 是什么
一种常见调试工具。
GDB 怎么下
自行百度搜索。
GDB 的使用
最开始,请在你的编译语句后面加一个 -g
。
开始的开始
首先,使用 gdb A
进入gdb并打开A。
当然,下面的也可以:
gdb
file A #确保这句话在gdb中运行
下面是一些常用命令(括号中为缩写):
list(l)
列出程序源代码(默认显示共上下10行)。
-
l main
显示在main
附近的上下共10行代码。 -
l 23
显示在第23行附近的上下共10行代码。 -
l
接着显示没显示完的代码。
break(b)
设置断点。
-
b main
在main
函数入口设置断点 -
b 712
在第712行设置断点。 - 貌似后面还能加判断语句,但是我没用过。
clear
删除断点。
-
clear main
删除在main
函数入口的断点 -
clear 712
在删除在第712行的断点。
run(r)
运行程序直到程序结束运行或遇到断点。
continue (c)
在程序遇到断点后继续执行,直到程序结束运行或到达下一个断点。
-
c 5
跳过5次。 - 貌似后面还能加判断语句,但是我没用过。
next (n)
next(n):执行当前行语句,如果当前行有函数调用,则将其视为一个整体执行。
-
n 5
执行5次。 - 貌似后面还能加判断语句,但是我没用过。
step (s)
执行当前行语句,如果当前行有函数调用,则进入该函数内部。
finish(fin)
继续执行至当前函数返回。
call
调用某个函数。
-
call f(n)
以参数n
调用函数f
。
quit(q)
退出 gdb。
print(p)
打印表达式的值。
-
p a
打印a
的值。 -
p *s@n
打印数组s
前n
位(包括第0位)的全部值。 -
p (某个STL容器)
打印容器中全部元素。
display(disp)
指定程序暂停时显示的表达式。
-
delete display a
删除编号为a
的表达式(注意,是编号)。 - 除删除外,同
print
。
附录
直接按回车会运行上次的输入。
- 例如上次输的是
n
,直接按回车会运行n
。
关于 @
这个就是显示在某个地址的后几位。
-
例如输的是
a[1]@10
就会输出a[1]
到a[10]
, -
例如输的是
*a@10
就会输出a[0]
到a[9]
。
if
的使用就是加在 c / b
后面。
- 例如输的是
b pushup if x==5
就会只在x==5
的时候才在pushup
函数停下来。
描述部分引用于OI Wiki。