Ответ 1
В двоичном формате существует какая-то полезная информация, потому что GDB может показывать более полезные имена для лямбда-функций, например.
(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()>
Используя API-интерфейс GDB Python, я могу получить еще одно имя для того же закрытия, например
(gdb) python import gdb; print gdb.block_for_pc(0x8048591).function.name
__lambda0::operator()() const
Итак, по крайней мере три разных имени! Поэтому я думаю, что это может быть ограничение backtrace_symbols_fd
, что он не может найти имена для лямбда-функций.