当我们调试 C++ 应用程序时,是否有一些“默认函数”可以在 GDB 上打印字符串等对象?像:toString();
或者我的班级必须实现类似的东西?
您总是可以使用命令打印std::string
(或其他任何内容) 。print
然而,与 C++ 模板容器内部的斗争可能并不令人愉快。在最新版本的工具链(GDB + Python + Pretty Printers,通常作为开发包的一部分安装在大多数用户友好的 Linux 发行版上)中,它们会被自动识别和打印(漂亮!)。例如:
$ cat test.cpp
#include <string>
#include <iostream>
int main()
{
std::string s = "Hello, World!";
std::cout << s << std::endl;
}
$ g++ -Wall -ggdb -o test ./test.cpp
$ gdb ./test
(gdb) break main
Breakpoint 1 at 0x400ae5: file ./test.cpp, line 6.
(gdb) run
Starting program: /tmp/test
Breakpoint 1, main () at ./test.cpp:6
6 std::string s = "Hello, World!";
Missing separate debuginfos, use: debuginfo-install glibc-2.16-28.fc18.x86_64 libgcc-4.7.2-8.fc18.x86_64 libstdc++-4.7.2-8.fc18.x86_64
(gdb) next
7 std::cout << s << std::endl;
(gdb) p s
$1 = "Hello, World!"
(gdb)
正如@111111 所指出的,请查看http://sourceware.org/gdb/wiki/STLSupport以获取有关如何自己安装它的说明。
您可以在调试会话期间从标准库或您自己的数据类型调用任何成员函数。这有时是在 gdb 中输出对象状态的最简单方法。因为std::string
你可以称它为c_str()
返回的成员const char*
:
(gdb) p str.c_str()
$1 = "Hello, World!"
虽然这仅适用于调试实时进程,但不适用于核心转储调试。
operator<<
从 GDB定义并调用它
C++ 等价于 Java 的 toString?在评论中提到,并且operator<<
是在类上定义字符串方法的最常见方法。
这可能是最明智的方法,因为生成的字符串方法将成为代码库本身的一部分,因此:
不幸的是,我还没有找到一种operator<<
从 GDB 调用的完全理智的方法,真是一团糟:在 gdb 中调用 operator<<
这对我的 hello world 测试有效:
(gdb) call (void)operator<<(std::cerr, my_class)
MyClass: i = 0(gdb)
最后没有换行符,但我可以忍受。
主文件
#include <iostream>
struct MyClass {
int i;
MyClass() { i = 0; }
};
std::ostream& operator<<(std::ostream &oss, const MyClass &my_class) {
return oss << "MyClass: i = " << my_class.i;
}
int main() {
MyClass my_class;
std::cout << my_class << std::endl;
}
编译:
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
在 GDB 8.1.0、Ubuntu 18.04 中测试。