在我main()
,我有栈,它的类型是reader
(一些自己OggReader
/ struct
)的一些变量(class
)。这个变量被示出为在Qt创建者/ GDB调试<not accessible>
:
然后,我呼吁这个类的一些功能,使this
应指向此reader
对象。但Qt Creator中/ GDB不显示this
的内容:
为什么?我怎样才能解决这个问题?
这是在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漂亮打印机”已经被禁用。
其原因是,在优化的版本,你可以有一些变量被优化掉或仅在寄存器可用。在这种情况下,是没有办法的调试器来获取值,你会看到这些<not accessible>
或<optimized away>
。
降低优化级别,你将开始看到更多这些变量(在降低速度为代价)。
看来在这里,也有非标类没有默认的显示。 char*
显示,因为它是一个C风格的字符串,这样就不会有正确的显示它们。就像VS具有natvis文件,QtCreator支持helpers,可以用来正是你需要的显示Python文件。
如果你只是想获得一个结构的内容,当你只有一个指针,你也可以这样做:qazxsw POI。