在GDB中创建c++字符串

Creating C++ string in GDB

本文关键字:c++ 字符串 创建 GDB      更新时间:2023-10-16

我在GDB中创建std::string(或任何c++对象)时遇到了麻烦。我尝试了很多变化,但似乎没有一个工作:

(gdb) p std::string("hello")
A syntax error in expression, near `"hello")'.

有办法吗?

我很惊讶我在网上找不到关于这个的任何东西。我开始想如果我的GDB是有bug的,或者我做了一些非常错误的事情。)

您应该能够在GDB中构造一个新的std::string。您希望在堆上分配空间来保存std::string对象,调用默认构造函数,并分配字符串值。下面是一个例子:

(gdb) call malloc(sizeof(std::string))
$1 = (void *) 0x91a6a0
(gdb) call ((std::string*)0x91a6a0)->basic_string()
(gdb) call ((std::string*)0x91a6a0)->assign("Hello, World")
$2 = (std::basic_string<char, std::char_traits<char>, std::allocator<char> > &) @0x91a6a0: {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x91a6f8 "Hello, World"}}
(gdb) call SomeFunctionThatTakesAConstStringRef(*(const std::string*)0x91a6a0)

GDB不能真正做到你所描述的。你的案子涉及:

  1. 实例化basic_string模板并为
  2. 类生成代码
  3. 生成对构造函数的调用

这意味着它必须完成和编译器一样复杂的工作。这不是调试器的工作。

尽管如此,GDB能够计算有限的语句子集,例如使用现有的数据调用现有的函数并检索其结果,因为这不会涉及生成大量代码。

你说的"创造"是什么意思?GDB不持久化c++对象(你的应用程序会这样做),所以你不能在GDB本身中创建一个c++对象。

但是,您应该能够从GDB中调用应用程序的特定函数