如何在 VSCode 的调试器模式下查看指针指向的字符串的 char 值

问题描述 投票:0回答:1

假设我正在使用这个 C 程序。

  • 我有三个字符串存储在动态分配的内存中。
  • 我将这些字符串的地址存储在动态分配的指针变量中。
#include <string.h>
#include <stdlib.h>

int     main(void)
{
    char    *p0 = strdup("red..");
    char    *p1 = strdup("green");
    char    *p2 = strdup("blue.");
    char    *p3 = NULL;
    char    **pp = malloc(sizeof(char *) * 4); /* I want to watch this in VSCode debugger */

    pp[0] = p0;
    pp[1] = p1;
    pp[2] = p2;
    pp[3] = p3;

  /* do something */

    return (0);
}

我想要达到的目标

在 VSCode 调试器的监视视图中,如何让它显示每个指针指向的字符串的 char 值(如果可能的话还包括地址),如下所示?

<watch_expression_for_pp>: <address of pp>
   |- pp[0]: [6] <address of pp[0]>
   |     |--- [0]: 'r'
   |     |--- [1]: 'e'
   |     |--- [2]: 'd'
   |     |--- [3]: '.'
   |     |--- [4]: '.'
   |     |--- [5]: '\0'
   |
   |- pp[1]: [6] <address of pp[1]>
   |     |--- [0]: 'g'
   |     |--- [1]: 'r'
   |     |--- [2]: 'e'
   |     |--- [3]: 'e'
   |     |--- [4]: 'n'
   |     |--- [5]: '\0'
   |
   |- pp[2]: [6] <address of pp[2]>
   |     |--- [0]: 'b'
   |     |--- [1]: 'l'
   |     |--- [2]: 'u'
   |     |--- [3]: 'e'
   |     |--- [4]: '.'
   |     |--- [5]: '\0'
   |
   |- pp[3]: [6] <0x0000000000000000>
         |--- [0]: 'r'
         |--- [1]: 'a'
         |--- [2]: 'n'
         |--- [3]: 'd'
         |--- [4]: 'o'
         |--- [5]: 'm'

我已经知道的事情

我知道,如果我添加

(char(*)[6])pp[0]
作为监视表达式,我将能够查看从
pp[0][0]
pp[0][5]
的 6 个字符值,但是如果我要处理数百个指针并且需要快速浏览这些值。

watch char values of a single string

我正在寻找一种添加一个监视表达式的方法,并且能够获得像上面这样的视图,就像我在调试器中查看链接列表一样。
或者,采用完全不同的方法,例如使用扩展。

c debugging visual-studio-code vscode-debugger
1个回答
7
投票

这应该可以完成工作(但也请参阅下面的更清洁的解决方案):

(char (*(*)[4])[6])pp

enter image description here

如您所见,您已经非常接近了!

当然,您使用的字符串可能没有固定大小,因此第二个维度

[6]
将不准确,并且可能应该与您期望的最长字符串匹配。因此,对于较短的字符串,您可能会从相邻的内存位置看到一些乱码。

编辑: 正如我后来发现的,您也可以放弃第二个维度并使用这个更干净的版本:

(char (*(*)[N]))pp

其中

N
是数组中的字符串数量。

© www.soinside.com 2019 - 2024. All rights reserved.