2015-04-10 14 views
11

Sto scrivendo un software C++11 e sto usando lambda. Quando stampo il backtrace con backtrace_symbols_fd tutte le funzioni sono disattivate tranne lambda. È un po 'ovvio perché sono funzioni anonime, ma c'è un modo per ottenere più informazioni invece di un puntatore crudo?Come posso mostrare le funzioni lambda sui backtrace?

sto usando GCC 4.8 su Linux

+2

Probabilmente è utile menzionare in quale contesto (debugger? Toolchain?) Vuoi vedere questo. – MSalters

+0

Sì, che compilatore e debugger stai usando? – LThode

+0

@MSalters fatto, grazie –

risposta

0

Secondo l'++ standard C:

§5.1.2/3 stati:

Il tipo di lambda-espressione (che è anche il tipo dell'oggetto di chiusura ) è un tipo di classe non unione univoco, senza nome.

Non credo che ci sia un modo per ottenere più informazioni utili. Fondamentalmente, i lambda sono solo esempi di classi anonime.

+0

Hanno ancora bisogno di un qualche tipo di nome, per il collegamento e il nome di mangling, anche se il nome non può essere pronunciato dagli utenti. per esempio. se istanziate un modello con un tipo di chiusura, il compilatore deve codificare il tipo di chiusura nel nome mutilato della specializzazione del modello. –

2

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.