【问题标题】:How to inspect std::string in GDB with no source code?如何在没有源代码的情况下检查 GDB 中的 std::string?
【发布时间】:2023-03-20 02:24:01
【问题描述】:

我正在尝试调试一个没有可用源代码的程序,我需要查看它存储在 std::string 中的内容。我一直在谷歌搜索和查看这里,我发现了一些关于输出 STL 容器的信息,但所有这些信息都指的是变量,没有源或调试信息,我所拥有的只是类数据的内存偏移量。有没有办法做到这一点?

【问题讨论】:

    标签: c++ stl gdb std c++-standard-library


    【解决方案1】:

    每个std::string 实现都有一个指向其中某个地方的原始字符的指针。对于g++ 4.x,该指针位于字符串中的偏移量0

    如果您知道字符串位于例如0x7fffffffda88,然后

    print *(char**)0x7fffffffda88
    

    是你需要的。

    【讨论】:

    • 谢谢你,成功了。我想知道的一件事是我自己如何想出类似的东西。即给定类“X”的源代码,我将如何确定该类中字段的位置?目前我能想到的唯一方法是编译我自己的测试应用程序并检查我给出的指针(使用 offsetof 等)。
    • 找出偏移量的最快方法实际上是在调试模式下使用给定类编译一个简单的测试程序,并检查 GDB 中的偏移量和类布局。这正是我为回答您的问题所做的 ;-)
    • 顺便说一句,如果像在clang的libc++中那样使用SSO,小字符串就没有这样的指针。 ;-)
    • 这很有帮助。我试图在调试核心转储时查看 std::string 变量。但是,像“p s.size()”或“p s.c_str()”这样的命令在这种情况下不起作用(gdb 会烦人地一直说“如果没有调试进程,你就不能这样做”)。此处发布的方法提供了一种解决方法。
    【解决方案2】:

    也许最简单的选择是使用c_str 方法,如:

    print myStr.c_str()
    

    【讨论】:

    • 这不适用于 Ubuntu 20.04 LTS 上的 GDB 9.1-0ubuntu1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多