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

相关推荐
天空'之城3 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
2601_956121976 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-8 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
小星星闪亮登场10 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑10 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶10 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ11 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
stevenseahang11 小时前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·可移植性·标准演化·ansic
别动我齐刘海12 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
AI科技星12 小时前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星