1、信息显示
-
设置启动时不显示提示信息
gdb -q 或在 ~/.bashrc中为gdb设置一个别名。
-
设置gdb在退出时不显示提示信息
set confirm off(可以把这个命令加到.gdbinit文件里)。
-
设置输出信息多时不会暂停输出
set pagination off 或 set height 0。
2、函数
-
列出函数名字
info functions 可列出可执行文件的所有函数名。
该命令也支持正则表达式,info functions regex 会列出符合正则表达式的函数名称。
-
进入带调试信息的函数
step(缩写为s)进入函数。
next(缩写为n)不进入函数,继续执行下一行。
-
进入不带调试信息的函数
gdb默认不会进入不带调试信息的函数,可执行"set step-mode on"命令,这样gdb就不会跳过没有调试信息的函数,接下来可以使用调试汇编程序的办法去调试函数。
-
退出正在调试的函数
当单步调试一个函数时,如果不想继续跟踪下去了,有两种退出方式。
- finish命令,此时函数会继续执行完。
- return命令,此时函数不会执行下面的代码而直接返回。
-
直接执行函数
call 或 print命令可以直接调用函数执行。
-
打印函数堆栈帧信息
info frame 或 i frame命令显示函数堆栈帧信息。
-
选择函数堆栈帧
当程序断掉后,通过 bt 命令来查看堆栈信息,可以用 frame n 命令选择函数堆栈帧,也可以用 frame addr 命令选择函数堆栈帧,其中addr是堆栈地址。
3、断点
-
在文件行号上打断点
在当前文件中的某一行打断点:b linenum,
也可以显示指定文件:b file:linenum
注意:通过行号设置断点时,如果更改了源程序,那么之前设置的断点就可能不是想要的了。
-
设置临时断点
可以使用 tbreak/tb linenum 命令来设置临时断点,该断点只生效一次后被删除。
-
设置条件断点
可使用 break linenum if cond 命令来设置条件断点,只有当条件满足时,断点才会被触发。
-
忽略断点
ignore bnum count 命令忽略断点,代表接下来的count次编号为bnum断点都不会让程序中断。
4、观察点
-
设置观察点
gdb可以使用 “watch variable” 或 “watch *(dataType*)address” 命令设置观察点,即当一个变量值发生变化时,程序会停下来。
-
查看断点
info watchpoints列出当前所设置了的所有观察点。
-
设置观察点只针对特定线程生效
可以使用 “watch variable thread threadnum” 命令来设置观察点只针对特定线程生效,也就是只有编号为threadnum的线程改变了变量的值,程序才会停下来,其他编号线程改变变量的值不会让程序停住。
-
设置读观察点
gdb可以使用 "rwatch/rw variable " 命令设置读观察点,即当发生读取变量行为时,程序就会暂停。“rwatch” 命令只对硬件观察点才生效。
-
设置读写观察点
命令 “awatch/aw variable” 设置读写观察点,当发生读取变量或改变变量值的行为时,程序就会暂停。
5、打印
-
打印ASCII和宽字符字符串
“x/s str” 命令打印ASCII字符串。如果当前平台宽字符的长度为4个字节,则用 “x/ws” 命令,如果是2个字节,则用 “x/hs” 命令。
-
打印STL容器内容
gdb 7.0之后可通过命令 “info pretty-printer” 来改善显示结果。
-
打印大数组中的内容
通过命令 “set print element 0” 或 “set print elements unlimited” 来设置输出为没有限制。
-
打印数组中任意连续元素值
如果要打印数组中任意连续元素的值,可以使用 “p array[index]@num” 命令,其中index是数组索引,num是连续多少个元素。如果要从数组开头打印连续的值,可以使用命令 “p *[array]”。
-
打印数组的索引下标
当打印一个数组时,默认是不打印下标的,可通过命令 “set print array-indexes on” 来进行打印显示下标设置。
-
打印函数局部变量的值
如果要打印函数局部变量的值,可以使用 “bt full” 命令显示各个函数的局部变量。
也可以使用 “bt full n” 来从内到外显示n个栈帧及其局部变量。
而 “bt full -n” 是从外向内显示n个栈帧及其局部变量。
“info locals” 只打印当前函数局部变量的值。
-
打印静态变量
如果在gdb中直接打印静态变量,则结果并不一定是想要的,可以通过显式指定文件名来调试。
-
打印变量的类型
可通过命令 “whatis variable” 来查看变量的类型,如果想查看详细的类型信息,可通过 “ptype variable” 来查看。
-
打印内存的值
gdb中使用“
x
”命令来打印内存的值,格式为“x/nfu addr
”。含义为以f
格式打印从addr
开始的n
个长度单元为u
的内存值。参数具体含义如下:
a)n:输出单元的个数。
b)f:是输出格式。比如x
是以16进制形式输出,o
是以8进制形式输出,等等。
c)u:标明一个单元的长度。b
是一个byte
,h
是两个byte
(halfword),w
是四个byte
(word),g
是八个byte
(giant word)。
6、多进程
-
调试已经运行的进程
- 命令 “gdb process processID” 可以调试已经运行的进程,processID可以使用 “ps” 命令来获取进程ID。
- 使用 “gdb attach processID” 命令来附加在进程上。两种方式都可使用 “detach” 命令脱离进程。
-
调试子进程
gdb调试多进程程序时,gdb默认会追踪父进程,如果要调试子进程,要使用命令 “set follow-fork-mode child”。
-
同时调试父进程和子进程
如果要同时调试父进程和子进程,可以使用 “set detach-on-fork off”(默认是on) 命令,这样gdb就能同时调试父子进程,此时可以使用 “i inferiors” 命令查看进程状态,当父进程退出后,用 “inferior infno” 命令切换到子进程去调试。如果想让父子进程都同时运行,可以使用 “set schedule-multiple on” (默认是off)命令。
7、多线程
-
查看线程信息
用gdb调试多线程时,可以使用 “i threads” 命令查看所有线程的信息。
-
不显示线程启动和退出信息
默认情况下gdb检测到线程产生和退出时,会打印提示信息。可以使用 “set print thread-events off” 命令来不显示打印信息。
-
只允许一个线程运行
gdb在调试多线程时默认是所有线程同时运行的,如果只想调试一个线程可以使用命令 “set scheduler-locking on” 命令,让其它线程暂停运行。
-
打印所有线程的堆栈
使用命令 “thread apply all bt” 打印所有线程的堆栈。
8、core dump文件
-
设置生成core dump文件
- 使用 “ulimit -c unlimited” 命令设置系统生成core文件的大小为不限制。
- 通过 “ulimit -a” 命令查看设置是否成功。
- 运行程序,当发生错误时会生成core文件,具体core文件名为core.processID。
-
加载调试core文件
使用命令 “gdb program core文件” 来恢复程序出错现场,使用 “bt” 查看调用堆栈来定位出问题的具体信息。