gdb调试(指令积累)

一、开启gdb调试

gdb + 文件名

二、r  运行

三、b 设置断点

可以给函数名下断点,也可以给行号下断点,也可以设置条件断点

 

删除断点:

1、Clear

Clear 删除指定位置处的所有断点

Clear + 行号

2、delete 

delete 删除编号为2的断点

3、disable 

禁用断点

所谓禁用,就是使目标断点暂时失去作用,必要时可以再将其激活,恢复断点原有的功能。

disable breakpoint [n] :禁止指定断点
enable breakpoint [n] :允许指定断点

 

四、q 停止调试

 

五、file命令加载程序

注意,使用file的前提好像是需要在编译时加入 -g 选项,创建符号表

 

六、list 命令(l)

显示代码,注意,使用list前必须使用file加载程序

  

七、c

Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。

 

八、s

Step into 单步步入

 

九、n

相当于step over 单步跟踪

 

十、ni与si

使用si和ni,与s与n的区别在于:s与n是C语言级别的单步调试,si与ni是汇编级别的单步调试。

 

十一、info 打印详细信息

比如:

1、info registers  显示寄存器的信息

 

2、Info b 显示断点信息

 

3、Info line 查看运行到了第几行

 

 

4、info win 显示窗口的大小

 

 

 

十二、p

Print 命令 ,打印指定变量(临时变量或全局变量)的值

P /d  以10进制的方式查看

 

十三、x

1、演示

X指令显示指定地址的数据

 

图中x /1dg 1,表示显示一个存储单元 ,d表示以10进制的形式显示,g表示一个存储单元有8字节

 

2、格式:x/<n/f/u>  <addr>

n 表示存储单元的个数 即从当前地址向后显示n个内存单元的内容

f 表示数据输出的格式

u表示一个存储单元所占的字节

 

对于f数据输出的格式:

 

x表示输出为16进制

d表示输出为10进制

u 表示16进制无符号整形

o 表示八进制

t 表示二进制

a 表示16进制

c 表示字符类型

f 表示浮点格式

 

对与u存储单元所占字节:

b=1 byte, h=2 bytes,w=4 bytes,g=8 bytes.

 

十四、j 指令

Jmp 加行号,直接跳到第几行

 

 

十五、bt

打印调用栈

  

十六、whatis

查看某个变量的类型

 

十七、display

使用display后,会打印当前变量的值,并且,以后每一次单步都会打印这个变量的值

(gdb) display expr
(gdb) display/fmt expr

expr 表示要查看的目标变量或表达式;参数 fmt 用于指定输出变量或表达式的格式

display 命令和 /fmt 之间不要留有空格

 

十八、layout

1、layout split :显示源代码和汇编代码

并且随调试动态改变

 

 

2、layout next,layout prev

layout next :切换到下一个布局模式
layout prev :切换到上一个布局模式

3、layout src,layout asm 

layout src :只显示源代码,退出方法为Ctrl+X+A
layout asm :只显示汇编代码

 

4、tui

在图中

tui reg next :显示下一组寄存器
tui reg system :显示系统寄存器

 

5、update

更新源代码窗口和当前执行点

 

6、Ctrl组合

Ctrl + L:刷新窗口

Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口

Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。

 

7、实时看到寄存器变化

使用gdb时增加-tui选项,打开gdb后运行layout regs命令。注意最好加上-tui,否则很大可能会出现花屏现象。

 

 

 

十九、set logging on

设置日志文件

 

会记录我们调试的时候的所有输出,适合调试大量的文件

 

二十、shell

去掉我们终端的命令

比如 shell ls ll

可以查看目录中的文件信息

 

二十一、watch

watchpoint

可以加变量

1、观察变量是否变化

 

可以看到,每当断点的地址发生变化的时候,就会打印出来

 

2、删除

这也是一种特殊的断点,可以用delete 加断点号去掉:

 

 

 

二十二、调试core文件

 

在Linux下程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。

但是一般linux限制core文件的生成,我们需要解除限制

 

1、 显示目前资源限制的设定。

ulimit –a

 

 

可以看到core文件的生成受到限制

2、 解除限制

ulimit -c unlimited

 

3、 gda加core文件查看问题

gdb 可执行文件 core文件

 执行后gdb会直接跳到出问题的代码段并显示问题原因

 

二十三、调试正在运行的进程

Gdb –p 进程号       即可

 

 

参考:

https://www.bilibili.com/video/BV1EK411g7Li?from=search&seid=15693799557804781069&spm_id_from=333.337.0.0

 


__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/15811109.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(503)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示