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

  • 【计算机系统基础1】gdb、gcc简易使用指南已关闭评论
  • 181 次浏览
  • A+
所属分类:linux技术
摘要

在IA-32+LINUX平台上,编译,调试和运行C语言为了把C语言源程序编译成IA-32机器指令,X86-64位计算机系统需要先运行下列命令:

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

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

  • 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】gdb、gcc简易使用指南

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

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 

    各部分含义解释:

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

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

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

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

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

    语句含义:

    • 【计算机系统基础1】gdb、gcc简易使用指南
    • 【计算机系统基础1】gdb、gcc简易使用指南
  • 栈帧信息

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

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

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

    当前栈帧范围:

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

    当前栈帧字节数:

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

    举例:

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

    显示当前栈帧内容:

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

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

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

退出

quit 

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