访问GDB中的C++模板变量

Accessing C++ template variables in GDB

本文关键字:变量 C++ GDB 中的 访问      更新时间:2023-10-16

我正在尝试调试一个核心转储,并希望访问使用C++中的模板类实现的变量。

我在我的可执行文件中获取了一个符号的objdump,该文件将以下内容作为符号之一hmapnspace::HandleMapParameters<(hmapnspace::HandleType)1>::m_arHandleArray

但是当我试图访问gdb中的这个变量时,它会给我以下错误:

(gdb) p hmapnspace::HandleMapParameters<(hmapnspace::HandleType)1>::m_arHandleArray
No type "HandleMapParameters<(hmapnspace::HandleType)1>" within class or namespace "hmapnspace".

如何正确访问此变量?

有时,gdb对C++程序中的名称有一些看似奇怪的想法。要克服此问题,请尝试键入

print 'hmapnspace::HandleMapPar

然后按Tab键完成(注意单引号,您必须使用它)。

你也可以算出变量的地址,然后说一些类似的话

print *(int*) 0xdeadbabe

当您需要监视名称不在作用域中的值时非常方便。

我认为这是一个静态成员变量。如果没有,你是否处于正确的上下文(框架)中?

你是不是像n.m.建议的那样按Tab键?我注意到gdb在命令行中不能很好地处理类型转换。

最后,gdb的最新版本(例如7.2)处理模板的能力要比早期版本好得多。例如,您现在可以在模板函数或模板类中轻松地设置断点,gdb可以在该函数的所有模板版本中适当地设置断点。然而,我不知道这些gdb改进是否适用于您正在做的事情。