简单程序的编译、 GDB 调试指令和反汇编指令

目录

一、简单C程序的编译与执行

二、使用 GDB 进行程序基本的程序调试以及一些常用的调试指令

三、反编译目标代码(.o文件)


一、简单C程序的编译与执行

  1. 使用“gedit hello.c”命令在主文件夹下创建一个 hello.c ,也可以选择输入"cd 桌面/test"切换至桌面/test目录,再输入"gedit hello.c"在当前目录下创建一个hello.c文件
  2. 在 hello.c 文件中编写程序后将其保存
  3. 预处理阶段:使用“gcc -E hello.c -o hello.i " "gedit hello.i”得到预处理之后的 hello.i文件(文本文件)
  4. 编译阶段:使用“gcc -S hello.i -o hello.s” “gedit hello.s”得到汇编代码(文本)
  5. 汇编阶段:使用“gcc -c hello.s -o hello.o” “gedit hello.o”得到可重定向目标程序(二进制)
  6. 链接阶段:使用“gcc hello.o -o hello”“gedit hello”得到可执行目标程序(二进制)
  7. 运行阶段:使用“./hello”得到运行结果

可以直接输入"gcc hello.c -o hello"  "./hello" 得到运行结果而不查看中间的过程

二、使用 GDB 进行程序基本的程序调试以及一些常用的调试指令

(一)、输入命令“gcc -g hello.c -o hello”开始调试(-g 选项告诉 gcc 在编译程序时加入调试信息)、输入“gdb hello”可以得到版本信息说明;如果不想得到版本信息,可以输入“gdb -q hello”即可忽略版本信息

(二)、输入“file hello” 先进入 gdb 模式,再加载文件,输入‘y’即可以开始调试

(三)、如需要打印出程序,可以先观察程序的行数,输入"set listsize 100" 设置listsize的值(默认为10)为100,再输入“list”则可以打印100行代码

(四)、选择你需要的设置断点的行数,输入“break 4”表示将断点设置在第四行,可以得到断点的地址

Breakpoint 1表示这是我设置地第一个断点,断点所在地内存地址为0x80483dd,它在文件hello.c的第四行

  • 输入“info breakpoints”可查看设置的断点信息,得到以下界面

Num表示断点的编号;Type表示断点的断点的类型;Disp表示中断点在执行一次之后是否失去作用,dis为是,keep为不是;Enb表示当前中断点是否有效,y为是,n为否;Address表示中断点所处的内存地址;What指出断点所处的位置。

(五)、断点设置好之后可以输入“run”/“r”开始运行程序

(六)、输入"next" / "n",继续执行下一条语句;还有一条命令step,与之类似,不同的是,当下一条语句遇到函数调用的时候,next不会跟踪进入函数,而是继续执行下面的语句,而step命令则会跟踪进入函数内部。

(七)、输入“quit”退出调试


三、反编译目标代码(.o文件)

可以使用"as -gstabs 1009.s -o 1009.o

"  "objdump -d 1009.o"可以用于查看汇编代码中的机器指令以及地址,其中objdump -d可以充当反汇编器的角色。

也可以使用"disassemble sum" 生成SUM的反汇编代码

目标文件分为两种:test(可执行目标文件),test.o(可重定向目标文件)

 test.o中的代码从地址0开始,test中的代码从0x80483d4(也可以是其他的地址,由系统分配)开始!

注意:函数起始地址是动态分配的;函数返回值在%eax中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值