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】gdb、gcc简易使用指南的更多相关文章

  1. GCC 编译优化指南(转)

    GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...

  2. GCC 编译优化指南

    转自: http://www.jinbuguo.com/linux/optimize_guide.html GCC 编译优化指南 作者:金步国[www.jinbuguo.com] 版权声明 本文作者是 ...

  3. GCC编译优化指南【作者:金步国】

    GCC编译优化指南[作者:金步国] GCC编译优化指南 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分 ...

  4. git简易使用指南

    git简易使用指南 Git是一个分布式版本控制/软件配置管理软件,原是Linux内核开发者林纳斯·托瓦兹(Linus Torvalds)为更好地管理Linux内核开发而设计.应注意的是,这与GNU I ...

  5. 计算机系统基础学习笔记(1)-基本GCC,objdump,GBD命令的使用

    基本GCC命令的使用 GCC是一套由GNU项目开发的编程语言编译器,可处理C语言. C++.Fortran.Pascal.Objective-C.Java等等.GCC通常是 跨平台软件的编译器首选.g ...

  6. [原创]Spring Boot + Mybatis 简易使用指南(一)基础环境搭建

    前言 作者: Ant QQ:517377100 相对于使用JdbcTemplate,Mybatis可自动建立pojo类型与数据库列的映射关系,数据库访问层的开发简单了许多 所有数据库访问操作,均封装在 ...

  7. GCC 编译优化指南【转】

    转自:http://www.jinbuguo.com/linux/optimize_guide.html 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. ...

  8. js基础练习二之简易日历

    今天学到了js基础教程3,昨天的课后练习还没来的及做,这个是类似简易日历的小案例,视频还没听完,今晚继续...... 先看效果图: 其实做过前面的Tab选项卡,这个就很好理解了,通过鼠标放在不同月份月 ...

  9. linux基础2——gdb调试器

    gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功 ...

随机推荐

  1. Python 交互式解释器的二三事

    学 Python 不知道何时起成了一种风尚.这里,我也随便聊聊跟Python 的交互式解释器的几个有意思的小问题. 如何进入 Python 交互解释器? 当你安装好 Python 后,如何进入 Pyt ...

  2. 被人DDoS攻击了,分析一下原理和防护

    一.行业现象 1.1 为什么要攻击? 常见的,一个是同行恶意竞争,一个是敲诈勒索. 无论是传统行业的线下门店,还是互联网行业的门户网站.APP产品,都存在着竞争关系,争相获得更多客源,究其目的,无非是 ...

  3. git冲突解决、线上分支合并、luffy项目后台登陆注册页面分析引入

    今日内容概要 git冲突解决 线上分支合并 登陆注册页面(引入) 手机号是否存在接口 腾讯云短信申请 内容详细 1.git冲突解决 1.1 多人在同一分支开发,出现冲突 # 先将前端项目也做上传到 g ...

  4. PicLite 开发日志 (v0.0.3)

    PicLite 开发日志 (v0.0.3) 感谢您阅读本片文章! Gitee 地址:https://gitee.com/XiaoQuQuSD/pic-lite. 新增功能 当错误出现时不再强制 rai ...

  5. [AcWing 35] 反转链表

    迭代版本 点击查看代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next ...

  6. 基于Koa与umi实现服务端(SSR)渲染

    工具: umijs:react前端应用框架. koa:基于 Node.js 平台的web 开发框架. 介绍: 本文主要是简单介绍,利用umi开发前端页面,打包成服务端渲染工程包.由Koa实现服务端渲染 ...

  7. QMetaObject::connectSlotsByName: No matching signal for XXX 原理探究

    问题引出: 在尝试实现<Qt5.9 c++开发指南>混合UI编程章节时,用纯代码形式实现了个小按钮,然后加了个对应的槽函数,运行时就提示了这个信息. 原因探究: 首先查阅官方手册中的说明: ...

  8. sql索引优化思路

    [开发]SQL优化思路(以oracle为例) powered by wanglifeng https://www.cnblogs.com/wanglifeng717 单表查询的优化思路 单表查询是最简 ...

  9. Linux -4-作业练习

    1.编写脚本实现登陆远程主机.(使用expect和shell脚本两种形式). expect脚本格式  expect总结点击查看 登录直接远程控制主机 #!/usr/bin/expect # # set ...

  10. Linux学习教程 | 全文目录

    本教程最大的特点是通俗易懂,并且非常详细,花费 7 天时间即可快速了解 Linux. 第一章 Linux简介 1.1 操作系统是什么,操作系统概述 1.2 Linux是什么,有哪些特点? 1.3 Li ...