如何在 VSCode 的调试器模式下查看指向指针的指针指向的字符串的 char 值
How to watch char values of strings pointed by a pointer to pointers in debugger mode of VSCode
假设我正在使用这个 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]: '[=12=]'
|
|- pp[1]: [6] <address of pp[1]>
| |--- [0]: 'g'
| |--- [1]: 'r'
| |--- [2]: 'e'
| |--- [3]: 'e'
| |--- [4]: 'n'
| |--- [5]: '[=12=]'
|
|- pp[2]: [6] <address of pp[2]>
| |--- [0]: 'b'
| |--- [1]: 'l'
| |--- [2]: 'u'
| |--- [3]: 'e'
| |--- [4]: '.'
| |--- [5]: '[=12=]'
|
|- 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 个字符值,但这不是一个理想的解决方案如果我要处理数百个指针并且需要快速浏览这些值。
我正在寻找一种方法来添加一个监视表达式,并能够获得如上所示的视图,就像我在调试器中监视链表时一样。
或者,一种完全不同的方法,例如使用扩展程序。
这应该可以完成工作:
(char (*(*)[4])[6])pp
如你所见,你已经非常接近了!
当然,您使用的字符串可能没有固定的大小,因此第二个维度 [6]
将不准确,可能应该匹配您期望的最长字符串。因此,对于较短的字符串,您可能会从相邻的内存位置看到一些乱码。
PS:(char (*(*)[4]))pp
也可以
假设我正在使用这个 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]: '[=12=]'
|
|- pp[1]: [6] <address of pp[1]>
| |--- [0]: 'g'
| |--- [1]: 'r'
| |--- [2]: 'e'
| |--- [3]: 'e'
| |--- [4]: 'n'
| |--- [5]: '[=12=]'
|
|- pp[2]: [6] <address of pp[2]>
| |--- [0]: 'b'
| |--- [1]: 'l'
| |--- [2]: 'u'
| |--- [3]: 'e'
| |--- [4]: '.'
| |--- [5]: '[=12=]'
|
|- 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 个字符值,但这不是一个理想的解决方案如果我要处理数百个指针并且需要快速浏览这些值。
我正在寻找一种方法来添加一个监视表达式,并能够获得如上所示的视图,就像我在调试器中监视链表时一样。
或者,一种完全不同的方法,例如使用扩展程序。
这应该可以完成工作:
(char (*(*)[4])[6])pp
如你所见,你已经非常接近了!
当然,您使用的字符串可能没有固定的大小,因此第二个维度 [6]
将不准确,可能应该匹配您期望的最长字符串。因此,对于较短的字符串,您可能会从相邻的内存位置看到一些乱码。
PS:(char (*(*)[4]))pp
也可以