【计算机系统基础1】gdb、gcc简易使用指南
2024-09-06 21:01:18
目录
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
------------恢复内容结束------------
最新文章
- 总结oninput、onchange与onpropertychange事件的用法和区别,onchange
- adcfgclone.pl appsTier报错Unable to locate 'linkxlC' utility in path
- HDU 3853(期望DP)
- UITextField 属性详解
- 世界上还有一个东西叫Virtual Pascal
- php 常用的好函数(持续更新)
- java mysql 数据类型对照
- KVM内核文档阅读笔记
- C/C++反三角函数使用注意
- 微信小程序后端开发(Java语言)笔记
- python 类的属性__slots__ (了解一点点)
- ViewPager和Fragment中的View的点击事件冲突
- 前端回顾:2016年 JavaScript 之星
- IdentityServer4 中文文档 -7- (简介)贡献
- 【Java123】Java基础知识点
- B - 集合选数 (状压DP)
- PHP 实现 word/excel/ppt 转换为 PDF
- Unity shader学习之轮廓效果
- c# 数据写入三菱PLC
- CRF分词的纯Java实现