Предположим, у вас есть какой-то код, который помещается в очередь, например так:
template <typename T>
void submitJobToPool(T callable)
{
someJobQueue.push(callable)
}
... и позже:
template <typename T>
void runJobFromPool(T callable)
{
auto job = someJobQueue.pop();
job();
}
Теперь представьте, что код вылетает из-за некоторой ошибки внутри вызова job()
. Если отправленное задание было нормальной функцией, стек вызовов может выглядеть примерно так:
void myFunction() 0x345678901
void runJobFromPool() 0x234567890
int main(int, char**) 0x123456789
Легко увидеть, какая функция здесь потерпела крах. Если это функтор, он будет похожим, но где-то там будет operator()
(игнорируя вставку). Впрочем, для лямбды ...
void lambda_a7009ccf8810b62b59083b4c1779e569() 0x345678901
void runJobFromPool() 0x234567890
int main(int, char**) 0x123456789
Это не так легко отладить. Если к этому подключен отладчик или доступен дамп ядра, то эту информацию можно использовать для определения того, какая лямбда-ошибка произошла, но эта информация не всегда доступна. Насколько я знаю, разборка - это один из немногих способов определить, что из этого получилось.
Идеи, которые я должен был сделать это лучше:
- Использование такого инструмента, как
addr2line
, если платформа поддерживает его. Это иногда работает, иногда нет.
- Завершение всех лямбд в функторах (по меньшей мере, не идеально).
- Не использовать лямбды (опять же, не идеально).
- Использование расширения компилятора для придания лямбде более значимого имени / добавления отладочной информации.
4-й вариант звучал многообещающе, поэтому я провел небольшое расследование, но ничего не смог найти. В случае, если это имеет значение, доступны следующие компиляторы: clang ++ 5.0 и MSVC 19 (Visual Studio 2015).
У меня вопрос, какие еще инструменты / методы доступны, которые могут помочь сопоставить стек вызовов с лямбда-функцией в нем с соответствующей строкой источника?