【问题标题】:How to call std library functions in lldb如何在lldb中调用std库函数
【发布时间】:2014-11-11 06:47:20
【问题描述】:

如何在 lldb 中打印出带有 std 库函数的表达式?例如,假设我想在打印表达式中使用std::string::c_str()。我可以看到该符号并将其反汇编,但似乎无法在表达式调用中使用它

(lldb) image lookup -v -r -n "c_str\("
2 matches found in /usr/lib/libc++.1.dylib:
        Address: libc++.1.dylib[0x0000000000041da6] (libc++.1.dylib.__TEXT.__text + 264214)
        Summary: libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str() const
         Module: file = "/usr/lib/libc++.1.dylib", arch = "x86_64"
         Symbol: id = {0x000002ec}, range = [0x00007fff8ec8cda6-0x00007fff8ec8cdbe), name="std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str() const", mangled="_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5c_strEv"



(lldb) dis -n "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str()"
libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str() const:
   0x7fff8ec8cda6:  pushq  %rbp
   0x7fff8ec8cda7:  movq   %rsp, %rbp
   0x7fff8ec8cdaa:  testb  $0x1, (%rdi)
   0x7fff8ec8cdad:  je     0x7fff8ec8cdb5            ; std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str() const + 15
   0x7fff8ec8cdaf:  movq   0x10(%rdi), %rdi
   0x7fff8ec8cdb3:  jmp    0x7fff8ec8cdb8            ; std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str() const + 18
   0x7fff8ec8cdb5:  incq   %rdi
   0x7fff8ec8cdb8:  movq   %rdi, %rax
   0x7fff8ec8cdbb:  popq   %rbp
   0x7fff8ec8cdbc:  retq   
   0x7fff8ec8cdbd:  nop    

但似乎不能在表达式中使用它。似乎总是被 std 命名空间标识符窒息

(lldb) expr std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str($rax)
error: use of undeclared identifier 'std'
error: expected unqualified-id
error: 2 errors parsing expression

【问题讨论】:

    标签: lldb


    【解决方案1】:

    这是一个实例方法,你必须在一个对象上调用它。在您的情况下,您似乎想要执行以下操作:

    (lldb) expr ((std::__1::string *) $rax)->c_str()
    (const value_type *) $1 = 0x00007fff5fbff661 "some string here"
    

    您确实不应该明确命名 __1,但 lldb 还不支持“内联命名空间”(并且 clang 调试信息并没有说 __1 是一个内联命名空间,所以现在您可以这样做。

    【讨论】:

    • 这仍然不起作用,我得到一个未声明的标识符 std。我想我是想问一个更基本的问题:如果我可以在符号表中看到一个函数 XXXX 并通过 dis -n XXXX 对其进行反汇编,为什么我不能通过 expr XXXX(... )。 XXXX 的大多数值似乎都可以正常工作,但使用 std 库函数时却不行。我猜它是对名称中的“::”做的。如果是这种情况,是否还有一种方法可以调用该函数(例如以某种方式转义名称)?
    • 您是否尝试在有调试信息的应用程序中执行此操作?如果是后者,这是行不通的。 lldb 目前不知道如何将 C++ 错位名称转换为生成它们的完整语言结构,这是运行其表达式解析器所需要做的(这只是 clang 的内置版本......)如果你当您确实有调试信息时看到此失败,请发布您看到此失败的代码和调试会话的示例。
    • 这没有调试信息,所以我想我不走运然后尝试该方法。谢谢
    猜你喜欢
    • 2014-02-01
    • 2012-06-12
    • 1970-01-01
    • 2013-12-24
    • 2013-10-28
    • 2013-02-23
    • 2019-10-19
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多