繁体   English   中英

GDB可以调试C ++ lambdas吗?

[英]Can GDB debug C++ lambdas?

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

我以前在堆栈跟踪中看过它们,所以它至少知道它们。 我从未试过在一个中设置一个普通的断点。 这是一种破解,但你可以通过使用asm volatile("int $3");在一个(或任何地方)设置一个断点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 ()

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

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

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

走进这一步。 它会引导你到lambda身体代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM