2017-07-15 8 views
1

Ich benutze gdbserver um einen entfernten Prozess zu debuggen. Ich bin in der Lage, gdbserver an den Prozess nach dem Start anhängen und wartet auf die Eingabe.Wie kann ich gdbserver beim Start an einen Prozess anhängen?

Ich möchte jedoch gdbserver an den Prozess anfügen, während es gestartet wird. Der Prozess wird über ein Shell-Skript gestartet und ich kann nicht ändern, wie dieser Prozess gestartet wird. Ich kann das Shell-Skript nicht ändern, um den Prozess über einen Aufruf von gdbserver zu starten.

Wie füge ich gdbserver an diesen Prozess an, sobald er gestartet wird?

Edit: Ich kann eine Warteschleife am Anfang von main() erstellen. Zum Beispiel, die eine Schleife wartet, bis es eine Datei an einer vorbestimmten Stelle findet:

#include <unistd.h> 
int main() { 

    while(access("/home/username/CONTINUE", F_OK) == -1) 
     sleep(1); 

    /* 
      ...all the rest of main() 
    */ 

    return 0; 
} 

Wir legen gdbserver können, während der Prozess mit dieser Schleife besetzt ist, Haltepunkte zu setzen je nach Bedarf und sagen touch /home/username/CONTINUE die Schleife zu verlassen. Dies erfordert jedoch, dass wir auf den Quellcode zugreifen, die Binärdatei kompilieren und auf dem Zielcomputer platzieren können. Ich suche einen besseren, einfacheren Weg als diesen.

+0

Ich glaube, du denkst _zu kompliziert_ :-D. Schau dir meine Antwort an. – user0042

+0

Können Sie Systemtap auf dem Remote-System ausführen? Wenn dies der Fall ist, können Sie Tom Tromeys [preattach] (https://github.com/tromey/gdb-helpers/blob/master/gdbhelpers/preattach.stp) ausführen, um den neuen Prozess zu stoppen, sobald er gestartet wird Sie müssen jeden Quellcode ändern. –

Antwort

2

Dies erfordert aber wir in der Lage sein, den Quellcode , kompilieren die binäre zuzugreifen und sie auf der Zielmaschine zu platzieren. Ich suche einen besseren, einfacheren Weg als diesen.

Es sieht aus wie Sie arbeiten auf einem Linux/Unix wie Remote-Betriebssystem.

Wenn Sie Admin-Zugriff auf das Remote-System haben, ist die einfachste Möglichkeit, die originale ausführbare Datei umzubenennen und ersetzen Sie diese mit einem Shell-Skript wie die ursprüngliche ausführbare Datei, die jetzt umbenannt unter Kontrolle von gdbserver beginnt .

So etwas wie (angenommen ausführbare /usr/bin/foo) an der Zielmaschine:

root:# cd /usr/bin 
root:# mv foo foo_ 
root:# echo "#!/bin/sh\ngdbserver /dev/com1 foo_ foo.txt" > foo 
root:# chmod a+x foo 

Wie heißt es in der gdbserverman(1) page:

Diese foo_ mit einem Argument gdbserver zu debuggen erzählt von foo.txt und zur Kommunikation mit GDB über /dev/com1. gdbserverwartet jetzt geduldig für den Host GDB, damit zu kommunizieren.


Eine andere Möglichkeit, die ich denken konnte den ursprünglichen Prozess überhaupt ohne Änderung könnte ein kleines Programm, dass Änderungen in der /dev/proc Verzeichnis (n) überwacht und misst gdbserver bei einem solchen Fall mit dem zugehörigen pid.
Obwohl es Glück ist, wenn gdbserver angefügt ist, bevor dieser Prozess bereits zu main() geplant.


Sie sollten Zugang zum Quellcode sowieso für einen vernünftigen Debuggen mit gdb. Obwohl es Fälle gibt, in denen Sie auch nur mit dem (De-) Assembler-Code kommen können.

Verwandte Themen