Получить номер строки для лямбды с использованием GDB

У нас есть обратная трассировка для segfault, которая цитирует имя, созданное компилятором для лямбда:

(gdb) bt
#0 std::_Function_handler<std::function<bool()>(), bold::AdHocOptionTreeBuilder::buildTree(bold::Agent*)::__lambda59>::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/4.8/functional:2057
#1 0x08146d2c in operator() (this=<optimized out="">) at /usr/include/c++/4.8/functional:2464
...
</optimized></std::function<bool()>

Назначенное имя bold::AdHocOptionTreeBuilder::buildTree(bold::Agent*)::__lambda59. Однако, как вы можете сказать, у этого файла много лямбда! Есть ли способ сопоставить это сгенерированное имя функции с номером строки в исходном коде? У нас есть номера строк для других функций, но здесь он цитируется только как параметр типа для std::_Function_handler<>.

1 ответ

Вариант компоновщика -Map mapfile должен предоставить вам информацию, показывающую, откуда возникла каждая функция, включая лямбда. nm --line-numbers тоже может работать, если программа была скомпилирована с отладочной информацией -g.

Кроме того, я думаю, вы можете использовать set print symbol-filename on в GDB, а затем оценить &bold::AdHocOptionTreeBuilder::buildTree(bold::Agent*)::__lambda59

licensed under cc by-sa 3.0 with attribution.