标签:第一条 add 指令 isa text 调试 hat asm var
func.c源码
#include <stdio.h>
int func(int a, int b)
{
a = 100;
b = 200;
printf("Hello%d\n", a);
return 0;
}
int main(int argc, char *argv[])
{
func(1, 2);
return 0;
}
func.sh脚本
gcc func.c -E -o func.i # 预处理,展开宏(#define),源文件及头文件
gcc func.i -S -o func.s # 编译,生成汇编代码
gcc func.s -c -o func.o # 汇编,将汇编代码翻译成机器指令
gcc func.o -o func # 链接,将机器指令转换成二进制可执行文件
反汇编
objdump -d func
进入gdb监控模式
gdbtui func
(gdb) layout asm # 监控汇编源码窗口
(gdb) layout split # 创建新监控窗口
(gdb) layout regs # 监控寄存器窗口
gdb查看内存值
x/<n/f/u> <addr>
参数 | 说明 |
---|---|
n | 显示内容个数 |
f | 显示格式[16,10,8,2,字符]进制[x,d,o,t,c] |
u | 多少个字节[1,2,4,8]作为一个值取出来[b,h,w(默认),g] |
addr | 直接地址0x12345678 将寄存器的内容作为地址$eax |
gdb常用命令
命令 | 缩写 | 命令说明 |
---|---|---|
list | l | 显示多行源代码 |
break | b | 设置断点 |
break if | b if | 当满足某个条件时停止 |
delete | d | 删除断点(包括watch 点),一般先使用info命令查看断点,之后使用d 断点号删除 |
disable | 禁用断点 | |
enable | 允许断点 | |
info | i | 描述程序状态,比如: i break 显示有哪些断点,info thread 哪些线程 |
run | r | 开始运行程序 |
display | disp | 跟踪查看某个变量,每次停下来都显示其值 |
p | 打印内部变量值 | |
watch | 监视变量值新旧的变化 | |
step | s | 执行下一条语句,如果该语句为函数调用,则进入函数执行第一条语句 |
next | n | 执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句) |
continue | c | 继续程序的运行,直到遇到下一个断点 |
finish | 如果进入了某个函数,返回到调用调用它的函数,jump out | |
set var name = v | 设置变量的值 | |
backtrace | bt | 查看函数调用信息(堆栈) |
start | st | 开始执行程序,在main函数中的第一条语句前停下 |
frame | f | 查看栈帧,比如 frame 1 查看1号栈帧 |
quit | q | 离开gdb |
edit | 在gdb中进行编辑 | |
whatis | 查看变量的类型 | |
search | 搜索源文件中的文本 | |
file | 装入需要调试的程序 | |
kill | k | 终止正在调试的程序 |
rip中存放的是即将执行指令的地址
函数调用完后,栈恢复
mov $0x0,%eax
leaveq
retq
标签:第一条 add 指令 isa text 调试 hat asm var
原文地址:https://www.cnblogs.com/ctrlplayer/p/14280002.html