使用 gdb 检查核心转储时,有没有办法 运行 函数(如 std::string.size())?

Is there a way to run functions (like std::string.size()) when examining core dumps with gdb?

考虑一个产生某些分段错误并中止的 C++ 程序。

在使用 gdb 进行常规调试时,我可以执行以下操作并查看结果

(gdb) r
(gdb) p str_var.size()

其中 str_var 在文件中定义为 std::string。

但是,我在使用核心转储进行调试时遇到了一些问题。在我通过

在 gdb 中加载核心转储之后
gdb EXECUTABLE core.pid

和运行 gdb终端中的以下命令

(gdb) p str_var.size()

gdb 说 "You can't do that without a process to debug."

我只能做 bt(查看堆栈跟踪)或直接打印 std::string 变量之类的事情,但是找不到一种简单的方法来检查一些信息,例如打印 [=] 的大小30=]。调试核心转储时,调试能力是否总是受限?特别是这里的问题,有没有办法在核心转储调试中知道std::string的大小?

不,为了能够调用一个函数,您需要一个在读取核心文件时不存在的上下文。获取信息的唯一方法是探索 class(es) 以找到它的存储位置,但这可能会很痛苦,因为 stl 可能有一些很难遵循的实现。

此外,根据您的程序和编译选项,某些值可能会被内联(不存储)或存储在寄存器中,这会使任务变得非常痛苦。

然而,如前所述 n.m,如果您使用一些标准的 stl(例如,请勿在 stlport AFAIK 上工作),有一些漂亮的打印机可以简化任务

如果使用 gcc 编译,std::string 结构: 您应该在 _M_dataplus._M_p.

之前阅读 _Rep
p ((std::string::_Rep*)image_data)[-1]

然后打印这个。

{<std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep_base> = {_M_length = 30752, _M_capacity = 32711, _M_refcount = -1}, static _S_max_size = 4611686018427387897, static _S_terminal = 0 '[=11=]0', static _S_empty_rep_storage = <optimized out>}