2014-02-14 175 views
15

我主动使用C++ 11的功能。我有在Visual Studio 2013中创建的程序,它依靠lambdas运行多个线程(lambda表示任务,线程接收它必须运行的lambda实例)。 Lambda在静态库中定义,并在可执行文件中链接,该文件从此可执行文件创建的线程调用它。 当我尝试用GDB调试此应用程序的Linux版本时,它看起来像GDB不能进入包含lambda的方法。它不能在这个函数中设置断点,当我尝试进入时,它甚至会在lambda调用它的正文的方法中进行,但是在这些方法的return之后它不会去到lambda体,它会转到下一个方法lambda调用等。 有什么方法可以用GDB调试lambda身体?GDB可以调试lambda吗?

+1

你是什么意思的“方法”,在这里?这个术语在C++中没有很好的定义。 –

+0

我说的是''method'时的非静态对象成员函数。 – Vitaliy

+0

谢谢澄清。 –

回答

4

我以前在堆栈跟踪中看过它们,所以它至少知道它们。我从来没有尝试过在一个中设置正常断点。这是一种破解,但是你可以在x86(-64)上使用asm volatile("int $3");来在一个(或任何地方)设置断点。

下面是一个例子程序:

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不能踏进lambda表达式 - 它只是跳过他们。不仅如此,进入lambda定义似乎混淆了gdb,并且它继续到当前函数的末尾。但是,你可以在lambda表达式中明确地放置一个断点,并且如果你达到那个点,你就会停下来。这显然很不理想。