GDB调试
- 安装GDB
1.1 源码安装
1.1.1 http://ftp.gnu.org/gnu/gdb/下载gdb源码包,或者wget http://ftp.gnu.org/gnu/gdb/gdb-8.0.1.tar.gz命令下载代码
1.1.2 tar -zxvf gdb-8.0.1.tar.gz
1.1.3 ./configure
1.1.4 make
1.1.5 sudo make install
1.1.6 查看是否安装成功 gdb -v
1.2 命令安装
1.2.1 #sudo apt-get update
1.2.2 #sudo apt-get install gdb
2. 快速入门
2.1 vi一段代码
#include <stdio.h> int main() { int a = 1; int b = a; printf("a = %d, b =%d\n", a, b); return 0; }
2.2 带调试信息编译
gcc –o demo demo.c -g
2.3 进入GDB
gdb demo
2.4 加断点
breakpoint demo.c:8
3. 常用命令
命令 |
描述 |
backtrace(bt) |
查看各级函数调用及参数 |
finish |
连续运行到当前函数返回为止,然后停下来等待命令 |
frame(f) 帧编号 |
选择栈帧 |
info(i) locals |
查看当前栈帧局部变量的值 |
list(l) |
列出源代码,接着上次的位置往下列,每次列十行 |
list 行号 |
列出第几行开始的源代码 |
list 函数名 |
列出某个函数的源代码 |
next(n) |
执行下一行语句 |
print(p) |
打印表达式的值,通过表达式的值可以修改变量的值或者调用函数 |
quit(q) |
退出gdb调试环境 |
set var |
修改变量的值 |
start |
开始执行程序,停在main函数第一行语句前面等待命令 |
step(s) |
执行下一行语句,如果有函数则进入到函数中 |
break(b) 行号 |
在某一行设置断点 |
break 函数名 |
在某个函数开头设置断点 |
break(b)… if… |
设置条件断点 |
continue(c) |
从当前位置开始连续运行程序 |
delete breakpoints 断点号 |
删掉此号的断点 |
display 变量名 |
跟踪查看某个变量,每次停下来都显示它的值 |
disable breakpoints 断点号 |
禁用此断点 |
enable 断点号 |
启用此断点 |
info(i) breakpoints |
查看当前设置了哪些断点 |
run(r) |
从头开始连续运行程序 |
undisplay 跟踪显示行号 |
取消跟踪显示 |
watch |
设置观察点 |
info(i) watchpoints |
查看当前设置了哪些观察点 |
x |
从某个位置开始打印存储单元的内容,全部当成字节来看,而不区分哪个字节属于哪个变量 |
disassemble |
反汇编当前函数或者指定的函数,单独用disassemble命令是反汇编当前函数,如果disassemble命令后面跟函数名或地址则反汇编指定的函数 |
si | 可以一条指令一条指令地单步调试。 |
info registers | 可以显示所有寄存器的当前值。在gdb中表示寄存器名时前面要加个$,例如p $esp可以打印esp寄存器的值。 |
set args 'command-line' | 给执行的程序传命令行参数 |
set follow-fork-mode child/parent | 设置gdb在fork之后跟踪子进程/父进程 |
s(stepin) | 进入子函数 |
4. attach调试
1. ps aux查看系统进程pid
2. gdb attach pid进入调试改程序
5. 推荐链接:
1. https://www.kancloud.cn/wizardforcel/gdb-tips-100/146708