QtCreator / GDB调试器:不可访问,或未显示“此”对象

时间:2019-02-06 10:11:12

标签: c++ gdb qt-creator

在我的main()中,我在堆栈上有一些变量(reader),其类型为OggReader(有些是自己的struct / class) 。在Qt Creator / GDB调试器中,该变量显示为<not accessible>

screen1

然后,我在此类上调用一些函数,以便this指向此reader对象。但是Qt Creator / GDB不会显示this的内容:

screen2 screen3

为什么?我该如何解决?

这是Ubuntu 16.04上的Qt Creator 4.0.2。 我使用带有选项-g -O0 -g3 -ggdb的g ++ 5.4.0。 我使用的是gdb 7.11.1。

OggReader类:

struct OggReader {
    Page buffer_page_;
    std::map<uint32_t, VorbisStream> streams_;
    size_t packet_counts_;
    std::shared_ptr<IReader> reader_;
    ParseCallbacks& callbacks_;

    OggReader(ParseCallbacks& callbacks) : packet_counts_(0), callbacks_(callbacks) {}

    ...
};

Page

struct Page {
    PageHeader header;
    uint8_t segment_table[256]; // page_segments_num in len
    uint32_t data_len;
    uint8_t data[256 * 256];

    ...
};

PageHeader

struct __attribute__((packed)) PageHeader {
    char capture_pattern[4]; // should be "OggS"
    uint8_t stream_structure_version; // should be 0
    uint8_t header_type_flag; // 0x1: continued, 0x2: first (bos), 0x4: last (eos)
    int64_t absolute_granule_pos; // end PCM sample position of the last packet completed on that page
    uint32_t stream_serial_num;
    uint32_t page_sequence_num;
    uint32_t page_crc_checksum;
    uint8_t page_segments_num;
};

也许__attribute__((packed))使GDB感到困惑? 即使我明确地这样做

Page* dummy = &buffer_page_;

在某些Page成员函数中,它也不显示此dummy ptr的内容(它与this的地址相同,因为buffer_page_从零偏移开始来自this)。

This question是相关的,尽管我认为这与this(不是一些自己的struct / class)有关,而是与标准类型(std::string或所以)。同样,所有给定的解决方案均无效或不适用。例如。 “加载系统GDB漂亮打印机”已被禁用。

1 个答案:

答案 0 :(得分:1)

原因是在优化的构建中,您可以删除一些已优化的变量或仅在寄存器中可用。在这些情况下,调试器无法获取值,您将看到这些<not accessible><optimized away>

降低优化级别,您将开始看到更多这些变量(以降低速度为代价)。

在这里似乎也没有默认显示非标准类型。显示char*,因为它是C样式的字符串,所以将有适当的显示。就像VS具有natvis文件一样,QtCreator支持helpers,Python文件可用于显示所需内容。

如果只想拥有一个指针只是想得到一个结构体的内容,也可以这样做:const auto& v = *this;