Entspricht "truss -T" und "truss -U" unter Linux?

12

Gibt es eine Entsprechung zu den Funktionen -Tund der -UOption des trussSolaris-Dienstprogramms unter Linux?

Diese sollen einen Systemaufruf ( -T) oder eine Bibliotheksfunktion ( -U) angeben, die beim Aufrufen durch die verfolgte Anwendung zum Anhalten führen würde.

Andernfalls möchte ich, dass jeder Prozess, der von einer verfolgten Anwendung gestartet wird, gestoppt wird (als würde er von SIGSTOP abgebrochen), sobald ein bestimmter Systemaufruf oder ein bestimmter Funktionsaufruf einer gemeinsam genutzten Bibliothek ausgeführt wird.

straceund ltraceunter Linux bieten sie einen Großteil der Funktionen von Solaris truss, aber sie scheinen dies nicht zu tun.

Zum Beispiel:

truss -f -T open cmd

Wäre so strace -f cmd, als würde der Prozess, der ausgeführt wird, cmdoder einer seiner Nachkommen einen openSystemaufruf ausführen , sofort gestoppt (und ich kann ihn später nach Belieben fortsetzen).

In einigen Fällen könnte ich gdb‚s catch syscall, aber ich war auf der Suche nach einer Lösung , die Gabeln bequem folgen kann und weiterhin für alle die gegabelten Prozesse tun und behalten sie auch nach tun execves.

Ich erinnere mich an ein Hilfsprogramm, das dieselbe Funktionalität bietet, sogar an ein (oder mehrere) Hilfsprogramm (e) für Einzelschrittanwendungen zwischen einigen Ereignissen eines solchen Systemaufrufs, aber mein Gedächtnis versagt mir, ich kann nicht einmal sicher sein das war unter Linux.

Stéphane Chazelas
quelle
1
Nicht wirklich eine Antwort auf Ihre Frage, aber gdb hat einige Optionen, um Gabeln zu folgen. Es wird jedoch immer noch immer nur ein Prozess gleichzeitig ausgeführt, was wahrscheinlich ein Deal Breaker ist, wenn Sie nach strace-ähnlicher Funktionalität suchen, aber ich dachte, ich würde es nur für den Fall erwähnen.
Bratchley
@ JoelDavis, danke. Und es scheint, dass es auch nach exec ( follow-exec-mode) folgen kann , damit experimentiere ich. Beantwortet die Frage nicht unbedingt, kann aber gut genug für das sein, was ich brauche.
Stéphane Chazelas
Wenn ich Ihre Frage verstehe, suchen Sie nach einer Möglichkeit, die Ablaufverfolgung so lange fortzusetzen, bis ein bestimmtes Signal angezeigt wird, und beenden dann die Ablaufverfolgung, ohne die von Ihnen verfolgte Anwendung anzuhalten oder zu beenden.
slm
@slm, nein, ich möchte, dass ein Prozess, der von einer verfolgten Anwendung gestartet wird, gestoppt wird (als würde er von SIGSTOP beendet), sobald er einen bestimmten Systemaufruf ausführt. Ich habe einen Link zur Solaris- trussManpage hinzugefügt .
Stéphane Chazelas
Lassen Sie mich sicherstellen, dass ich richtig verstehe. Sie möchten einen Prozess stoppen, wenn er einen bestimmten Systemaufruf ausführt. Ist das korrekt?
Sparticvs

Antworten:

3

Soweit ich weiß , ist dies mit straceder ptraceFunktion, die intern verwendet wird, SIGSTOPoder SIGINTbei Anrufen nicht möglich.

BEARBEITEN:

Ich habe diese einfache Lösung in Ministrace eingefügt , sodass keine Codierung erforderlich ist.

Meine vorgeschlagene Lösung, wenn nicht alle Funktionen von strace benötigt werden, wäre, die Ministrace zu modifizieren - die ich hier gefunden habe. Schreiben Sie sich eine Strace in 70 Codezeilen .

In einem One-Shot-Programm können Sie zwei Zeilen vor dem folgenden Code einfügen:

if (wait_for_syscall(child) != 0) break;

Pseudocode:

if(syscall == SYS_write)
    do {
        char str[4];
        gets(str);  // waits until enter to continue    
    } while(0);

Ich habe nichts davon überprüft, diese letzten Schritte bleiben Ihnen überlassen.

Daniël W. Crompton
quelle
Vielen Dank. Es funktioniert und dieser Link ist sehr nützlich. Allerdings (verständlicherweise in ein paar Codezeilen) entschlüsselt es nicht das Argument, das gdb / strace tut, also wäre es für meinen Zweck nicht nützlich gewesen. Es zeigt jedoch, dass es einfach ist. Ich habe mich am Ende für GDB entschieden, aber es sieht so aus, als wäre es relativ einfach, Strace für dieses Feature zu patchen. Lassen Sie die Frage offen, da ich vermute, dass ein entsprechender Befehl vorhanden ist. Ich schaue mir Python-Ptrace an, wenn ich Zeit habe.
Stéphane Chazelas
Bitte! Ich habe die Implementierung ein wenig erweitert, sodass es möglich wäre, den Syscall nach ID und Name zu referenzieren. Es hat wieder Spaß gemacht mit ptrace zu spielen.
Daniël W. Crompton