gpt4 book ai didi

c++ - 使用 GDB 从核心文件调试 C++

转载 作者:行者123 更新时间:2023-11-30 00:42:10 25 4
gpt4 key购买 nike

GDB 似乎总是只适用于 C 程序,但对于 C++,我经常得到这些神秘的堆栈:

(gdb) bt
#0 0x08055fa4 in std::runtime_error::what ()
#1 0x080576c8 in std::runtime_error::what ()
#2 0x08057dda in std::runtime_error::what ()
#3 0x080580d2 in std::runtime_error::what ()
#4 0x08058662 in std::runtime_error::what ()
#5 0x08058725 in std::runtime_error::what ()
#6 0x0806ef7a in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*> ()
#7 0x00c0adec in __libc_start_main () from /lib/libc.so.6
#8 0x0804d011 in std::runtime_error::what ()

从表面上看,它完全没有提供任何关于问题发生位置的线索。无论如何,是否可以从这样的核心文件中获取更多信息 - 或者让程序转储更有用的东西?

最佳答案

std::runtime_error::what() 的文本不太可能实际涵盖回溯所建议的从 0x0804d011 到 0x08058725 的范围。那将超过 45KB 的代码。

尝试解析 0x08055fa4、0x080576c8 等的符号查找代码更有可能只是将 std::runtime_error::what() 定位为这些地址之前的最后一个可用符号,这通常是剥离可执行文件的结果(就像您通过将 -s 开关传递给链接器所做的那样)。

我会专注于栈帧#6。由于这是一个相当简单的类的构造函数,我的 SWAG 是您传入了 NULL 指针或指向非 NULL 终止字符串的指针。

编辑:请注意,如果您只是在没有 -s 开关的情况下从完全相同的源重建可执行文件,您将从 GDB 获得更有用的堆栈,使用您已有的 core 文件。无需等待新建的可执行文件再次转储 core

关于c++ - 使用 GDB 从核心文件调试 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1640718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com