首页 > 解决方案 > QtCreator / GDB 调试器:不可访问,或“this”对象未显示

问题描述

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

屏幕1

然后,我在这个类上调用了一些函数,所以它this应该指向这个reader对象。但 Qt Creator / GDB 不显示以下内容this

屏幕2 屏幕3

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

这是 Ubuntu 16.04 上的 Qt Creator 4.0.2。我将 g++ 5.4.0 与 options 一起使用-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成员函数内部,它也不显示此dummyptr 的内容(它与 的地址相同this,因为buffer_page_从 0 偏移开始this)。

这个问题是相关的,虽然我认为它不是关于this(一些自己的struct/ class)而是关于标准类型(std::string或左右)。此外,所有给定的解决方案都没有效果,或者不适用。例如“加载系统 GDB 漂亮的打印机”已经被禁用。

标签: c++gdbqt-creator

解决方案


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

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

这里似乎也没有非标准类型的默认显示。char*被显示,因为它是一个 C 风格的字符串,所以它们会有一个适当的显示。就像 VS 有 natvis 文件,QtCreator 支持帮助程序,Python 文件可以用来显示你所需要的。

如果您只想在只有指针的情况下获取结构的内容,您也可以这样做const auto& v = *this;


推荐阅读