2016-09-30 5 views
0

Ich versuche, ein Low-Level-C-Programm in Gdb zu debuggen. Das fragliche Programm soll als Wrapper fungieren, einen anderen Prozess starten und seine Speicherbenutzung überwachen/stören.Programm hängt nur beim ersten Lauf?

Wenn ich das Programm in Gdb laden, scheint alles normal (wenn nicht ideal) zuerst. Ich sehe die neue Prozessgabel, und dann hängt es. An und für sich wäre das nicht zu komisch; wahrscheinlich ein Deadlock oder eine Endlosschleife irgendwo in meinem Code.

Aber wenn ich den Prozess in Gdb unterbrechen und beenden, und dann erneut innerhalb der gleichen Gdb-Sitzung, läuft alles einwandfrei. Es dauert etwa eine halbe Sekunde, um zu laufen und verhält sich genau so, wie es sollte.

Also meine Frage ist: Was ist gdb Erhaltung zwischen den Läufen meines Programms? Was würde sich zwischen der ersten und zweiten Ausführung ändern?

+0

Einige Speicher können verschiedene Werte haben. Einige HW-Zustände können sich unterscheiden (Sie sagen, dass es sich um Low-Level handelt). Viele Dinge können passieren. –

+0

Wahrscheinlich greifen Sie auf eine nicht initialisierte Variable zu und geraten dadurch in eine Art Sperre. Bei zweiten und nachfolgenden Läufen wird das Datensegment Ihres laufenden Prozesses wahrscheinlich wiederverwendet und das gleiche wie zuvor, aber jetzt als Anfangswerte. Achten Sie auf Warnungen "nicht initialisierte Variablen". – tofro

+0

"Aber wenn ich den Prozess unterbrechen und beenden" - * welcher * Prozess? Derjenige, den Sie debuggen, oder der, der gegabelt wurde (oder beides)? –

Antwort

0

Ich fand die Ursache, obwohl ich immer noch nicht verstehe, warum gdb so handelt. Aber ich werde es hier posten, falls es für andere nützlich ist.

I gdb gestartet:

gdb --args ./mywrapper testers_exe/Tester-2

Wenn zum ersten Mal ausgeführt wird:

/home/Benutzername/mywrapper testers_exe/tester-2

Aber wenn sie getötet werden und laufen wieder, imitiert es die jüngste Prozess, nicht die Argumente, die sie gegeben worden war:

/home/Benutzername/testers_exe/Tester-2 testers_exe/Tester-2

So führte es die Tests ohne den Wrapper und vermieden die Endlosschleife des Wrappers.

Verwandte Themen