在使用gdb检查核心转储时,是否有方法运行函数(如std::string.size())? 考虑一个产生分段错误并中止的C++程序。

在使用gdb检查核心转储时,是否有方法运行函数(如std::string.size())? 考虑一个产生分段错误并中止的C++程序。,c++,gdb,std,coredump,C++,Gdb,Std,Coredump,在使用gdb进行常规调试时,我可以执行以下操作并查看结果 (gdb) r (gdb) p str_var.size() 其中str_var在文件中定义为std::string 但是,我在调试内核转储时遇到了一些问题。在我将内核转储加载到gdb之后 gdb EXECUTABLE core.pid 并在gdb终端中运行以下命令 (gdb) p str_var.size() gdb说“如果没有一个要调试的进程,你就无法做到这一点。” 我只能执行bt(查看堆栈跟踪)或直接打印std::string

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

(gdb) r
(gdb) p str_var.size()
其中str_var在文件中定义为std::string

但是,我在调试内核转储时遇到了一些问题。在我将内核转储加载到gdb之后

gdb EXECUTABLE core.pid
并在gdb终端中运行以下命令

(gdb) p str_var.size()
gdb说“如果没有一个要调试的进程,你就无法做到这一点。”


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

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

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


不过,正如n.m.所说,如果您使用一些标准stl(例如,在stlport AFAIK上不工作),有一些漂亮的打印机可以简化任务。

不,您需要一个进程来运行函数。幸运的是,gdb为您提供了python漂亮的打印机,可以很好地格式化std字符串和容器。