#include <iostream>
void do_something(void) {
std::cout << "blah blah" << std::endl;
auto lambda_func = [](void){
std::cout << "in lambda" << std::endl;
return;
};
lambda_func();
std::cout << "..." << std::endl;
return;
}
int main(int argc, char **argv) {
do_something();
return 0;
}
В этой примерной программе, если вы скомпилируете (g++ gdb-call-lambda.cpp --std=c++11 -g
), а затем запустите ее в gdb (gdb ./a.out
), вы можете вызвать GDB любую "обычную" функцию. Пример:
(gdb) break main
Breakpoint 1 at 0x4008e7: file gdb-call-lambda.cpp, line 20.
(gdb) r
Starting program: /home/keithb/dev/mytest/gdb-call-lambda/a.out
Breakpoint 1, main (argc=1, argv=0x7fffffffdfb8) at gdb-call-lambda.cpp:20
20 do_something();
(gdb) call do_something()
blah blah
in lambda
...
Однако, если вы затем попытаетесь вызвать лямбда:
(gdb) break do_something
Breakpoint 2 at 0x400891: file gdb-call-lambda.cpp, line 5.
(gdb) c
Continuing.
Breakpoint 2, do_something () at gdb-call-lambda.cpp:5
5 std::cout << "blah blah" << std::endl;
(gdb) n
blah blah
12 lambda_func();
(gdb) n
in lambda
14 std::cout << "..." << std::endl;
(gdb) call lambda_func()
Invalid data type for function to be called
GDB любопытных волнует. Итак, мой вопрос: как вы называете лямбда в GDB? Просить GDB, что он ожидает, ничего не представляет интереса по сравнению с обычной функцией:
(gdb) whatis lambda_func
type = __lambda0
(gdb) whatis do_something
type = void (void)
Я пошел посмотреть, есть ли у lambda_func какие-либо специальные члены, например, указатель на функцию, похожий на std:: function и/или std:: bind:
(gdb) print lambda_func
$1 = {<No data fields>}
Нет специальных участников? Возможно, это просто прославленный указатель функции?
(gdb) call ((void (void)) lambda_func)()
Program received signal SIGSEGV, Segmentation fault.
0x00007fffffffdeaf in ?? ()
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on".
Evaluation of the expression containing the function
(at 0x0x7fffffffdeaf) will be abandoned.
When the function is done executing, GDB will silently stop.
Таким образом, я даже не уверен на 100%, какой порядок передавать какие-либо аргументы или особенно захваченные типы.
Я пробовал дополнительно call lambda_func.operator()()
, call lambda_func::operator()
, call lambda_func::operator()()
, call __lambda0
, call __lambda0()
, call __lambda0::operator()
, call __lambda0::operator()()
, все безрезультатно.
Поиск в google показывает, что нужно установить точки останова в lambdas, но ничего не сказать о том, как вызывать эти lambdas из отладчика.
Для чего это стоит, это на Ubuntu 14.04 64-бит, используя g++ 4.8.2-19ubuntu1 и gdb 7.7-0ubuntu3.1