2012-02-10 14 views

Odpowiedz

12

Według tego postu < http://codingrelic.geekhold.com/2009/05/pre-mortem-backtracing.html>,

Również na niektórych architekturach, w tym mojego ukochanego MIPS, tylko __builtin_return_address(0) prac. MIPS nie ma wskaźnika ramki, co utrudnia powrót z powrotem do stosu. Ramka 0 może bezpośrednio korzystać z rejestru adresu zwrotnego. Jeśli ARM również nie ma wskaźnika ramki, wyjaśniałoby to ograniczenie.

Zobacz także http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html.

+6

W ARM adres zwrotny jest przekazywany do rejestru 'R14', a zadaniem wywoływacza jest zapisanie go podczas wywoływania innej funkcji. Więc nawet przy wskaźniku ramek nie ma gwarancji, że adres powrotu jest kiedykolwiek przechowywany na stosie. –

+3

Rzeczywiście, gdy adres zwrotny jest zapisany w pamięci zamiast zapisany na stosie przez instrukcję wywołania, ogólnie nie można go znaleźć. Powinien istnieć sposób użycia danych rozwijania/debugowania dwarf2, ale wymagałoby to, aby '__builtin_return_address' był wołaniem o dużej wadze odwijać wywołanie biblioteki, a nie banalnym wbudowanym ... –

+1

BTW, rozwiązałem problem śledzenia stosu na ARM przez za pomocą [-finstrument-functions] (http://gcc.activeventure.org/Code-Gen-Options.html), które są wywoływane przy każdym wejściu/wyjściu funkcji. Oczywiście jest narzut, ale jest to dla mnie do przyjęcia. (I jest atrybut 'no_instrument_function', w którym wymagana jest maksymalna szybkość połączenia ...) –

4

Backtrace na ARM jest trudny w wykonaniu. Funkcja Glibc backtrace działa teraz, ale potrzebujesz aktualnego kompilatora/glibc i musisz zbudować wszystko za pomocą -funwind-tables. GDB również ma problemy bez informacji o debugowaniu.

+0

Dzięki za wzmiankę o tabelach -wstrzałach! Moje ślady po śladach na ARM miały zawsze głębokość 1, dopóki nie włączyłem tej flagi kompilatora. Korzystanie z GCC 4.3.2. – jfritz42

Powiązane problemy