1、安装插件
2、F5开启调试
左侧侧边栏->确保打开回调栈
右键函数栈->查看反汇编
3、打印寄存器、函数反汇编等
命令:
查看main反汇编
-exec disassemble /m main
查看寄存器
-exec info r
打印某个变量
-exec print s 或者 --s
打印寄存器,如pc
-exec print $pc
打印当前函数栈信息(当前执行位置)
-exec bt 或 -exec info f
例如:#0 0x00007ff68e41156b in main (argc=1, argv=0xae15f0) at d:\dsoft\win_test.c:69
查看下一行代码
-exec si
打印程序栈局部变量
-exec info local
打印参数
-exec info args
特别强大的命令x,查看指定地址,格式化打印:
x命令的语法如下所示:
x/
n、f、u是可选的参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。
u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。
当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
表示一个内存地址。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
例如:格式化打印 4个单位的字符串
-exec x/4s 0x7ff68e417000
输出如下:
0x7ff68e417000: "AAA Hello World"
0x7ff68e417016: "BBB Hello World"
0x7ff68e417022: "�������ݵ�ַ��x%08x\n"
0x7ff68e417037: ""
16进制格式化打印16个单位的
-exec x/16x 0x5ffe60
打印某变量地址
-exec p &buff
更多可以参见:https://www.cnblogs.com/chengliangsheng/p/3597010.html
附上一个C/C++ demo
cpp
#include <stdio.h>
#include <malloc.h>
int g_i = 100;
int g_j = 200;
int g_k, g_h;
int main(int argc, char *argv[])
{
const int MAXN = 100;
int *p = (int*)malloc(MAXN * sizeof(int));
static int s_i = 5;
static int s_j = 10;
static int s_k;
static int s_h;
int i = 5;
int j = 10;
int k = 20;
int f, h;
char *pstr1 = "magictong Hello World";
char *pstr2 = "magictong Hello World";
char *pstr3 = "Hello World";
printf("堆中数据地址:x%08x\n", p);
putchar('\n');
printf("i 栈中数据地址(有初值):x%08x = %d\n", &i, i);
printf("j 栈中数据地址(有初值):x%08x = %d\n", &j, j);
printf("k 栈中数据地址(有初值):x%08x = %d\n", &k, k);
printf("f 栈中数据地址(无初值):x%08x = %d\n", &f, f);
printf("h 栈中数据地址(无初值):x%08x = %d\n", &h, h);
putchar('\n');
printf("s_i 静态数据地址(有初值):x%08x = %d\n", &s_i, s_i);
printf("s_j 静态数据地址(有初值):x%08x = %d\n", &s_j, s_j);
printf("s_k 静态数据地址(无初值):x%08x = %d\n", &s_k, s_k);
printf("s_h 静态数据地址(无初值):x%08x = %d\n", &s_h, s_h);
putchar('\n');
printf("g_i 全局数据地址(有初值):x%08x = %d\n", &g_i, g_i);
printf("g_j 全局数据地址(有初值):x%08x = %d\n", &g_j, g_j);
printf("g_k 全局数据地址(无初值):x%08x = %d\n", &g_k, g_k);
printf("g_h 全局数据地址(无初值):x%08x = %d\n", &g_h, g_h);
putchar('\n');
printf("pstr1 字符串常量数据地址:x%08x 指向0x%08x 内容为-%s\n", &pstr1, pstr1, pstr1);
printf("pstr2 字符串常量数据地址:x%08x 指向0x%08x 内容为-%s\n", &pstr2, pstr2, pstr2);
printf("pstr3 字符串常量数据地址:x%08x 指向0x%08x 内容为-%s\n", &pstr3, pstr3, pstr3);
free(p);
return 0;
}
本文参考了:
https://blog.csdn.net/weixin_43356770/article/details/135320408