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