#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
(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) whatis lambda_func
type = __lambda0
(gdb) whatis do_something
type = void (void)
मैं अगर lambda_func किसी विशेष के सदस्यों, जैसे एक समारोह सूचक, कॉल std के सदृश करने के लिए :: समारोह और/या देखने के लिए चला गया 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 पर एक खोज लैम्बडास में ब्रेकपॉइंट्स सेट करने के बारे में चीजों को प्रकट करती है, लेकिन डीबगर से उन लैम्बडा को कॉल करने के तरीके पर कुछ भी नहीं बताती है।
क्या इसके लायक है के लिए, यह Ubuntu 14.04 पर है 64-बिट जी का उपयोग कर ++ 4.8.2-19ubuntu1 और gdb 7.7-0ubuntu3.1
'lambda_func.operator()' काम को कॉल कर रहा है? – John
यह नहीं है। मैंने अतिरिक्त रूप से 'lambda_func.operator()() ',' lambda_func :: ऑपरेटर() ',' lambda_func :: ऑपरेटर()() ',' कॉल __lambda0', 'कॉल __lambda0()' कॉल करें, कॉल करें ' __lambda0 :: ऑपरेटर() ', 'कॉल __lambda0 :: ऑपरेटर()()', सभी को कोई फायदा नहीं हुआ। – inetknght
lldb एक अलग त्रुटि संदेश देता है: 'त्रुटि: किसी फ़ंक्शन पर कॉल करें' $ _0 :: ऑपरेटर()() const '(' _ZNK3 $ _0clEv ') जो लक्ष्य त्रुटि में मौजूद नहीं है: चेतावनी: फ़ंक्शन' <अज्ञात कक्षा> :: ऑपरेटर() 'में आंतरिक संबंध है लेकिन त्रुटि परिभाषित नहीं है: अभिव्यक्ति को लक्ष्य में चलाने के लिए तैयार नहीं किया जा सका' – tclamb