1. 基本实验工具的使用

1.1GCC

在IA-32+LINUX平台

在IA-32+LINUX平台上,编译,调试和运行C语言

  • 为了把C语言源程序编译成IA-32机器指令,X86-64位计算机系统需要先运行下列命令:

    sudo apt-get install build-essential module-assistant
    sudo apt-get install gcc-multilib g++-multilib

基本的GCC 命令

  • -E:翻译带 # 的文件,将头文件内容生成到源文件中。

  • -S:生成汇编文件。

  • -C:生成链接文件,就是组装的模块。

  • gcc -E hello.c -o hello.i
    gcc -S hello.i -o hello.s
    gcc -C hello.s -o hello.o
    gcc hello.o -o hello

一些其他选项

gcc -O0 -m32 -g hello.c -o hello
  • -O0: 不用编译优化
  • -m32:编译成 x86-32 位的指令
  • -g:带调试信息

1.2objdump

  • 作用:反汇编二进制的目标文件
objdump -S gdbtest.o > gdbtesto.txt
objdump -S gdbtest > gdbtest.txt
  • -s:在反汇编后的内容中添加源代码

1.3gdb

启动gdb 调试工具

启动gdb 调试工具,加载要被调试的可执行文件

# 启动方式1:gdb [可执行文件名]
gdb gdbtest
# 启动方式2:1.gdb 2.file [可执行文件名]
gdb
file gdbtest
# 查看源代码
l

设置断点

# 在 main 函数的入口处设置断点
break main # 或者 b main
# 在源程序 gdbtest.c 的第 3 行处设置断点
break gdbtest.c:3

启动程序运行

# 启动程序运行,程序会在断点处停下
run # 或者 r

查看程序运行时的当前状态

  • 程序的当前断点位置

    eip 寄存器:保存一下条要执行的指令的地址

    # i r:显示所有寄存器的内容
    # i r eip: 只显示寄存器 eip 的内容,64位是rip
    i r eip
  • 通用寄存器内容

    i r eax ebx ecx edx #(或i r) 显示通用寄存器内容
  • 查看变量的地址

    p &a # 查看a的地址
  • 存储器单元内容

    x/8xb 0xffffd2bc
    x/2xw 0xffffd2bc

    各部分含义解释:

    语句含义:

  • 栈帧信息

    说明: IA-32用栈来支持过程的嵌套调用,过程的入口参数、返回地址,被保存寄存器的值、被调用过程中的非静态局部变量等都会被保存在栈中。

    栈帧:系统为每个执行的过程分配一个栈空间。

    类似于游泳池储物柜的申请和返还

    当前栈帧范围:

    i r esp ebp # esp栈顶指针、ebp 栈底指针

    当前栈帧字节数:

    y = R[ebp] - R[esp] + 4

    举例:

    显示当前栈帧内容:

    x/yxb $esp # y: R[ebp]-R[esp]+4的值, 栈帧起始地址是esp指向的单元地址;
    
    x/zxw $esp # z=y/4, 显示从esp指向的地址开始。

继续执行下一条指令或语句

si # 执行一条机器指令
s # 执行一条C语句

退出

quit

------------恢复内容结束------------

最新文章

  1. 总结oninput、onchange与onpropertychange事件的用法和区别,onchange
  2. adcfgclone.pl appsTier报错Unable to locate 'linkxlC' utility in path
  3. HDU 3853(期望DP)
  4. UITextField 属性详解
  5. 世界上还有一个东西叫Virtual Pascal
  6. php 常用的好函数(持续更新)
  7. java mysql 数据类型对照
  8. KVM内核文档阅读笔记
  9. C/C++反三角函数使用注意
  10. 微信小程序后端开发(Java语言)笔记
  11. python 类的属性__slots__ (了解一点点)
  12. ViewPager和Fragment中的View的点击事件冲突
  13. 前端回顾:2016年 JavaScript 之星
  14. IdentityServer4 中文文档 -7- (简介)贡献
  15. 【Java123】Java基础知识点
  16. B - 集合选数 (状压DP)
  17. PHP 实现 word/excel/ppt 转换为 PDF
  18. Unity shader学习之轮廓效果
  19. c# 数据写入三菱PLC
  20. CRF分词的纯Java实现

热门文章

  1. 2021.08.01 P4311 数字序列(左偏树)
  2. 小米路由器3G R3G 刷入Breed和OpenWrt 20.02.2 的记录
  3. 超越iTerm! 号称下一代终端神器,功能贼强大!
  4. MySQL数据存储
  5. Promql基础语法2
  6. 攻防世界-MISC:embarrass
  7. [洛谷] P2010 [NOIP2016 普及组] 回文日期
  8. 初次接触Java感受
  9. Libco Hook 机制浅析
  10. 为什么不建议给MySQL设置Null值?《死磕MySQL系列 十八》