linux执行g 程序,linux命令g---gdb

文章目录

信息简介

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) 查看断点信息

370ed2554f0ecce92a5ae78df651b89b.png

设置断点菜单

当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。对基于GDB的自动化调试是一个强大的支持。

commands

c77c4438cc0c1c8afcc6a71028c9a35b.png

恢复程序运行和单步调试

当gdb挂到程序上时,或者命中断点时,程序停住。需要使用continue 或者c命令来使程序继续运行。

单步调试在有一种情况下很有用。堆栈被破坏,无法打印函数栈信息,单步可以比较靠近出现问题的地方。

当程序被停住了,你可以用c(continue)命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用s(step)或n(next)命令单步跟踪程序

c当程序被停住,c(continue)命令恢复程序运行,或者来到下一个断点

step单步跟踪,如果有函数调用,会进入该函数

next单步跟踪,如果有函数调用,不会进入该函数

until运行程序直到退出循环体

finish运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值,以及参数值等信息

bee967df6b0c8b45aafac6153a81ee83.png

2cd9cf27d633d6975787c3cdd4a1ecdd.png

查看程序信息

可以在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 打印变量信息

af0c5f81ba9af909982e7bb6115fed39.png

9a95a9fc25e4ecf533607cf928c2c040.png

查看内存

可以使用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修改变量的值

c24aa38fca2fc89aea470123ca054026.png

GDB批量执行命令

88807420165c5b216125290c4eafc669.png

在GDB中执行shell指令

b80e1cb777366134e14800767b5ff6c7.png

使用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 即可

ddb4ae320a00ae1d93cde941a3e86af9.png

46854539e4512f082dbcda8d625bc887.png

gdb调试release版本软件

2b0a41cdec90a9cecce982e3f84a8bbc.png

895a79f4f87bd0c8a096c231ad87b356.png

在线调试正在运行的程序

在线调试正在运行的程序

step1:修改Makefile。本例中:修改interface库的Makefile,将下面一句。CC := gcc -Wall –fPIC 修改为 CC := gcc -Wall –fPIC –g

step2:重新编译cli和库 (使用同一个版本和代码)

step3:调试新编译的文件,如果程序已经运行,则挂接到对于运行的进程。本例中,将CLI和库拷贝到设备上。注:CLI和库都不用覆盖原来的文件,任意放置一个目录即可。比如放到/home目录下

439577b2fa04c321db134fffda891a7b.png

807ad1c304c5fb1edad00b10f56132dd.gif

7443628b0808bf41c06574ee61e91166.png

学无止境966

发布了105 篇原创文章 · 获赞 6 · 访问量 7065

私信

关注

标签:查看,程序,GDB,命令,gdb,linux,断点,运行

来源: https://blog.csdn.net/qq_23929673/article/details/94047177

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值