Alcuni tipi di informazioni utili esistono nel binario, poiché GDB è in grado di mostrare più nomi utili per funzioni lambda, ad es.
(gdb) bt
#0 <lambda()>::operator()(void) const (__closure=0x7fffffffd5ef) at ll.cc:3
#1 0x00000000004005e7 in main() at ll.cc:3
(anche se forse informazioni di debug solo dice che è un tipo di chiusura, come GDB mostra tutte le funzioni <lambda()>::operator()
)
Il nome storpiato di un modello di un'istanza con un tipo di chiusura comprende un nome univoco per esempio
#3 0x0000000000400712 in func<main()::<lambda()> >(<lambda()>) (t=...) at l.cc:4
ma forse il nome viene utilizzato solo quando è necessario in altri nomi storti.
Con GCC è anche possibile stampare il nome della chiusura del operator()
stampando il pre-definito variabile __PRETTY_FUNCTION__
, che mostra qualcosa di simile main()::<lambda()>
Usare Python API GDB posso ottenere ancora un altro nome per la stessa chiusura, per esempio
(gdb) python import gdb; print gdb.block_for_pc(0x8048591).function.name
__lambda0::operator()() const
Quindi sono almeno tre nomi diversi! Quindi penso che sia forse una limitazione di backtrace_symbols_fd
che non riesce a trovare nomi per le funzioni lambda.
fonte
2015-04-11 19:13:18
Probabilmente è utile menzionare in quale contesto (debugger? Toolchain?) Vuoi vedere questo. – MSalters
Sì, che compilatore e debugger stai usando? – LThode
@MSalters fatto, grazie –