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% 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).
Tags und Links stack-trace libc backtrace libunwind