【问题标题】:Is there a way to run functions (like std::string.size()) when examining core dumps with gdb?在使用 gdb 检查核心转储时,有没有办法运行函数(如 std::string.size())?
【发布时间】:2016-02-29 19:13:54
【问题描述】:

考虑一个产生一些分段错误并中止的 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 说“如果没有要调试的进程,您将无法做到这一点。”

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

【问题讨论】:

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

标签: c++ gdb std coredump


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    如果你用 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 '\000', static _S_empty_rep_storage = <optimized out>}
    

    【讨论】:

    • 您的回复未包含问题的正确答案,请考虑将您的帖子翻译成英文
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多