Как я могу показать функции лямбда на backtraces?

Я пишу программное обеспечение C++11, и я использую lambdas. Когда я печатаю backtrace с помощью backtrace_symbols_fd, все функции демаркируются, за исключением лямбда. Это немного очевидно, потому что они анонимные функции, но есть способ получить больше понимания вместо необработанного указателя?

Я использую GCC 4.8 для Linux

Ответ 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, что он не может найти имена для лямбда-функций.

Ответ 2

В соответствии со стандартом С++:

В §5.1.2/3 указано:

Тип лямбда-выражения (который также является типом объект закрытия) - это уникальный, неназванный тип неединичного класса.

Я не думаю, что есть способ получить более полезную информацию. В основном, лямбды - это просто экземпляры анонимных классов.