C++ 如何在没有源代码的情况下检查GDB中的std::string?

C++ 如何在没有源代码的情况下检查GDB中的std::string?,c++,stl,gdb,std,c++-standard-library,C++,Stl,Gdb,Std,C++ Standard Library,我试图调试一个没有可用源代码的程序,我需要查看它在std::string中存储了什么。我一直在谷歌上搜索并查看这里,我发现了一些关于输出STL容器的信息,但所有这些都涉及变量,没有源代码或调试信息,我所拥有的只是类数据的内存偏移量。有什么方法可以做到这一点吗?每个std::string实现都有一个指向其中某个原始字符的指针。对于g++4.x,指针位于字符串的偏移量0 如果您知道字符串位于,例如0x7fffffffda88,则 print *(char**)0x7fffffffda88 是您所需

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

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

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

print *(char**)0x7fffffffda88

是您所需要的。

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

print myStr.c_str()

谢谢你,成功了。我想知道的一件事是,我自己是怎么想出来的。i、 e.给定类“X”的源代码,我如何计算该类中字段的位置?目前我能想到的唯一方法是编译我自己的测试应用程序,并检查给定的指针(带有offsetof等)。计算偏移量的最快方法实际上是在调试模式下使用给定的类编译一个简单的测试程序,并检查GDB中的偏移量和类布局。这正是我为回答你的问题所做的;-)另一方面,如果像clang的libc++那样使用SSO,那么对于小字符串没有这样的指针。;-)这很有帮助。在调试内核转储时,我试图查看std::string变量。然而,像“ps.size()”或“ps.c_str()”这样的命令在这种情况下不起作用(gdb会恼人地不断说“没有调试的进程,您就不能这样做”)。这里发布的方法提供了一种变通方法。这在Ubuntu 20.04 LTS上的GDB 9.1-0ubuntu1上不起作用