Korrelieren der strace-Ausgabe mit Quellcodefunktionsaufrufen

1182
joe

Ich versuche, ein Tastaturproblem in einer Linux-Anwendung zu beheben, für das ich den Quellcode habe. Die Anwendung startet einen TCP-Server und sendet lokale Tastatur- und Mausereignisse an verbundene Clients. Was ist der beste Weg, den laufenden Serverprozess abzufragen, um herauszufinden, welche Quellcodefunktionen die Tastatureingaben abfangen? Funktioniert das straceDienstprogramm auf irgendeine Weise? Wenn Sie das -cFlag mit straceshow Systemaufrufen verwenden, die die Anwendung durchführt, aber nicht sicher sind, wie Sie dieses auf die Quelldatei-Funktionen zurückverfolgen können.

0

1 Antwort auf die Frage

1
Jonathan Ben-Avraham

Das straceDienstprogramm zeigt Ihnen Systemaufrufe. Die meisten unter Linux kompilierten Programme sind mit der Standard-C-Bibliothek verknüpft, die als "glibc" bezeichnet wird, obwohl der tatsächliche Bibliotheksdateiname mit bestimmten Codezeilen in einer Quelldatei ausgegeben wird.libc.so.6 . C-Systemaufrufe wie "open", "read", "write" sind tatsächlich Wrapper-Funktionen für die eigentlichen Systemaufrufe, die die glibc-Bibliothek ausführt. Manchmal enthalten die Wrapper eine überraschende Menge Code, über den Sie normalerweise nicht nachdenken. Manchmal verwenden Programmierer Bibliotheken mit Funktionen, die mehrere Glibc-Aufrufe ausführen und mehrere Systemaufrufe ausführen. Wenn Sie außerdem ein bestimmtes "Lesen" in der straceAusgabe sehen, haben Sie keine Möglichkeit, sie mit einem bestimmten "Lesen" oder einem anderen Bibliotheksfunktionsaufruf im Quellcode zu verbinden.strace

Ich gehe davon aus, dass, wenn Sie angeben, dass Sie über den Quellcode verfügen, Sie meinen, dass Sie ihn auch in ein funktionierendes ausführbares Programm kompilieren können. Wenn dies tatsächlich der Fall ist, ist es am besten, den Code mit printfs zu instrumentieren fflush(stdout)und dann das Programm unter auszuführen strace. Für die printfs können Sie so etwas versuchen

printf(__FILE__ ", %s:%d Entered\n", __FUNCTION__, __LINE__), fflush(stdout); 

am Anfang jeder C-Funktion. Sie können die obige Zeile als Präprozessor-Makro definieren, das bedingt als obiges oder als nichts definiert ist, abhängig von einem anderen Makro wie z. B. DEBUG, damit Sie diese Makros in Ihrer Codebasis belassen und den Code mit oder ohne DEBUGdefiniert kompilieren können .

Sie sehen die printf"write" -Systemaufrufe und ihre Ausgabe zwischen den Systemaufrufen, die die Tastenanschläge lesen. Auf diese Weise können Sie die Quelltextfunktionen, die den Eingang tty lesen, auf Null setzen. Es kann einige beharrliche Anstrengungen erfordern.