【问题标题】:How do you inspect an rvalue (temporary object) in lldb?您如何检查 lldb 中的右值(临时对象)?
【发布时间】:2015-08-12 01:18:12
【问题描述】:

当你设置断点时,例如b mainlldb 中,很容易看到当前帧中的变量:

(lldb) frame variables

但是如何检查临时对象?说我有这些功能

std::string func2() {...}
void func(const std::string& a) {...}

我打电话给喜欢

func(func2());

如何查看func2()创建的临时变量?是否可以?上面的命令似乎只显示命名变量。

【问题讨论】:

    标签: debugging lldb temporary rvalue


    【解决方案1】:

    如果您进入 func2 - 然后使用“完成”命令再次退出,lldb 将显示您退出的函数的返回值。例如:

    (lldb) br s -n func2
    Breakpoint 2: where = step-into`func2() + 18 at step-into.cpp:12, address = 0x0000000100000d62
    (lldb) c
    Process 29307 resuming
    Process 29307 stopped
    * thread #1: tid = 0x300436, function: func2() , stop reason = breakpoint 2.1
        frame #0: 0x0000000100000d62 step-into`func2() at step-into.cpp:12
       9    std::string
       10   func2()
       11   {
    -> 12     return std::string("some string");
       13   }
       14   
       15   int
    

    好的,现在你在函数中停止了,所以当你finish out 时,lldb 会收集返回值并显示在线程打印中:

    (lldb) fin
    Process 29307 stopped
    

    进程 29333 已停止 *线程#1:tid = 0x300e94, 0x0000000100000def step-into`main + 31 at step-into.cpp:18, queue = 'com.apple.main-thread', stop reason = step out 返回值: (std::__1::basic_string, std::__1::allocator >) $0 = "some string"

        frame #0: 0x0000000100000def step-into`main at step-into.cpp:18
       15   int
       16   main ()
       17   {
    -> 18     func(func2());
       19     return 0;
       20   }
    

    或者如果您有一个没有返回值的自定义“线程格式”,您可以通过 SB API 获得它:

    (lldb) script print lldb.thread.GetStopReturnValue()
    (std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) $0 = "some string"
    

    如果您使用的是 Xcode,它还会在本地视图顶部添加一个项目,显示您刚刚退出的函数的返回值。

    【讨论】:

    • 当我有空的时候,我会让 lldb 收集所有从任意复杂的行上得到的返回值,并自动显示它们。集合部分并不难,但要弄清楚如何以一种对具有多个函数调用和/或多层嵌套的行有意义的方式显示它们将需要更多的工作......
    • 非常感谢。做了fin之后有什么办法可以查看$0的实际地址吗?我想检查临时地址,然后验证是否发生了 RVO,并且在从func2() 返回时没有制作副本。我怀疑它没有,但我只是想“亲眼看看”:)
    • 我想不到。为返回而创建的“$”变量是返回值的副本(本地复制到 lldb 中)并且不记得它来自哪里。如果您想知道这一点,则必须深入研究 ABI 文档以找出返回值的放置位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2012-12-05
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多