GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具。
生出调试信息
1 | gcc -g hello.c -o hello |
coredump配置
- 建立储存coredump文件的文件夹:
mkdir ~/corefile
- 查看,设置coredump文件大小:
ulimit -a
ulimit -c unlimited
- 执行以下两条命令:
echo "1" > /proc/sys/kernel/core_uses_pid
// 将1写入到该文件里echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
- 修改配置文件
/etc/profile
- 修改
ulimit -S -c 0 > /dev/null 2>&1
为ulimit -S -c unlimited > /dev/null 2>&1
。没有则直接添加。 - 执行命令生效该文件:
source /etc/profile
- 修改
- 检查配置是否生效:
kill -s SIGSEGV $$
启动gdb调试的方法
1 | $gdb <program> |
2 | $gdb <program> <core dump file> /* core文件 */ |
3 | $gdb <program> <pid> /* 运行中程序的进程号 */ |
程序运行上下文
运行参数设置
set args
可以指定运行时参数(gdb a.out
set args 10 20
).show args
查看设置好的运行参数.- 不指定运行参数运行
run(r)
. - 指定运行参数
r 1 2 30
.
显示源代码
list
list "文件名.后缀名":行号(显示别的文件)
show listsize
set listsize count
search text
:该命令可显示在当前文件中包含text串的下一行。reverse-search text
:该命令可以显示包含text 的前一行。
设置断点
break
设置断点,可以简写为b
.b 10
设置断点,在源程序第10行.b func
设置断点,在func函数入口处.
条件断点
break args if (condition)
()
可选。
1 | break main if argc > 1 |
2 | break if (i == 7000) |
3 | break test.c:34 if (x & y) == 1 |
多文件断点
break filename:linenum
查询断点
info b
观察点
watch
为表达式(变量)expr设置一个观察点。当表达式值有变化时,马上停住程序。rwatch
表达式(变量)expr被读时,停住程序。awatch
表达式(变量)的值被读或被写时,停住程序。info watchpoints
列出当前所设置了的所有观察点。
维护断点
delete 断点号n
:删除第n个断点disable 断点号n
:暂停第n个断点enable 断点号n
:开启第n个断点clear 行号n
:清除第n行的断点delete breakpoints
:清除所有断点
调试代码
运行程序
run
运行程序,可简写为rnext
单步跟踪,函数调用当作一条简单语句执行,可简写为nstep
单步跟踪,函数调进入被调用函数体内,可简写为sfinish
退出函数until
在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u。continue
继续运行程序,可简写为cinfo program
来查看程序的是否在运行,进程号,被暂停的原因。quit
:简记为 q ,退出gdb
打印表达式
print 打印变量、字符串、表达式等的值,可简写为p。
print h@10
数组首地址@数组长度。
查看运行信息
whatis
命令可以显示某个变量的类型where/bt
:当前运行的堆栈列表;frame
info program
: 来查看程序的是否在运行,进程号,被暂停的原因。
窗口
Ctrl+x+a
- (focus)fs next在src和cmd之间切换外,还可以使用fs src切换到src,和fs cmd切换到cmd
layout
:用于分割窗口,可以一边查看代码,一边测试:layout src
:显示源代码窗口layout asm
:显示反汇编窗口layout regs
:显示源代码/反汇编和CPU寄存器窗口layout split
:显示源代码和反汇编窗口Ctrl + L
:刷新窗口