【问题标题】:Creating C++ string in GDB在 GDB 中创建 C++ 字符串
【发布时间】:2011-09-15 10:32:31
【问题描述】:

我无法在 GDB 中创建 std::string(或任何 C++ 对象,我猜)。我尝试了以下多种变体,但似乎都不起作用:

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

有办法吗?

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

【问题讨论】:

  • 我不认为你可以开箱即用。 GDB 几乎需要一个 C++ 编译器来理解变量的声明...
  • Diego:请随意添加它作为答案,这样我可以接受。

标签: c++ gdb


【解决方案1】:

您应该能够在 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) set $mystr = (std::string*) malloc(sizeof(std::string)), (gdb) call $mystr->basic_string(), (gdb) call $mystr->assign( "foo"), (gdb) 调用 some_function(*$mystr)
  • (gdb) call malloc(sizeof(std::string)) 导致No symbol "string" in namespace "std". 我做错了什么?
  • @Moberg 你需要call (void *)malloc(sizeof(std::string))
  • 我得到 Converting character sets: Invalid argument. for assign()
【解决方案2】:

GDB 不能真正做到你描述的那样。您的案例涉及:

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

这意味着它必须完成与编译器相同复杂性的工作。这不是调试器的工作。

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

【讨论】:

  • 我认为“太复杂”是一个完全正当的理由。但是,我不同意您的观点,即“不是调试器的工作”;可能我太习惯了 Python 的调试器允许我在环境中运行任何 Python 代码。
  • 当然,实例化模板不是调试器的工作,但由于我已经将 basic_string 函数编译到我的程序中,我认为原则上没有理由找不到并打电话给他们,而不是求助于 Jason Dillaman 给出的搞笑解决方法。
  • 我看不出 Jason 的回答有什么好笑的。在我看来这完全合理。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多