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语言中的nullptr有必要吗
c语言·c++·算法
WL学习笔记9 小时前
日期类(C++)
开发语言·c++·日期类实现
H.莓飛10 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
lhbweilai10 小时前
深挖FreeRTOS内核实现(三)
c语言·stm32·单片机
xxwl58510 小时前
数据结构知识点和代码实现总结(C语言实现)
c语言·开发语言·数据结构
汉克老师11 小时前
GESP2026年9月认证C++八级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
小灰灰搞电子11 小时前
C语言 <time.h> 头文件详解
c语言·time.h
郝学胜_神的一滴12 小时前
C++ Templates 06:搞懂模板代码的三种组织方式
c++·visual studio
C++ 老炮儿的技术栈12 小时前
sizeof操作符
c语言·c++·人工智能·mfc·c
沫璃染墨12 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式