欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

gdb 调试工具

程序员文章站 2022-06-05 18:21:42
...

gdb 调试工具

 

gdb 概述

gdb , GNU Debugger ,用于在 linux 上 调试 c/c++ 程序,

 

参考:

ububtu gdb 指南

 

------

程序的编译

 

用 gcc 编译时,应加上 -g 参数,以让编译出的文件支持 gdb 调试,

 

格式:

gcc -g source_file

 

------

进入 gdb 

 

gdb file 进入 gdb 程序,对 file 进行调试,

 

------

gdb 下的 命令

 

* 程序显示

l , list

显示程序,继续向后显示,

l i , list i

显示 i 行 周围的程序,包括 上下各几行,

l 1

从第1行 开始显示程序,

l - fun_name

显示 函数的程序,

l -

向前显示程序,

l +

向后显示程序,同 l

show listsize

显示1次默认显示几行

set listsize i

设置默认显示 i 行,

 

* 断点

b i , break i

设置 i 行为断点

b fun_name , break fun_name

设置 函数 的入口为断点,

info b,info break

列出断点,第1列为断点编号

d i , delete i

删除 编号为 i 的 断点,

 

* 程序 调试 运行

r , run

运行程序

n , next

单步执行

c , continue

运行,直到下一个断点,或程序结束

s , step

单步进入,如果有函数调用,则进入该函数,

finish

跳出当前函数,返回上级函数,如果当前就是最外层函数则无效,

 

 

* 查看变量

p var_name

显示 变量值

p *array_name@len

显示 数组的值,len 等于数组的长度,可以指定其他值,如 len-1,2,

因为 *array_name 取得了 数组的首地址,数组内存是连续的,因此指定一个长度后,就可以取出连续的值,

例子:

p *arr@len 打印整个数组

p *arr@len-1 打印数组,不包含最后1个值,

p *arr@2 打印数组的前2个元素

info locals

列出 当前函数中,所有局部变量的值

info args

列出 当前函数中,所有参数的值

info catch

列出 当前函数中,异常处理信息

x , examine

显示 指定内存地址中的值

 

* 自动显示

display var_name

设置自动显示的 变量 或 内存地址的值,当程序停住时这些值就被自动显示,

display

显示 被自动显示的 列表,其中第1列时编号

undisplay i

根据编号取消 自动显示

 

* 观察点

watch exp

添加 观察点 - 值写入,当表达式 exp 的值写入时,停止程序,

rwatch exp

添加 观察点 - 值读取,当表达式 exp 的值被读取时,停止程序,

awatch exp

添加 观察点 - 读写,当表达式 exp 的值被 读 或 写 时,停止程序,

info watchpoints

显示所有的 观察点,其中第1列是编号,

delete watchpoint i

删除指定编号的 观察点,

 

* 函数堆栈

bt , backtrace

显示函数的调用堆栈,

f i, frame i

显示第 i 层栈的信息,i=0 表示栈顶,

up , up i 

显示向上 1 或 i 层 栈的信息,

down , down i 

显示向下 1 或 i 层 栈的信息,

info f,info frame

显示当先栈中更多的信息,

 

* 程序跳转

u , until

跳出循环体,

jump i

强制 跳转到第 i 行执行

return

强制 结束当前函数

call fun_name

强制 调用函数

 

* 退出 gdb

q

退出 gdb

 

* 历史命令

回车

重复 上次的命令

 

* 搜索

search xxx

搜索

 

* 寄存器

info registers

查看寄存器

 

 

* 其他

show language

显示当前程序的 语言

 

 

------