QtCreator / GDB调试器:不可访问,或`未示出this`对象

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

在我main(),我有栈,它的类型是reader(一些自己OggReader / struct)的一些变量(class)。这个变量被示出为在Qt创建者/ GDB调试<not accessible>

screen1

然后,我呼吁这个类的一些功能,使this应指向此reader对象。但Qt Creator中/ GDB不显示this的内容:

screen2 screen3

为什么?我怎样才能解决这个问题?

这是在Ubuntu 16.04 Qt Creator的4.0.2。我用G ++ 5.4.0与期权-g -O0 -g3 -ggdb。我用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漂亮打印机”已经被禁用。

c++ gdb qt-creator
1个回答
1
投票

其原因是,在优化的版本,你可以有一些变量被优化掉或仅在寄存器可用。在这种情况下,是没有办法的调试器来获取值,你会看到这些<not accessible><optimized away>

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

看来在这里,也有非标类没有默认的显示。 char*显示,因为它是一个C风格的字符串,这样就不会有正确的显示它们。就像VS具有natvis文件,QtCreator支持helpers,可以用来正是你需要的显示Python文件。

如果你只是想获得一个结构的内容,当你只有一个指针,你也可以这样做:qazxsw POI。

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