linux tutorial gdb wie man ein Zielprogramm vom Skript aus ausführt




use gdb debugger linux (2)

Ich möchte ein Programm mit gdb debuggen. Aber ich rufe dieses Programm über ein Skript auf.

Wie kann ich gdb verwenden? Das Skript ist lang und es ist mir nicht möglich, das Programm direkt über Befehlszeilenargumente von gdb aufzurufen.

Auch der Prozess, der beim Start des Skripts erstellt wird, ist kurzlebig, daher kann gdb nicht an den Prozess angehängt werden.

Was ich tun möchte, ist etwas wie, starte gdb mit diesem Programm, füge meine Breakpoints hinzu und führe dann das Skript aus (FYI - es benötigt auch Argumente), dann, wenn es den Breakpoint erreicht, mache was ich will.

Ich habe mir die Shell-Option in gdb angeschaut, aber das erzeugt eine neue Shell, wenn ich nicht falsch liege und nach Abschluss zu gdb zurückkehre. Das ist nicht was ich will.

Bitte lassen Sie mich wissen, ob es einen besseren Weg gibt.


Es gibt mehrere Möglichkeiten.

Die wirklich alte Schule ist es, eine Schleife in das main Ihres Programms zu hacken:

volatile int zzz;
...
int main() {
  while (!zzz) sleep (1);

Führen Sie dann Ihr Skript aus. Führen Sie in einem separaten Fenster gdb für das Programm aus, das Sie debuggen möchten, und verwenden Sie zum Anfügen an das schlafende Programm attach. Dann können Sie Haltepunkte usw. setzen und schließlich:

(gdb) set var zzz = 1
(gdb) cont

Ein etwas neueres Verfahren ("neu" wie in "es ist in gdb mindestens 10 Jahre gewesen") besteht darin, Ihr Skript zu editieren und ein gdb --args vor dem Aufruf des Programms, das Sie debuggen wollen, zu setzen. Diese Methode funktioniert jedoch nicht immer. Unter anderem werden Umleitungen nicht ordnungsgemäß verarbeitet.

Schließlich können Sie Debugging mit mehreren Unterschieden verwenden. Dies ist der "neueste" Ansatz von allen. Hier folge ich meinem eigenen Blog-Beitrag zum Thema:

$ gdb /bin/sh  # or whatever runs your script
(gdb) set args arguments-to-the-script
(gdb) set detach-on-fork off
(gdb) set target-async on
(gdb) set non-stop on
(gdb) set pagination off

Dann können Sie etwas tun wie:

(gdb) add-inferior -exec program-you-want-to-debug

... wechseln Sie dann zu diesem Untergeordneten und setzen Sie Haltepunkte. Jetzt wechsle zurück zum ersten Inferior und run - es sollte alles funktionieren!


Ein paar Methoden, die ich in der Vergangenheit benutzt habe.

  1. yourprog yourprog.real yourprog in yourprog.real . yourprog Sie ein Skript mit dem Namen yourprog , das gdb --args yourprog.real "[email protected]" .
  2. yourprog gdb über seine eigene yourprog auf und rufen Sie den sleep in einer Schleife auf.




gdb