如何在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]