Forum: PC-Programmierung Benutzen von GDB MI


von Bert (Gast)


Lesenswert?

Hallo Forengemeinde,

ich habe ein etwas exotisches Anliegen.
Ich möchte aus einem C-Programm heraus den GDB ansteuern und gewisse 
Aktionen damit ausführen. Beispielsweise lesen einer Variablen oder 
setzen eines Breakpoints.

Ich habe nun mittlerweile herausgefunden, dass es für diesen Zweck das 
"GDB MI" gibt (machine interface) aber ich verstehe nicht so ganz, wie 
dies funktioniert.

1. Hat das jemand von euch schon mal gemacht und hat ein Beispiel?
2. wie läuft die Interprozess-Kommunikation von meinem C-Programm und 
dem GDB ab? (unter Linux)

Alles in allem soll dies ein anwendungsspezifisches GDB Frontend werden. 
Der GDB verbindet sich dann mit dem GDB Server mit einem ARM-Target.

: Verschoben durch Moderator
von Masl (Gast)


Lesenswert?

Im Zweifel kannst du dir die Sourcen des ddd anschauen, welcher ja im 
Prinzip auch das macht was du vorhast.

Wie durchschaubar dieser Code allerdings ist wage ich nicht abzuschätzen 
:-)

von Bert (Gast)


Lesenswert?

Jau, das habe ich schon versucht. Seit gestern Abend sitze ich davor. 
Aber es ist vermutlich nur für den Autor durchschaubar, die 
Kommentierung ist absolut minimal und an vielen Stellen war 
offensichtlich die Enter- als auch die Space-Taste kapputt, sodass der 
Code sehr "kompakt" ist :-)
(du weisst wie ich meine ;-) )
DDD ist im Prinzip schon mein Vorbild, aber der Code ist halt eben nicht 
so vorbildlich.

von rere (Gast)


Lesenswert?

Vielleicht ist der kgdb leichter zu durchschauen:
http://www.kdbg.org/

von Luther B. (luther-blissett)


Lesenswert?

Eigentlich machst du nur GDB mit popen ("gdb --interpreter=mi a.out") 
auf, generierst input mit der richtigen Syntax und parst fleissig den 
Output. Es ist ein ziemlich übersichtliches Textformat.

Falls du keine Lust auf diese Parserei hast, kannst du natürlich schon 
was fertiges nehmen:

http://sourceforge.net/projects/libmigdb/

von Yalu X. (yalu) (Moderator)


Lesenswert?

Leider kommuniziert popen (anders als bspw. Popen in Python) nur
unidirektional. Für die bidirektionale Kommunikation mit dem GDB kannst
du diesen Code hier ausprobieren:

  http://dzone.com/snippets/simple-popen2-implementation

von Bert (Gast)


Lesenswert?

Hallo,

na super, danke euch für die Tipps mit popen() usw, besonders @Yalu!
so etwas bräuchte ich, denke ich mir mal. Ist es wirklich so "einfach" 
Befehle an den GDB abzusetzen?
wenn ich den mit popen() öffne, wird der GDB-Prozess dann im Hintergrund 
geöffnet oder muss ich da noch von Hand was machen?
Toll wäre natürlich wenn man es noch so erweitern könnte dass der GDB 
Server auch noch gestartet wird im Hintergrund. Und beim Beenden der 
Session dann wieder geschlossen wird.

Von der libmigdb habe ich natürlich auch schon gelesen (bei 
Stackoverflow), aber dort hiess es, die sei ziemlich buggy und nicht zu 
empfehlen. Oder hat damit jemand von euch Erfahrungen gemacht 
diesbezüglich?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bert schrieb:
> wenn ich den mit popen() öffne, wird der GDB-Prozess dann im Hintergrund
> geöffnet

Yep, popen() impliziert ein fork().

von Bert (Gast)


Lesenswert?

Jau, das ist eine tolle Sache. Ich probier das heute Abend mal aus. Bin 
extrem gespannt! So eine riesen Sache wie ich zunächst befürchtet habe 
scheint dies ja gar nicht zu sein.

Und wenn ich den GDB nicht mehr benutze mache ich einfach close() und 
das impliziert dann ein kill() oder so etwas in der Art?

von Luther B. (luther-blissett)


Lesenswert?

Yalu X. schrieb:
> Leider kommuniziert popen (anders als bspw. Popen in Python) nur
> unidirektional.

Ups, da ist mir ein BSDismus reingerutscht. Unter neueren BSD (und OSX) 
kann popen als type "r+", dann ist die pipe tatsächlich bidirektional.

OSX benutzt dafür socketpair, das gibt es auch unter Linux:

http://www.opensource.apple.com/source/Libc/Libc-186/gen.subproj/popen.c

von Bert (Gast)


Lesenswert?

Hallo allerseits,

ich möchte mein Programm ja mit einem GUI ausstatten. Daher benutze ich 
Qt mit dem Qtcreator. Mein GUI habe ich schon so weit fertig, und der 
GDB MI Parser scheint auch die grundlegendsten Funktionen zu 
beherrschen.

Jetzt habe ich gesehen, dass es in Qt die nette Klasse "QProcess" gibt! 
Die stellt auch read() und write() Funktionen zur Verfügung, sodass es 
aussieht, als könnte ich mir das manuelle Handling der Pipes sparen. 
Soweit so gut! Allerdings komme ich nicht ganz zurecht mit der Klasse.
1
    QProcess echo;
2
3
    // call your program (e.g. echo) and add your input as argument
4
    echo.start("echo", QStringList() << "foo bar");
5
6
    // wait until your program has finished 
7
    if (!echo.waitForFinished())
8
        return 1;
9
10
    // read the output
11
    qDebug() << echo.readAll();

Mit dem echo Programm geht dies auch wunderbar, aber mit dem GDB hat er 
schwierigkeiten. Wie kann ich mit Hilfe von QProcess warten, bis der GDB 
seinen Prompt bringt? und dann warten bis mein Befehl ausgeführt wurde?

Gruss.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich denke, dass deine Fragen nichts mehr ernsthaft mit dem GCC zu tun
haben, sondern bei "PC-Programmierung" besser aufgehoben sind.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.