汇编学习与gdb调试-疑惑与解答与日志

本文详细介绍了如何使用GDB和Objdump工具进行代码调试和分析,包括列出汇编代码、获取源码和汇编码对照、理解编译流程及错误定位。适合初学者和进阶者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在gdb中如何列出汇编代码

应该是不可以用list 命令列出汇编代码的。
但可以使用display /i $pc 命令在调试的时候出了列出一行源码,也列出相应的汇编代码
同时,s和si等的区别还是比较大的:si按汇编一行一行执行,有的源码一行会有很多条汇编;
我认为这是个学习汇编的好方法:使用gdb一步一步调试,对比汇编和源码

2、如何将一个可执行文件或者是.o文件得到它的汇编码或者是源码?

可以使用objdump -d test.out 获取汇编代码(右侧)以及机器码(左侧);要查看但里面有很多除我写的东西之外的东西,要具体定位到自己写的东西,可根据函数名查看。

如果编译时使用了-g参数的话,使用objdump -dS test 就可以得到机器码,源码,汇编码一一对应了!但如果没用-g的话,可执行文件是没有源码信息的,这时需要通过特殊手段得到。
在这里插入图片描述

3、将c源码变成.o文件,会不会很干净,和变成可执行文件的区别?体量?

编译过程图,来源:https://blog.youkuaiyun.com/misskissC/article/details/38020151
在这里插入图片描述
和期待的相符,没有目标文件的链接过程,.o 文件果然很干净,使用-d命令查看的话,可以只看我自己写的代码部分!但是没有 -g 的话没有源码。
在这里插入图片描述
同样和期待的相符,加了-g之后,成功出现源码
在这里插入图片描述

4、c代码变成.s文件,如何精确捕捉到我写的函数的内容?

额,我发现.s 文件还是非常干净的,没有什么特别多的其他文件,想要找哪个函数,前面都有名字的。 尝试是由-g会有什么区别码?
在这里插入图片描述
加了-g 参数后,生成的.s 文件果然多了很多不认识的东西,仔细找了下后,发现并没有看到源码的字符串,可能是以某种特殊的方式编码了?如图是对比,左侧是加了 -g的,而右侧是没有加的。
在这里插入图片描述
我们来验证以下,这个加了-g的.s文件,是否真的是包含了我源码的信息?

验证通过,确实有,哈哈
在这里插入图片描述

5、各种情况的编译失败是在编译的过程是哪一步?

在编译c语言的时候,通常是一步全编译,我们来尝试分部编译,探究不同错误的编译失败地点。
1、如果我只是写一个函数而没有main函数,可以进行到哪一步?
在这里插入图片描述
编译成汇编代码居然就报错了!预处理的话还是可以的
在这里插入图片描述

2、不小心没写分号 ;
在这里插入图片描述
额,看来还是这个源码变成汇编的过程过程
在这里插入图片描述
我突然想到,整个编译的大过程分为预处理->编译->汇编->链接,那么可能语法问题之类的都是在编译这个小过程被发现的吧。

6、list命令用法

默认显示10行,可使用list 1,1000 来获取更多行的代码
使用list +/- 用以继续,和查看更前的源码
set listsize 20 设置显示行数
show listsize 查看显示行数

7、删除断点:d b

查看断点:
info b
info watch


查表:)

常用命令 简写命令 用法 说明
file f file filename 在gdb中载入某可执行文件
list l list [开始,结束] 列出文件的代码清单,支持指定行号
print p p 变量名 答应出变量的值
break b break 行号or函数名 在指定行号或函数上设置断点
clear cl clear 行号or函数名 删除指定行号或函数上的断点
continue c continue [开始,结束] 从断点处继续运行
next n next 运行到下一行
step s step 单步调试
run r run 执行程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值