VSCode C/C++(gdb)调试指南

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

相关推荐
学逆向的8 小时前
C 堆区内存管理
c语言·开发语言·网络安全
xiaoye-duck10 小时前
《C++ 工具库实战》gflags 命令行参数解析库详解
c++·第三方库
狂奔的sherry11 小时前
C++ 宏生成访问函数的代价:访问权限、调试和类型检查
c++·宏·编译·预处理器·类型检查
阿尼卡~11 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
划破黑暗的第一缕曙光12 小时前
[C++]:5.STL:string(2)
java·c++·redis
MicrosoftReactor14 小时前
技术速递|超越一刀切:为 GitHub Copilot CLI 和 VS Code 实现决策路由
vscode·ai·github·copilot·决策路由
小超人诞生日记15 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
多弗朗皮卡丘15 小时前
C++的IO流
开发语言·c++·io流·文件io流
xiangyun6116 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
SunkingYang16 小时前
C++14 vs C++17:新特性对比与用法指南
c++·新特性·用法·c++14·示例·c++17