Может ли GDB отлаживать лямбда?
Я использую функции С++ 11 activelly. У меня есть программа, созданная в Visual Studio 2013, которая полагается на lambdas для запуска нескольких потоков (лямбда представляет задачу, а поток получает экземпляр лямбды, который он должен выполнить). Lambda определен в статической библиотеке и связан в исполняемом файле, который вызывает его из потока, созданного этим исполняемым файлом.
Когда я пытаюсь отлаживать версию Linux этого приложения с помощью GDB, похоже, что GDB не может войти в метод, содержащий лямбда. Он не может установить точки останова в этой функции, и когда я пытаюсь вмешаться, он даже делает шаги в методах, которые лямбда вызовы из его тела, но после return
из этих методов он не переходит в тело лямбды, он переходит к следующему метод, который лямбда-звонки и т.д.
Есть ли способ отладить тело lambdas с помощью GDB?
Ответы
Ответ 1
Я видел их раньше в стеке, поэтому, по крайней мере, знаю о них. Я никогда не пытался установить нормальную точку останова в одном. Это своего рода хак, но вы можете установить точку останова в одном (или в любом месте), используя asm volatile("int $3");
на x86 (-64).
Вот пример программы:
int main(){
auto f = [](){
asm volatile("int $3");
};
f();
return 0;
}
Здесь он возвращается, когда он достигает точки останова:
#0 0x0000000000400577 in main::{lambda()#1}::operator()() const ()
#1 0x000000000040058d in main ()
Ответ 2
Из моего опыта, gdb не может войти в лямбды - он просто проскакивает через них. Не только это, вхождение в определение лямбда, похоже, путает gdb, и оно переходит к концу текущей функции. Тем не менее, вы можете разместить точку останова внутри лямбда, и если вы ударите эту точку, вы остановитесь. Это, безусловно, далеко не идеально.