#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;
}
W tym przykładzie programu, jeśli kompilacji (g++ gdb-call-lambda.cpp --std=c++11 -g
), a następnie uruchomić go w gdb (gdb ./a.out
), można mieć GDB wywołać dowolną funkcję „normalną”. Przykład:Wywołanie funkcji lambda w 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
...
Jednakże, jeśli następnie spróbuj wywołać 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 trochę wpada w panikę. Tak więc moje pytanie brzmi: jak nazwać lambda w GDB? Zadawanie GDB czego oczekuje ujawnia nic interesującego w porównaniu do normalnej funkcji:
(gdb) whatis lambda_func
type = __lambda0
(gdb) whatis do_something
type = void (void)
poszedłem zobaczyć jeśli lambda_func ma żadnych specjalnych elementów, na przykład wskaźnik funkcja zadzwonić, zbliżona do std :: funkcji i/lub std :: bind:
(gdb) print lambda_func
$1 = {<No data fields>}
Brak specjalnych członków? Okej, może to tylko gloryfikowany wskaźnik funkcji?
(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.
Tak więc nie jestem nawet w 100% pewien, w jakiej kolejności przekazywać jakiekolwiek argumenty, a zwłaszcza przechwycone typy.
Próbowałem dodatkowo call lambda_func.operator()()
, call lambda_func::operator()
, call lambda_func::operator()()
, call __lambda0
, call __lambda0()
, call __lambda0::operator()
, call __lambda0::operator()()
, wszystko bezskutecznie.
Wyszukiwanie w google ujawnia rzeczy dotyczące ustawiania punktów przerwania w lambdach, ale nic, jak wywołać te lambdy z debuggera.
Na co warto, to na Ubuntu 14.04 64-bit przy użyciu g ++ 4.8.2-19ubuntu1 i gdb 7.7-0ubuntu3.1
Czy wywołanie 'lambda_func.operator()' działa? – John
Nie ma. Próbowałem dodatkowo 'call lambda_func.operator()()', 'call lambda_func :: operator()', 'call lambda_func :: operator()()', 'call __lambda0',' call __lambda0() ', wywołanie' __lambda0 :: operator() ',' call __lambda0 :: operator()() ', wszystko bez skutku. – inetknght
lldb podaje inny komunikat o błędzie: 'error: wywołanie funkcji '$ _0 :: operator()() const' ('_ZNK3 $ _0clEv'), którego nie ma w docelowym błędzie : ostrzeżenie: funkcja ' :: operator() 'ma wewnętrzne powiązanie, ale nie jest zdefiniowany błąd: Wyrażenie nie może być przygotowane do uruchomienia w celu ' –
tclamb