码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【计算机系统基础1】gdb、gcc简易使用指南


    目录
    • 1. 基本实验工具的使用
      • 1.1GCC
        • 在IA-32+LINUX平台
        • 基本的GCC 命令
        • 一些其他选项
      • 1.2objdump
      • 1.3gdb
        • 启动gdb 调试工具
        • 设置断点
        • 启动程序运行
        • 查看程序运行时的当前状态
        • 继续执行下一条指令或语句
        • 退出

    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:生成链接文件,就是组装的模块。

    image-20220527103628467

    • 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:在反汇编后的内容中添加源代码

    image-20220527154011432

    image-20220527154159949

    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
      

      ​ 各部分含义解释:

      • image-20220527172650195

      • image-20220527172712212

      • image-20220527172732913

      • image-20220527172802817

      • image-20220527172814461

      语句含义:

      • image-20220527172854572
      • image-20220527173027977
    • 栈帧信息

      说明: IA-32用栈来支持过程的嵌套调用,过程的入口参数、返回地址,被保存寄存器的值、被调用过程中的非静态局部变量等都会被保存在栈中。
      栈帧:系统为每个执行的过程分配一个栈空间。

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

      image-20220527173449423

      当前栈帧范围:

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

      当前栈帧字节数:

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

      举例:

      image-20220527173839206

      显示当前栈帧内容:

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

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

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

    退出

    quit
    

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

  • 相关阅读:
    高斯模糊的细枝末节
    优思学院|2022年获美质协ASQ和ILSSI奖项的《精益六西格玛的十条戒律》
    Entity Framework Core 简明教程(3)- 关系处理
    golang入门
    OSCP-Vulnhub靶机记录-Development-walkthrough
    【JavaSE】深入理解String及相关面试题
    NodeJS 5分钟 连接 Redis 读写操作
    centos pip失效
    jvm参数顺序问题
    Oracle中两张表具有相同结构,如何将一张表内容全部插入到另一个表中
  • 原文地址:https://www.cnblogs.com/zyllee/p/16440055.html
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号