ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【计算机系统基础1】gdb、gcc简易使用指南

2022-07-03 16:31:59  阅读:175  来源: 互联网

标签:gcc esp gdb gdbtest 使用指南 断点 hello


目录

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

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

标签:gcc,esp,gdb,gdbtest,使用指南,断点,hello
来源: https://www.cnblogs.com/zyllee/p/16440055.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有