调试基础知识及原理

简介: 调试基础知识及原理

一个可调试的可执行文件。我个人觉得里面的内容可以分为3个部分。

1,机器码。C/C++ 转成的机器码

2,符号表信息(symbols)

3,调试信息(debug info)

无论是 Linux 的GDB,还是 Windows 的 WinDbg 跟 VsDebug,都是根据上面这些信息来进行调试的。


用前面 ubuntu18 + clion 编译出来的 ffmpeg_g 文件来讲解一下调试器的工作过程。ffmpeg_g 是一个 ELF 文件,用 xelfviewer 打开,如下:

上图是是 ffmpeg_g 里面的符号表,init_options 是里面的一个符号,一个函数就是一个符号。

上图中圈出来的 init_optionsffmpeg_opt.c 里面的一个函数。我编译 ffmpeg_g 的时候 开启了最大的调试信息,所以 symbols 跟 debug info 都有。

下面用 gdb 来调试一下 这个 ffmpeg_g 程序,如下:

gdb ./ffmpeg_g
set args -i walking-dead.mp4 walking-dead.flv -y
b init_options
layout src
r

上图里面,b init_options 就是针对 init_options 这个符号打断点 ,elf 里面必须有符号表才能根据 符号打断点,如果把符号表删了就无法指定符号断点。

然后,这个符号对应的源代码行数,是在 ELF 里面的 debug_xxx 的段表里面的,这是按照 DWAF (Debug With Arbitrary Record Format)标准存储的,如下:

可以使用 nl -l ffmpeg_g 打印符号对应的源代码行数。

ELF 文件生成的时候,符号 跟 源代码的对应关系已经写死了。

例如 init_options 符号就是在 /home/ubuntu/Documents/FFmpeg-n4.4.1/fftools/ffmpeg_opt.c:223 的位置,如果你把源文件目录改了位置,GDB 查询 ELF 的 debug_xxx 段表的时候就会找不到源文件。


因此,文章刚开始提及的 符号表信息(symbols)就是变量名,函数名之类的,调试信息(debug info)是 函数对应的源代码信息。

现在做个测试,我们把 debug info 信息删掉,只保留 symbols ,GDB 调试的时候会有什么特别。

执行以下命令 删除 调试信息:

strip --strip-debug ffmpeg_g

从上图可以看到,删除调试信息之后,文件小了44M。再用 xelfviewer 打开 删除了 debug info 的 ffmpeg_g 文件,可以发现 之前的 debug_info,debug_line 这些段表全都不见了,如下:

现在再次执行以下 gdb 命令调试。

gdb ./ffmpeg_g
set args -i walking-dead.mp4 walking-dead.flv -y
b init_options
layout src
r

从上图可以看到 b init_options 还是可以断点成功,因为我们只是删了调试信息,符号信号还存在,只是 gdb 的提示有变化,只是提示这个函数的地址,之前有调试信息的时候,gdb 会直接提示 ffmpeg_opt.c:223。

这是因为我们把调试信息删了,gdb 找不到这个 init_options 符号对应的源代码信息。

因此,layout src 也会失败,提示没有 源信息,如下:

因此,只能使用汇编调试,执行 layout asm ,切换到汇编界面。

有符号信息的汇编调试,跟无符号信息的汇编调试有什么区别?请看下图:

有调试符号的好处就是,call 那些地址,gdb 都会显示一个函数名给你看,然后 执行 bt 栈回溯的时候,也能显示出来函数名称。

虽然看不到源码,但是能看到函数名,微软经常提供这种符号信息给别人调试,但是不开放debug info 信息跟源码。


现在我再把 符号表也删掉,命令如下:

strip --strip-all ffmpeg_g

从上图可以看出,符号表信息相对较少,只有1M。现在再用 gdb 调试一下 ffmpeg_g,命令如下:

gdb ./ffmpeg_g
set args -i walking-dead.mp4 walking-dead.flv -y

从上图可以看出,init_options 符号已经删掉了,无法根据这个符号进行断点。只保留了一个 main 让你能从入口断一下。使用 bt 回溯的时候,也只能看到一串地址,没有函数名,这时候的 ffmpeg_g 只能看汇编调试,犹如天书。


讲到这里,ffmpeg_g 软件的运行 其实只需要 机器码,符号表信息(symbols)跟 调试信息(debug info)都只是调试需要。

因此我个人把 symbols 看成是初级的调试信息, debug info 是高级调试信息。

因为 debug info 要结合源码来用,所以即使你有debug info,如果没有源码,用处不是很大,但是对于逆向分析,有 debug info 总比没有好。

