如何在gdb postmortem中访问STL类,如std::string?

如何在gdb postmortem中访问STL类,如std::string?,gdb,core,stdstring,Gdb,Core,Stdstring,我有一个带有std::string的内核转储,我想在gdb中检查它。打印它会将其内容作为以null结尾的字符串提供给我,但是如何访问其他std::string属性,例如大小和容量?尝试访问s.size()会直接导致一个错误,“如果没有要调试的进程,就无法执行此操作。”首先,禁用任何漂亮的打印机以查看您尝试打印的结构的原始成员变量 (gdb) disable pretty-printer 对于许多STL类,它们的成员(希望)不太难理解。例如,在禁用“漂亮打印”的情况下打印std::vector,

我有一个带有
std::string
的内核转储,我想在gdb中检查它。打印它会将其内容作为以null结尾的字符串提供给我,但是如何访问其他
std::string
属性,例如大小和容量?尝试访问
s.size()
会直接导致一个错误,“如果没有要调试的进程,就无法执行此操作。”

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

(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}}, } $2={,std::分配器>,std::分配器,std::分配器>>={ _M_impl={,std::allocator>>>={,std::allocator>>>={},},_M_start=0x804b028,_M_finish=0x804b02c, __存储器的M_end_=0x804b02c},} 由于成员变量是
\u M\u impl.\u M\u start
\u M\u impl.\u M\u finish
\u M\u impl.\u end\u存储
,因此可以按如下方式对向量v使用它们:

  • 元素0-
    \u M\u impl.\u M\u start[0]
  • 大小-
    v.\M\u impl.\M\u end-v.\M\u impl.\M\u start
  • 容量-
    v.\u M\u impl.\u结束存储-v.\u M\u impl.\u开始
特别是字符串更难。显示容量、大小和引用计数存储在字符串开头之前,存储在
std::basic_string::_Rep
结构中,并且gdb无法解析此结构,因此我不得不求助于指针算术黑客。下面介绍如何在32位x86应用程序中使用C++11之前的ABI对字符串
s
执行此操作;其他平台可能有所不同

  • 参考计数-
    ((int*)s.\u M\u dataplus.\u M\u p)[-1]
  • 容量-
    ((int*)s.\u M\u dataplus.\u M\u p)[-2]
  • 大小-
    ((int*)s.\u M\u dataplus.\u M\u p)[-3]

这个被愚弄的问题有一个非常过时的答案。真正的答案是@EmployedRussian——在我的例子中,GDB STL支持并没有告诉我需要知道的一切(字符串大小和容量、超过某个数字的向量元素等等)。