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
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 :-)
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.
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/
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
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?
Bert schrieb: > wenn ich den mit popen() öffne, wird der GDB-Prozess dann im Hintergrund > geöffnet Yep, popen() impliziert ein fork().
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?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.