在我的main()
中,我在堆栈上有一些变量(reader
),其类型为OggReader
(有些是自己的struct
/ class
) 。在Qt Creator / GDB调试器中,该变量显示为<not accessible>
:
然后,我在此类上调用一些函数,以便this
指向此reader
对象。但是Qt Creator / GDB不会显示this
的内容:
为什么?我该如何解决?
这是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漂亮打印机”已被禁用。
答案 0 :(得分:1)
原因是在优化的构建中,您可以删除一些已优化的变量或仅在寄存器中可用。在这些情况下,调试器无法获取值,您将看到这些<not accessible>
或<optimized away>
。
降低优化级别,您将开始看到更多这些变量(以降低速度为代价)。
在这里似乎也没有默认显示非标准类型。显示char*
,因为它是C样式的字符串,所以将有适当的显示。就像VS具有natvis文件一样,QtCreator支持helpers,Python文件可用于显示所需内容。
如果只想拥有一个指针只是想得到一个结构体的内容,也可以这样做:const auto& v = *this;
。