如何在回溯上显示lambda函数?

时间:2015-04-10 10:06:17

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

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

我在Linux上使用GCC 4.8

2 个答案:

答案 0 :(得分:2)

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

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

(虽然调试信息可能只是说它是一个闭包类型,因为GDB显示所有这些函数<lambda()>::operator()

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

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

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

使用GCC,您还可以通过打印预定义变量operator()打印出关闭__PRETTY_FUNCTION__的名称,其中显示的内容类似于main()::<lambda()>

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

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

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

答案 1 :(得分:0)

根据C ++标准:

§5.1.2/ 3声明:

  

lambda表达式的类型(也是表达式的类型)   closure object)是一个唯一的,未命名的非联合类类型。

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