2014-02-14 2 views
15

Я использую функции C++ 11 activelly. У меня есть программа, созданная в Visual Studio 2013, которая полагается на lambdas для запуска нескольких потоков (лямбда представляет задачу, а поток получает экземпляр лямбды, который он должен выполнить). Lambda определен в статической библиотеке и связан в исполняемом файле, который вызывает его из потока, созданного этим исполняемым файлом. Когда я пытаюсь отлаживать версию Linux этого приложения с помощью GDB, похоже, что GDB не может войти в метод, содержащий лямбда. Он не может установить точки останова в этой функции, и когда я пытаюсь вмешаться, он даже делает шаги в методах, которые лямбда вызовы из его тела, но после return из этих методов он не переходит в тело лямбды, он переходит к следующему методу, который лямбда-звонки и т. д. Есть ли способ отладить тело lambdas с помощью GDB?Может ли GDB отлаживать лямбда?

+1

Что вы подразумеваете под «методом», здесь? Этот термин не определен в C++. –

+0

Я имею в виду функцию нестатического объекта-члена, когда говорят 'метод'. – Vitaliy

+0

Спасибо за разъяснение. –

ответ

4

Я видел их в следах стека раньше, поэтому он, по крайней мере, знает о них. Я никогда не пытался установить нормальную точку останова в одном. Это своего рода хак, но вы можете установить точку останова в одном (или в любом месте), используя 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() 
1

Из моего опыта, GDB не может уйти в лямбды - он просто пропускает их. Не только это, вхождение в определение лямбда, похоже, путает gdb, и оно переходит к концу текущей функции. Тем не менее, вы можете разместить точку останова внутри лямбда, и если вы ударите эту точку, вы остановитесь. Это явно далеко от идеала.

Смежные вопросы