交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
1 gdb 调试器
分享
未结
0
647
李延
LV6
2022-06-07
悬赏:20积分
# 1 说明 在前面章节中,我们的代码都相对简单,所以直接编译执行,对我们理解它的运行过程完全没有问题。 但如果程序复杂,我们执行运行会观察它的运行过程将会特别困难。所以我们需要通过gdb 对我们的汇编代码进行debug调试。 gdb目前我没有找到好的一个可视化工具。所以只有通过命令行进行调试。 # 2 gdb一个示例 ## 2.1 启动gdb 我们以之前写的 call.s 文件为例: ```asm .LC0: .string "a>b\n" .LC1: .string "a<=b\n" .LC2: .string "num is %d\n" sum: subq $8, %rsp cmpl %esi, %edi jle .L2 movl $.LC0, %edi movl $0, %eax call printf movl $1, %eax jmp .L1 .L2: movl $.LC1, %edi movl $0, %eax call printf movl $0, %eax .L1: addq $8, %rsp ret .globl main main: subq $8, %rsp movl $2, %esi movl $1, %edi call sum movl %eax, %esi movl $.LC2, %edi call printf movl $0, %eax addq $8, %rsp ret ``` 这个是当前对于函数调用的示例 首先我们在linux服务器上编译它,得到:call.out 文件 ```sh gcc call.s -o call.out ``` 启动gdb ```sh gdb call.out ```  如上图,表示启动成功。 这里我们直接执行run命令。将会继续执行代码,直接结束  我们就可以看到程序直接输出,然后退出gdb。 ## 2.2 添加和删除断点 所以我们在debug时,需要先设置断点,然后再执行run命令运行程序,让代码在我们设置断点的地方停住。具体命令如下: - break 添加断点 - delete 删除断点 ### 2.2.1 在函数入口设置点的 首先可以在函数的入口设置断点,比如在 sum函数入口设置断点,并执行run启动项目 ``` break sum ```  这个时候我们发现并没有打印我们的输出内容,因为现在才刚执行到sum函数,还没有到打印的地方。 输入continue命令,让程序继续执行  这个时候就发现我们的程序执行完成了。 ### 2.2.2 在指定地址处设置断点 除了在函数入口处设置断点外,还可以直接通过指定具体的地址,设置断点。不过我们需要先通过disas 命令反编译 代码获取到具体地址如: ```asm disas sum ```  这里我们在函数返回时打个断点如下: ```asm break *0x0000000000400575 ``` 我们重新执行run 命令启动服务  这时在我们第一个断点sum函数入口处停了下来。并且执行 continue  这里我们发现只打印了一个 a<=b出来。说明在我们设置的第二个断点处停了下来,我们继续执行  到这里程序运行完成。 ## 2.3 信息输出info 在运行过程中,我们可以通过info 命令查看各种信息,如寄存器信息。 ```asm info registers ``` 我们重新运行程序,在sum函数入口处的断点停下来,打印寄存器信息  这里我们可以清楚的看到每个寄存器的详细信息。 ## 2.4 其他指令 上面我们介绍了debug的基本流程。还有很多的指令,帮助我们debug代码。不再一一说明。只是简单列出来,提供参考 
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号