Может ли 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, и оно переходит к концу текущей функции. Тем не менее, вы можете разместить точку останова внутри лямбда, и если вы ударите эту точку, вы остановитесь. Это, безусловно, далеко не идеально.