GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具。
生出调试信息
1 | gcc -g hello.c -o hello |
coredump配置
- 建立储存coredump文件的文件夹:
mkdir ~/corefile - 查看,设置coredump文件大小:
ulimit -aulimit -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.outset args 10 20).show args查看设置好的运行参数.- 不指定运行参数运行
run(r). - 指定运行参数
r 1 2 30.
显示源代码
listlist "文件名.后缀名":行号(显示别的文件)show listsizeset listsize countsearch 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:当前运行的堆栈列表;frameinfo 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:刷新窗口