文章目录
信息简介
gdb是什么
GDB 是GNU计划的调试器。当一个程序正在运行时,它允许你查看程序内部的信息;当一个程序崩溃时,它允许你查看在崩溃的时刻程序的信息
作用
1、程序正在运行时,gdb允许你观察程序的内部运行情况。也可以让你查看,当程序崩溃时,正在做什么
2、启动你的程序,可以按照自定义的要求随心所欲的运行程序
3、让程序在指定的条件下停止下来
4、当程序停下来以后,检查程序中所发生的事情
5、改变你的程序的运行,这样你可以将一个程序的bug修正,从而测试其他bug
主页
http://www.gnu.org/software/gdb/
资料
ftp://sourceware.org/pub/gdb/releases/
GDB常用命令
b设置断点
backtrace(或bt)查看函数调用关系
finish连续运行到当前函数返回为止,然后停下来等待命令
frame(或f)帧编号选择栈帧???
info(或i) locals查看当前栈帧局部变量的值
list(或l)列出源代码,接着上次的位置往下列默认10行
list 行号列出第几行开始的源代码
list 函数名列出某个函数的源代码
next(或n)执行下一行语句
print(或p)打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q)退出gdb调试环境
set var修改变量的值???
run(或r)开始执行程序
step(s)执行下一行语句,如果有函数则进入到函数中
启动gdb
使用gdb调试程序,被调试的程序一定要带有调试信息
(1)、编译时带 –g参数
(2)、编译选项中不带优化参数 (-O2)
gdb
program也就是你的执行文件,一般在当前目录下,也可以指定绝对路径。
gdb core
用gdb启动一个程序并指定core文件,core是程序非法执行后core dump后产生的文件。
gdb
如果你的程序是一个正在运行的程序,那么你可以指定这个程序运行时的进程ID。gdb会自动attach上去,并调试他。它与gdb 然后输入attach 效果一样
gdb attach pid 等价于 gdb a.out pid
设置断点
调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。
断点可以帮助你:
1、判断程序是否调用某个函数 (iRAID集成测试)
2、判断是否进入某个分支
3、某个函数是否存在。(不确定是否更新了可执行文件)
当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。
信号时实现断点功能的基础。以X86为例,向某个地址打入断点,世纪上就是往该地址写入断点指令INT3,及0xCC。目标程序运行到这条指令之后,就会触发SIGTRAP信号,gdb捕捉到这个信号,就根据目标程序当前停止位置查询gdb维护的断点链表,若发现该地址缺失存在断点,则可以判定断点命中
进入函数前的断点:可以使用b *function来完成。
断点设置与删除:
b function进入某函数前设置断点
b linenumer在某行设置断点
b filename.c:linenumer 在某个文件的某行设置断点
b address 在某个地址设置断点
b confition 满足某个条件后设置断点
编译时带-g参数
d 断点id 删除指定断点
d 删除所有断点
info b(breakpoints) 查看断点信息
设置断点菜单
当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。对基于GDB的自动化调试是一个强大的支持。
commands
恢复程序运行和单步调试
当gdb挂到程序上时,或者命中断点时,程序停住。需要使用continue 或者c命令来使程序继续运行。
单步调试在有一种情况下很有用。堆栈被破坏,无法打印函数栈信息,单步可以比较靠近出现问题的地方。
当程序被停住了,你可以用c(continue)命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用s(step)或n(next)命令单步跟踪程序
c当程序被停住,c(continue)命令恢复程序运行,或者来到下一个断点
step单步跟踪,如果有函数调用,会进入该函数
next单步跟踪,如果有函数调用,不会进入该函数
until运行程序直到退出循环体
finish运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值,以及参数值等信息
查看程序信息
可以在gdb中执行shell命令
Info命令
info thread查看当前程序的进程号
Info frame
Info functions
info breakpoints
info locals 查看当前变量信息
线程和frame的切换
thread id frame fid
查看堆栈信息
where bt info stack
where 查看当前程序在那个函数中
p arg 打印变量信息
查看内存
可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
x/
n、f、u是可选的参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
表示一个内存地址。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
改变程序的运行
GDB修改变量的值
GDB批量执行命令
在GDB中执行shell指令
使用gdb解决段错误
段错误
所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间。
coredump介绍
通常情况下,coredump文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等;可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。
core文件
查看core文件的大小 ulimit –c
修改core文件的大小 ulimit –c size
gdb hcli之后如何添加后续执行参数
r ceph pool list --disk --name ceph -s abc -p 1 -m 100 -d pool0 即可
gdb调试release版本软件
在线调试正在运行的程序
在线调试正在运行的程序
step1:修改Makefile。本例中:修改interface库的Makefile,将下面一句。CC := gcc -Wall –fPIC 修改为 CC := gcc -Wall –fPIC –g
step2:重新编译cli和库 (使用同一个版本和代码)
step3:调试新编译的文件,如果程序已经运行,则挂接到对于运行的进程。本例中,将CLI和库拷贝到设备上。注:CLI和库都不用覆盖原来的文件,任意放置一个目录即可。比如放到/home目录下
学无止境966
发布了105 篇原创文章 · 获赞 6 · 访问量 7065
私信
关注
标签:查看,程序,GDB,命令,gdb,linux,断点,运行
来源: https://blog.csdn.net/qq_23929673/article/details/94047177