【问题标题】:How can I show lambda functions on backtraces?如何在回溯中显示 lambda 函数?
【发布时间】:2015-06-16 00:14:21
【问题描述】:

我正在编写一个C++11 软件并且我正在使用 lambdas。当我用backtrace_symbols_fd 打印回溯时,除了 lambda 之外,所有函数都被解构。这有点明显,因为它们是匿名函数,但是有一种方法可以获得更多的洞察力而不是原始指针?

我在 Linux 上使用 GCC 4.8

【问题讨论】:

  • 提及您希望在哪个上下文(调试器?工具链?)中看到此内容可能很有用。
  • 是的,您使用的是什么编译器和调试器?
  • @MSalters 完成,谢谢

标签: c++ c++11 gcc lambda backtrace


【解决方案1】:

二进制文件中确实存在某种有用的信息,因为 GDB 能够为 lambda 函数显示更多有用的名称,例如

(gdb) bt
#0  <lambda()>::operator()(void) const (__closure=0x7fffffffd5ef) at ll.cc:3
#1  0x00000000004005e7 in main () at ll.cc:3

(虽然调试信息可能只是说它是一个闭包类型,因为 GDB 将所有此类函数显示为 &lt;lambda()&gt;::operator()

使用闭包类型实例化的模板的错位名称包括唯一名称,例如

#3  0x0000000000400712 in func<main()::<lambda()> >(<lambda()>) (t=...) at l.cc:4

但也许该名称仅在其他错误名称中需要时使用。

使用 GCC,您还可以通过打印预定义变量 __PRETTY_FUNCTION__ 来打印闭包的名称 operator(),它显示类似于 main()::&lt;lambda()&gt; 的内容

使用 GDB 的 Python API,我可以为同一个闭包获得另一个名称,例如

(gdb) python import gdb; print gdb.block_for_pc(0x8048591).function.name
__lambda0::operator()() const

所以这至少是三个不同的名字!所以我认为这可能是backtrace_symbols_fd 的一个限制,它无法找到 lambda 函数的名称。

【讨论】:

    【解决方案2】:

    根据 C++ 标准:

    §5.1.2/3 规定:

    lambda 表达式的类型(也是 闭包对象)是唯一的、未命名的非联合类类型。

    我认为没有办法获得更多有用的信息。基本上,lambda 只是匿名类的实例。

    【讨论】:

    • 他们仍然需要某种名称,用于链接和名称修饰目的,即使用户无法说出该名称。例如如果你用闭包类型实例化一个模板,编译器需要在模板专业化的错位名称中对闭包类型进行编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多