在 Clion 的调试器中,如何显示 int 数组的全部内容

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

现在它只显示数组的第一个元素,但我想要数组中所有元素的可视化。我认为 Clion 正在使用 GDB。

编辑:我特指堆上的数组。堆栈上的数组可以被可视化。

c++ c debugging gdb clion
6个回答
66
投票

cubuspl42 的答案适用于 GDB。但是如果你在 Mac 上使用 LLDB 作为调试器,正确的方法是

(MyType(*)[128])myArray

希望这有帮助!


59
投票

不幸的是,CLion 目前不支持此类功能。根据 JetBrains 员工 的建议,您可以使用变通方法。在 Evaluate / Watches 窗口中使用以下表达式:

(MyType[128])myArray

您可以使用任意大小的数组;什么对你有用。

如果你的数组存储在

void *
变量中,你需要做一些更棘手的事情:

(MyType[128])*(char*)myArray

6
投票

底层调试器理解的任何语法实际上都应该有效。例如,对于 GDB,您可以使用

*array@size
,其中
array
可以是任何指针表达式,而
size
可以是任何(正)整数表达式,两者都可以包括变量、函数调用、寄存器等GDB 理解。这样的事情是有效的,例如:

*((int*)$rsp - 0x100)@get_size(data)

2
投票

我今天遇到了同样的问题,但是我有一个指针数组;

pthread_t** pthreads = (pthread_t**) malloc(//malloc args)
thread_count = 0;

while(thread_count < 10) {
    pthread_t* myThread = (pthread_t*) malloc(//malloc args)
    pthreads[thread_count] = myThread;
    thread_count++;
}

我无法在 CLion gdb 中查看此内存的分配,因为它查看了指向指针的指针。

我通过定位数组的第一个元素 (pthreads[0]) 然后从那里查看下一个

n
元素来解决这个问题。

为此,您需要转换类型 (pthread_t*[]),然后使用目标内存,即 pthreads[0](即第一个元素)

注意:我使用

calloc
和 0 来设置我的
pthreads
数组。这张照片显示了如何在 CLion 调试器的位置 0 正确分配内存。

我写这篇文章是因为上面的帖子都没有让我得出我在这里写的结论。

例子:


1
投票

您可以使用模板和参考:

template<int N>
void foo1(int (&arr)[N])
{
    ...
}

如果你想将数组传递给其他函数,传递的函数也应该使用数组的模板和引用:

template<int N>
void foo2(int (&arr)[N])
{
    ...
}
template<int N>
void foo1(int (&arr)[N])
{
    foo2(arr);
}

这个方法可以让你在clion中看到一个int数组的全部内容


0
投票

请注意,从 2021.3 版本开始,您现在可以通过在变量查看器中右键单击特定变量并选择“以数组形式查看...”来将指针以数组形式查看:

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