c++ - QtCreator / GDB 调试器:不可访问,或“this”对象未显示
问题描述
在我的堆栈中main()
,我有一些变量(reader
),它是类型OggReader
(一些自己的struct
/ class
)。此变量<not accessible>
在 Qt Creator / GDB 调试器中显示:
然后,我在这个类上调用了一些函数,所以它this
应该指向这个reader
对象。但 Qt Creator / GDB 不显示以下内容this
:
为什么?我怎样才能解决这个问题?
这是 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
成员函数内部,它也不显示此dummy
ptr 的内容(它与 的地址相同this
,因为buffer_page_
从 0 偏移开始this
)。
这个问题是相关的,虽然我认为它不是关于this
(一些自己的struct
/ class
)而是关于标准类型(std::string
或左右)。此外,所有给定的解决方案都没有效果,或者不适用。例如“加载系统 GDB 漂亮的打印机”已经被禁用。
解决方案
原因是在优化构建中,您可以拥有一些被优化掉或仅在寄存器中可用的变量。在这些情况下,调试器无法获取值,您会看到这些<not accessible>
或<optimized away>
.
降低优化级别,您将开始看到更多这些变量(以降低速度为代价)。
这里似乎也没有非标准类型的默认显示。char*
被显示,因为它是一个 C 风格的字符串,所以它们会有一个适当的显示。就像 VS 有 natvis 文件,QtCreator 支持帮助程序,Python 文件可以用来显示你所需要的。
如果您只想在只有指针的情况下获取结构的内容,您也可以这样做const auto& v = *this;
:
推荐阅读
- python - 从字符串中选择单词时,使用 BeautifulSoup Python 从字符串中删除不需要的字符
- android - 如何限制某些应用出现在共享选择器中?
- java - 以编程方式启用锁屏保护程序
- android - 是否可以从 BroadcastReceiver/Alarm Manager 获取 FlutterView?
- html - 将缩进项的子项拉伸到父项的全宽
- emacs - 使用显示条目文本获取自定义组织议程
- scala - 播放框架 i18n。如何路由到没有国家代码的语言
- python-3.x - jupyter notebook / 由于 KeyError 无法启动内核
- java - 带有自定义单元格的 javafx listview
- bash - 如何在 bash 脚本中扩展变量时保留包含空格的单词?