【计算机系统基础1】gdb、gcc简易使用指南
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简易使用指南的更多相关文章
- GCC 编译优化指南(转)
GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...
- GCC 编译优化指南
转自: http://www.jinbuguo.com/linux/optimize_guide.html GCC 编译优化指南 作者:金步国[www.jinbuguo.com] 版权声明 本文作者是 ...
- GCC编译优化指南【作者:金步国】
GCC编译优化指南[作者:金步国] GCC编译优化指南 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分 ...
- git简易使用指南
git简易使用指南 Git是一个分布式版本控制/软件配置管理软件,原是Linux内核开发者林纳斯·托瓦兹(Linus Torvalds)为更好地管理Linux内核开发而设计.应注意的是,这与GNU I ...
- 计算机系统基础学习笔记(1)-基本GCC,objdump,GBD命令的使用
基本GCC命令的使用 GCC是一套由GNU项目开发的编程语言编译器,可处理C语言. C++.Fortran.Pascal.Objective-C.Java等等.GCC通常是 跨平台软件的编译器首选.g ...
- [原创]Spring Boot + Mybatis 简易使用指南(一)基础环境搭建
前言 作者: Ant QQ:517377100 相对于使用JdbcTemplate,Mybatis可自动建立pojo类型与数据库列的映射关系,数据库访问层的开发简单了许多 所有数据库访问操作,均封装在 ...
- GCC 编译优化指南【转】
转自:http://www.jinbuguo.com/linux/optimize_guide.html 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. ...
- js基础练习二之简易日历
今天学到了js基础教程3,昨天的课后练习还没来的及做,这个是类似简易日历的小案例,视频还没听完,今晚继续...... 先看效果图: 其实做过前面的Tab选项卡,这个就很好理解了,通过鼠标放在不同月份月 ...
- linux基础2——gdb调试器
gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功 ...
随机推荐
- DevOps转型到底值不值?
摘要:企业进行DevOps转型是否有价值?是否能计算出明确的投资回报率呢?本文将为您解惑. 本文分享自华为云社区<DevOps转型到底值不值?>,作者:敏捷小智 . 引言 企业都是以盈利为 ...
- 爬虫篇-如何下载selenium及其适配谷歌浏览器插件chromedriver(含chrome各版本及下载地址)
最近换了电脑,练习爬虫时用到selenium,结果在重新安装chromedriver插件的时候发现原网址不能使用,找了好久终于找到了了新网址,顺便更一篇详细使用的文章,希望可以对屏幕前的你有所帮助.本 ...
- 使用etcd选举sdk实践master/slave故障转移
本次将记录[利用etcd选主sdk实践master/slave高可用], 并利用etcdctl原生脚本验证选主sdk的工作原理. master/slave高可用集群 本文目标 在异地多机房部署节点,s ...
- 一文彻底搞懂MySQL分区
一个执着于技术的公众号 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成. 段 段就是上图的segment ...
- Python生成GIF动态图
python生成摸头GIF 本篇教程演示了如何使用python的PIL库生成GIF图片 源码已经贴在文中,自行取用 效果演示 运行代码,会让你选择要制作的图片 运行完成后,会在同路径下生成dem.gi ...
- .NET性能优化-使用ValueStringBuilder拼接字符串
前言 这一次要和大家分享的一个Tips是在字符串拼接场景使用的,我们经常会遇到有很多短小的字符串需要拼接的场景,在这种场景下及其的不推荐使用String.Concat也就是使用+=运算符. 目前来说官 ...
- Linux嵌套目录权限的比较探究
在/tmp目录下新建一个嵌套目录,名字分别为test_0.test_1.test_2.在test_2目录下新建普通文件,名为tryme.设置test_0和test_2的权限为777,设置test_1的 ...
- js通用对象数组冒泡排序
数组对象通用 function sort(data, sortFiled, orderby) { var result = data, temp; for (var i = 0; i < res ...
- EditText简单登陆界面制作
- SpringBoot实现基于token的登录验证
一.SpringBoot实现基于token的登录验证 基于token的登录验证实现原理:客户端通过用户名和密码调用登录接口,当验证数据库中存在该用户后,将用户的信息按照token的生成规则,生成一个字 ...






