Anderer Offset in libc's backtrace_symbols () und libunwinds unw_get_proc_name ()

8

Ich mache irgendwann in meinem Programm einen Stack-Trace. Einmal mit der Funktion backtrace_symbols() von libc und einmal mit unw_get_proc_name() von libunwind .

backtrace_symbols () Ausgabe:

%Vor%

unw_get_proc_name () Ausgabe:

%Vor%

Hier sehen Sie, dass die Adresse des Befehlszeigers (0x7f6b47ce9004) gleich und korrekt ist. Die Funktion offset 0x97004 von backtrace_symbols () ist ebenfalls korrekt, aber nicht diejenige, die ich von unw_get_proc_name () ( 0x458e4 ) erhält.

Hat jemand eine Ahnung, was hier vor sich geht und was diesen Unterschied in Offsets verursachen könnte?

Beide Methoden verwenden einen ähnlichen Code wie die folgenden Beispiele:

backtrace ():

%Vor%

libunwind:

%Vor%     
tur1ng 07.01.2015, 09:47
quelle

1 Antwort

1

Ich denke unw_get_proc_name berechnet Offset von einem unbenannten internen Frame.

Zum Beispiel:

%Vor%

Beachten Sie, dass es eine variable Deklaration innerhalb des Schleifenblocks gibt. In diesem Fall (und abhängig von der Optimierungsebene) kann der Compiler einen Rahmen (und zugehörige Abwicklungsinformationen) für die Schleife erstellen. Folglich berechnet unw_get_proc_name den Offset von dieser Schleife anstelle des Funktionsbeginns.

Dies wird in unw_get_proc_name man-Seite erklärt:

  

Beachten Sie, dass auf einigen Plattformen keine zuverlässige Unterscheidung möglich ist   zwischen Prozedurnamen und gewöhnlichen Labels. Außerdem, wenn Symbol   Informationen wurden aus einem Programm entfernt, Prozedurnamen können sein   vollständig nicht verfügbar oder möglicherweise auf diejenigen beschränkt, die über a   dynamische Symboltabelle. In solchen Fällen kann unw_get_proc_name () zurückgeben   der Name eines Etiketts oder eine vorhergehende (in der Nähe liegende) Prozedur.

Sie können versuchen, erneut zu testen, aber ohne Ihre Binärdatei zu entfernen (Da unw_get_proc_name den Namen der Funktion nicht finden kann, denke ich, dass Ihre Binärdatei entfernt wurde).

    
Jezz 22.01.2015 12:22
quelle