gdb 打印软数组的数组

Posted

技术标签:

【中文标题】gdb 打印软数组的数组【英文标题】:gdb print array of soft array 【发布时间】:2018-11-11 15:52:14 【问题描述】:
#include <stdio.h>
#include <malloc.h>
typedef struct _soft_array

    int len;
    int array[];//int array[0];
SoftArray;

int main()
  
    int i = 0;
    SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int) * 10);

    sa->len = 10;

    for(i=0; i<sa->len; i++)
    
        sa->array[i] = i + 1;
    

    for(i=0; i<sa->len; i++)
    
        printf("%d\n", sa->array[i]);   
    

    free(sa);

    return 0;

我使用gdb打印sa->array的数组,然后有些让我困惑:

(gdb) p sa->array
$1 = 0x602014
(gdb) p *sa->array@10
$2 = [0] = 1, [1] = 2, [2] = 3, [3] = 4, [4] = 5, [5] = 6, [6] = 7, [7] = 8, [8] = 9, [9] = 10
(gdb) p sizeof(int)
$3 = 4
(gdb) p *(char *)0x602014@40
$4 = "\001\000\000\000\002\000\000\000\003\000\000\000\004\000\000\000\005\000\000\000\006\000\000\000\a\000\000\000\b\000\000\000\t\000\000\000\n\000\000"
(gdb)

第一种方法运行良好(我在 .gdbinit 中添加了 set print array-indexes on)。

sizeof(int)==4,然后我用p *(char *)0x602014@40,由于我的电脑是little-endian,所以1显示为01 00 00 00。

显示7时,输出变成a?

这是怎么发生的,或者我错过了什么?

【问题讨论】:

您是否正在调试优化的构建?如果是这样,调试体验不可靠。 【参考方案1】:

请注意,输出不是字符'a',而是'\a'。这是ASCII 中的alert 字符。就像您稍后会得到 '\b''\t''\n' 以获取这些字符的 ASCII 等效项。

This character escape reference 包含所有标准 C 转义字符的列表,以及它们的 ASCII 编码值。

【讨论】:

不熟悉转义序列,阅读文章了解很多。command p *(char *)0x602014@40 只打印八进制的每个字节,这对我来说很不寻常。

以上是关于gdb 打印软数组的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何打印完整的字符数组gdb

如何使用 gdb 为 Fortran 程序打印数组大小(绑定)

Fortran在gdb中打印可分配数组

使用gdb时,如何在Pascal中打印数组中的一部分值

GDB 可以用于在 Fortran 90 中打印派生类型的可分配数组的值吗? [复制]

有没有一种方法可以在100到1000个索引的范围内打印长数组到GDB中的txt文件? (调试Fortran代码)