GDB可以调试C ++ lambdas吗?

时间:2014-02-14 10:09:02

标签: c++ c++11 lambda gdb

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

3 个答案:

答案 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 :(得分:1)

根据我的经验,gdb无法进入lambda - 它只是跳过它们。不仅如此,单步执行lambda定义似乎会混淆gdb,并且它会继续到当前函数的末尾。但是,您可以在lambda中明确放置断点,如果点击该点,则会停止。这显然远非理想。

答案 2 :(得分:0)

进入Lamba的.run()的下一步/步骤(跳跃初始化),直到以下调用:

std::forward<>(args)(...)

进入这一步。它将带您到lambda身体代码。