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

GDB能否调试C++;兰博达斯? < >我积极使用C++ 11的特性。我在Visual Studio 2013中创建了一个程序,该程序依赖于lambdas来运行多个线程(lambda表示任务,线程接收它必须运行的lambda实例)。Lambda在静态库中定义,并在可执行文件中链接,该可执行文件从该可执行文件创建的线程调用Lambda。 当我尝试用GDB调试这个应用程序的Linux版本时,看起来GDB无法进入包含lambda的方法。它不能在这个函数中设置断点,当我尝试进入时,它甚至会进入lambda从其主体调用的方法,但在返回这些方法后,它不会进入lambda主体,而是进入lambda调用的下一个方法,等等。 有没有办法用GDB调试lambdas body?,c++,c++11,lambda,gdb,C++,C++11,Lambda,Gdb,我以前在堆栈跟踪中见过它们,所以它至少知道它们。我从来没有尝试过在其中设置一个正常断点。这是一种黑客行为,但您可以使用asm volatile(“int$3”)在一个(或任何地方)设置断点 下面是一个示例程序: int main(){ auto f = [](){ asm volatile("int $3"); }; f(); return 0; } 以下是它到达该断点时的回溯: #0 0x0000000000400577 in main::{

我以前在堆栈跟踪中见过它们,所以它至少知道它们。我从来没有尝试过在其中设置一个正常断点。这是一种黑客行为,但您可以使用
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 ()

根据我的经验,gdb无法进入lambdas——它只是跳过了它们。不仅如此,进入lambda定义似乎会混淆gdb,它会进入当前函数的末尾。但是,您可以在lambda中显式地放置断点,如果达到该点,您将停止。这显然远远不够理想。

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

std::forward<>(args)(...)
std::转发(args)(…)

走到这一步。它将引导您找到lambda body code。

这里的“方法”是什么意思?术语在C++中不是很好的定义。我指的是非静态对象成员函数,当说“代码>方法< /代码>时,感谢您的澄清。刚刚测试过,GDB(GNU-GDB(GDB)7.1.1)可以正确地进入lambda。您使用哪个版本的GDB?您是否使用优化编译,符号剥离?我使用CentOS 6.5附带的GBD,我认为它是v7.2。我认为这是个问题,但不是lambda的问题;我在库中有文件
functions.cpp
,在应用程序中有文件
functions.cpp
。当静态库和使用此静态库构建的可执行文件的源文件具有完全相同的名称时,GDB似乎无法工作。当它必须使用库中的
functions.cpp
时,它似乎试图从可执行文件中使用
functions.cpp
。所以,问题不在lambda中。你可以使用微软Visual C++使用<代码>调试中断()/<代码>或<代码>调试Debug()/<代码>。这是我所知道的在MSVC2012的ARM上插入lambda函数的唯一方法;Microsoft编译器不支持ARM和x64处理器上的内联汇编。我从来没有这样做过,但对于x64/ARM,我认为您可以创建一个汇编程序文件,用您的项目编译该文件,该文件定义函数和自定义程序集。然后你只需要调用你的汇编函数。(你能内联这些函数调用吗?)。lambda可能是经过优化和内联的。你关掉优化了吗?(-O0)