2015-04-10 16 views
11

Ich schreibe eine C++11 Software und ich benutze Lambdas. Wenn ich das Backtrace mit backtrace_symbols_fd drucke, werden alle Funktionen außer Lambda abgefragt. Es ist ein wenig offensichtlich, weil sie anonyme Funktionen sind, aber es gibt eine Möglichkeit, mehr Einblick zu bekommen, anstatt einen rohen Zeiger zu verwenden.Wie kann ich Lambda-Funktionen auf Backtraces anzeigen?

Ich bin mit GCC 4.8 auf Linux

+2

Es ist wahrscheinlich nützlich zu erwähnen, in welchem ​​Kontext (Debugger? Toolchain?) Sie dies sehen möchten. – MSalters

+0

Ja, welchen Compiler und Debugger benutzen Sie? – LThode

+0

@MSalters erledigt, danke –

Antwort

0

Nach dem C++ Standard:

§5.1.2/3 Zustände:

Die Art des Lambda-Ausdruck (was auch der Typ des Closure-Objekts) ist ein eindeutiger unbenannter Nicht-Union-Klassentyp.

Ich glaube nicht, dass es eine Möglichkeit gibt, mehr nützliche Informationen zu erhalten. Im Grunde sind Lambdas nur Instanzen von anonymen Klassen.

+0

Sie brauchen immer noch eine Art von Namen, für die Verknüpfung und Namen Mangelnde Zwecke, auch wenn dieser Name nicht von Benutzern gesprochen werden kann. z.B. Wenn Sie eine Vorlage mit einem Closure-Typ instanziieren, muss der Compiler den Closure-Typ im entstellten Namen der Template-Spezialisierung codieren. –

2

Einige nützliche Informationen existieren in der Binärdatei, weil GDB nützlichere Namen für Lambda-Funktionen z.

(gdb) bt 
#0 <lambda()>::operator()(void) const (__closure=0x7fffffffd5ef) at ll.cc:3 
#1 0x00000000004005e7 in main() at ll.cc:3 

(obwohl vielleicht die Debug-Informationen sagt nur ein Verschlusstyp es ist, wie GDB alle Funktionen wie <lambda()>::operator() zeigt) mit einem Verschlusstyp instanziiert

Der verstümmelte Name einer Vorlage zum Beispiel einen eindeutigen Namen enthält

#3 0x0000000000400712 in func<main()::<lambda()> >(<lambda()>) (t=...) at l.cc:4 

aber vielleicht wird der Name nur verwendet, wenn es in anderen verfälschten Namen benötigt wird.

Mit GCC Sie können auch operator() API Python Verwenden von GDB die vordefinierte Variable __PRETTY_FUNCTION__, die wie main()::<lambda()> etwas zeigt aus dem Namen der Schließung des Druck

durch Drucken Ich kann noch einen anderen Namen für die gleiche Schließung erhalten, z.B

(gdb) python import gdb; print gdb.block_for_pc(0x8048591).function.name 
__lambda0::operator()() const 

Das sind also mindestens drei verschiedene Namen! Also ich denke, es ist vielleicht eine Einschränkung von backtrace_symbols_fd, dass es Namen für die Lambda-Funktionen nicht finden kann.