本文讲的是 Linux 的ELF 调试情况,Windows 的PE 也是类似的。 PE 跟 ELF 事实上同根同源,他们都是由 COFF (Common Object File Format) 格式发展来的。两者都是基于 段的结构。

ELF 相关知识可以看博客文章 《ELF格式简介


参考资料:

1,《软件调试》- 张银奎

2,《Linker and Loader》- John R. Levine

3,《程序员的自我修养 - 链接、装载与库》- 俞甲子,石凡,潘爱民


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
11月前
|
人工智能 编解码 芯片
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
不会向ai提问,不知道怎么提问的 可以看看
21189 1
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
|
JSON JavaScript 小程序
关于HBuilderX的简单介绍
关于HBuilderX的简单介绍
4144 0
|
12月前
|
JavaScript 前端开发 API
|
编解码 Linux 开发者
初探FFplay:多媒体播放器的快速入门指南
【10月更文挑战第15天】FFplay是一个由FFmpeg项目提供的轻量级多媒体播放器,它使用FFmpeg库来解码和播放音频/视频流。FFplay非常适合那些想要深入了解多媒体编解码技术和音视频播放流程的开发者或爱好者。本文将介绍FFplay的基本功能、安装配置步骤以及如何使用命令行参数来播放多媒体文件。
2267 0
|
10月前
|
API 开发者
鸿蒙5开发宝藏案例分享---折叠屏开发实践
这篇内容揭示了鸿蒙开发者文档中隐藏的宝藏——官方提供的数十个超实用开发案例。涵盖折叠屏适配、性能优化、UI设计与跨设备协同等核心场景,每个案例均附带可复用代码和避坑指南。例如,折叠屏悬停态开发通过`FolderStack`组件分割上下屏并动态避让折痕;响应式字体适配利用断点系统和rem单位实现多设备兼容;横竖屏切换方案解决方屏设备全屏播放时的旋转问题。这些案例直接解决业务痛点,内置UX规范,大幅节省开发和试错成本,堪称鸿蒙开发的“瑞士军刀”。建议开发者前往官网搜索“最佳实践”,快速提升效率!
|
数据采集 安全 API
ChatGPT API漏洞可能导致DDoS和注入攻击
ChatGPT API漏洞可能导致DDoS和注入攻击
|
API 文件存储
使用Streamlit创建AutoGen用户界面
AutoGen作为一个最大化LLM(如GPT-4)能力的框架而脱颖而出。由微软研究院开发的AutoGen通过提供一种自动化、优化和编排工作流的方法,简化了复杂的、基于多代理llm的应用程序的创建。我们在以前的文章中也有过介绍,你可以与许多GPT交谈,并且GPT和GPT之间也可以互相交谈。每个GPT都是它自己的“代理”,并在总体业务流程中扮演特殊角色。但是AutoGen是用命令行模式进行交互的,这对我们的输入来说非常不方便,所以这次我们来对其进行改造,使用Streamlit创建一个web界面,这样可以让我们更好的与其交互。
803 1
|
安全 虚拟化
RayLink 的软件
【10月更文挑战第17天】RayLink 的软件界面非常清爽,常见的远程控制功能它都提供,比如拖放文件传输、剪贴板互通等等,在使用上非常方便,无论是远程办公还是临时使用手机操作电脑,都能高效完成各种任务。
511 1
|
弹性计算 并行计算 双11
阿里云服务器多少钱一年?2024年11月最新价格表,爆款配置清单
2024年双十一期间,阿里云推出多款优惠云服务器配置。最便宜的轻量应用服务器2核2G、3M带宽、50GB ESSD云盘,仅需36元一年;ECS云服务器2核2G、3M带宽、40GB ESSD Entry云盘,99元一年;ECS u1实例2核4G、5M带宽、80GB ESSD Entry盘,199元一年。更多配置详见官网。
1325 0
|
机器学习/深度学习 人工智能 大数据
AI大模型企业应用实战(24)-什么是zero-shot, one-shot和few-shot Learning?
零样本学习(Zero-Shot Learning)是机器学习中的一种方法,模型在未见过的类别上进行分类,依赖于类别描述来建立训练与测试集间的联系。例如,通过已知的马、老虎和熊猫特征推断斑马。单样本学习(One-Shot Learning)则是在极少量样本(如一个)的情况下进行学习,目标是减少训练数据需求,适用于新类别出现时无需重新训练的情况。小样本学习(Few-Shot Learning)是处理仅有少量类内样本的学习任务。这三者常用于图像分类、语义分割等场景,One-Shot是Few-Shot的特殊情况。
906 0

热门文章

最新文章