我正在编写C++11
软件,我正在使用lambdas。当我使用backtrace_symbols_fd
打印回溯时,除了lambda之外,所有函数都被解除。这有点显而易见,因为它们是匿名函数,但是有一种方法可以获得更多的洞察力而不是原始指针吗?
我在Linux上使用GCC 4.8
答案 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只是匿名类的实例。