2015-04-10 18 views
11

Piszę oprogramowanie C++11 i używam lambdas. Po wydrukowaniu śledzenia wstecznego za pomocą backtrace_symbols_fd wszystkie funkcje są odwzorowywane z wyjątkiem lambda. Jest to trochę oczywiste, ponieważ są to funkcje anonimowe, ale istnieje sposób na uzyskanie lepszego wglądu zamiast surowego wskaźnika?Jak mogę wyświetlać funkcje lambda na śladach wstecz?

Używam GCC 4.8 na Linuksie

+2

Prawdopodobnie warto wspomnieć, w jakim kontekście (debugger? Toolchain?), Który chcesz zobaczyć. – MSalters

+0

Tak, jakiego kompilatora i debuggera używasz? – LThode

+0

@MSalters done, thanks –

Odpowiedz

0

Według C++ Standard:

§5.1.2/3 stany:

Rodzaj lambda wyrażenia (co jest również typ obiektu zamknięcia ) jest unikalnym, nienazwanym nie-związkowym typem klasy.

Nie sądzę, że istnieje sposób na uzyskanie bardziej przydatnych informacji. Zasadniczo lambda jest po prostu instancją anonimowych klas.

+0

Nadal potrzebują pewnego rodzaju nazwy, do celów łączenia i mangowania nazw, nawet jeśli nie można wymawiać tych nazw przez użytkowników. na przykład jeśli tworzysz szablon z typem zamknięcia, kompilator musi zakodować typ zamknięcia w sfałszowanej nazwie specjalizacji szablonu. –

2

Pewne przydatne informacje istnieją w pliku binarnym, ponieważ GDB może pokazywać więcej przydatnych nazw dla funkcji lambda, np.

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

(chociaż może info debugowania po prostu mówi, że to rodzaj zamknięcia, jak GDB pokazuje wszystkie takie funkcje jak <lambda()>::operator())

zniekształcone nazwisko szablon tworzony z rodzaju zamknięcie zawiera unikalną nazwę np

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

, ale może ta nazwa jest używana tylko wtedy, gdy jest potrzebna w innych zniekształconych nazwach.

z GCC można również wydrukować imię zamknięcie na operator() drukując wstępnie zdefiniowana zmienna __PRETTY_FUNCTION__, która pokazuje coś takiego main()::<lambda()>

Korzystanie GDB jest Python API mogę dostać kolejną nazwę dla tego samego zamknięcia, na przykład

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

To co najmniej trzy różne imiona! Myślę więc, że to może być ograniczenie backtrace_symbols_fd, że nie może znaleźć nazw dla funkcji lambda.