2015-04-01 48 views
3

我有一个std::string核心转储,我想在gdb中检查。打印它给我的内容为空终止字符串,但我如何访问其他std::string属性,如大小和容量?试图直接访问s.size()会导致错误,“如果没有进程调试,则不能这样做。”如何在gdb postmortem中访问像std :: string这样的STL类?

+0

这让上当的问题有一个非常过时的答案。真正的答案是https://sourceware.org/gdb/wiki/STLSupport – 2015-04-02 03:28:46

+0

@EmployedRussian - 在我的情况下,GDB STL支持并没有告诉我我需要知道的一切(字符串大小和容量,号码等)。 – 2015-04-02 12:04:59

回答

6

首先,禁用任何漂亮打印机以查看您尝试打印的结构的原始成员变量。

(gdb) disable pretty-printer 

对于很多STL类,他们的成员(希望)不会太难以弄清楚。例如,印刷用漂亮的印刷禁用一个std::vector提供了一种类似于输出如下:

 
$2 = {, std::allocator >, std::allocator, std::allocator > > >> = { 
    _M_impl = {, std::allocator > >> = {, std::allocator > >> = {}, }, _M_start = 0x804b028, _M_finish = 0x804b02c, 
     _M_end_of_storage = 0x804b02c}}, } 

由于成员变量是_M_impl._M_start_M_impl._M_finish,并且_M_impl._M_end_of_storage,您可以为向量v如下使用它们:

  • 元件0 - _M_impl._M_start[0]
  • 大小 - v._M_impl._M_end - v._M_impl._M_start
  • 容量 - v._M_impl._M_end_of_storage - v._M_impl._M_start

std :: string尤其困难。 libstdc++'s implementation显示容量,大小和引用计数存储在std::basic_string::_Rep结构中的字符串开始之前,并且gdb无法解析此结构,因此我不得不求助于指针算术hack。以下是如何在32位x86应用程序中使用Pre-C++ 11 ABI字符串s;其他平台可能不同。

  • 引用计数 - ((int*)s._M_dataplus._M_p)[-1]
  • 能力 - ((int*)s._M_dataplus._M_p)[-2]
  • 大小 - ((int*)s._M_dataplus._M_p)[-3]