在GDB中创建C ++字符串

时间:2011-09-15 10:32:31

标签: c++ gdb

我在GDB中创建std::string(或任何C ++对象)时遇到了问题。我尝试了以下很多变化,但似乎没有任何变化:

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

有办法吗?

(我很惊讶我在网上找不到任何相关信息。我开始考虑我的GDB是否有问题,或者我做错了什么。)

3 个答案:

答案 0 :(得分:26)

您应该能够在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)

答案 1 :(得分:2)

GDB无法真正按照您的描述进行操作。您的案件涉及:

  1. 实例化basic_string模板并为类生成代码
  2. 生成对构造函数的调用
  3. 这意味着它必须完成与编译器相同的复杂工作。这不是调试器的工作。

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

答案 2 :(得分:1)

“创造”是什么意思? GDB不会持久化C ++对象(您的应用程序会这样做),因此您无法在GDB本身中创建C ++对象。

但是,您应该能够从GDB调用应用程序的特定功能。