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. 2021.08.09 P7238 迷失森林(树的直径)

    2021.08.09 P7238 迷失森林(树的直径) P7238 「DCOI」迷失森林 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.树的直径两种求法:两次dfs.树 ...

  2. javascript中的宏任务和微任务(一)

    一.宏任务和微任务有哪些 宏任务:setTimeout,setInterval,ajax,dom,宏任务是由浏览器提供的 微任务:promise,async/await,微任务是由es6提供的 二.微 ...

  3. Bugku CTF练习题---社工---信息查找

    Bugku CTF练习题---社工---信息查找 flag:KEY{462713425} 解题步骤: 1.观察题目,思考题目内容,了解答案是群号 2.这里涉及到好多的信息,首先有网址,第二个是今日头条 ...

  4. Hadoop(二)Hdfs基本操作

    HDFS HDFS由大量服务器组成存储集群,将数据进行分片与副本,实现高容错. 而分片最小的单位就是块.默认块的大小是64M. HDFS Cli操作 官网https://hadoop.apache.o ...

  5. Centos 7防火墙策略配置指南

    Centos 7防火墙策略配置指南 -- 清听凌雪慕忆 @ 目录 1. 开启防火墙 1.1 user切换到root用户 1.2 查看防火墙服务状态 1.3 查看firewall的状态 1.4 启动/关 ...

  6. Elasticserach学习笔记(一)

    1.什么是Elasticserach? 一个由Java语言开发的全文搜索引擎,全文检索就是根据用户输入查询字符的片段,能查询出包含片段的数据,简单来说就是一个分布式的搜索与分析引擎,它可以完成分布式部 ...

  7. .NET ORM 仓储层必备的功能介绍之 FreeSql Repository 实现篇

    写在开头 2018年11月的某一天,头脑发热开启了 FreeSql 开源项目之旅,时间一晃已经四年多,当初从舒服区走向一个巨大的坑,回头一看后背一凉.四年时间从无到有,经历了数不清的日夜奋战(有人问我 ...

  8. 过早的给方法中 引用对象 设为 null 可被 GC提前回收吗?

    经常在代码中看到有人将 null 赋值给引用类型,来达到让 GC 提前回收的目的,这样做真的有用吗?今天我们就来研究一下. 为了方便讲解,来一段测试代码,提前将 test1=null ,然后调用 GC ...

  9. 运维:ITSM

    IT服务管理(ITSM)是一套帮助企业对IT系统的规划.研发.实施和运营进行有效管理的方法,是一套方法论.ITSM起源于ITIL(IT Infrastructure Library,IT基础架构标准库 ...

  10. Java高并发-无锁

    一.无锁类的原理 1.1 CAS CAS算法的过程是这样:它包含3个参数CAS(V,E,N).V表示要更新的变量,E表示预期值,N表示新值.仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同, ...