Hallo
ich habe folgendes Problem. Ich möchte den gdb mit Hilfe eines python scripts starten und steuern. Dabei soll das script zunächst nur den gdb starten ('gdb'), anschließend die Hilfe ausgeben ('help') und dann den gdb beenden ('quit')
Das Starten ist eigentlich kein Problem. Im Web und auch hier im Forum hab ich gesehen , dass das mit os.system, popen usw. möglich ist. Leider habe ich noch keine Möglichkeit gefunden, wie ich nach dem Starten des GDB, Befehle an diesen senden kann. Vielleicht kann mir jemand dabei helfen.
Danke !!!
Programmkontrolle mit Python
Wenn du ihn mit os.popen3 bzw popen2.popen3 startest kannst du noch Kommandos hinterherwerfen, theoretisch so:MiBSchmidt hat geschrieben:Das Starten ist eigentlich kein Problem. Im Web und auch hier im Forum hab ich gesehen , dass das mit os.system, popen usw. möglich ist. Leider habe ich noch keine Möglichkeit gefunden, wie ich nach dem Starten des GDB, Befehle an diesen senden kann. Vielleicht kann mir jemand dabei helfen.
Code: Alles auswählen
import popen2
ch_out,ch_in,ch_err=popen2.popen3('gdb')
ch_in.write('help\n')
ch_in.write('quit\n')
ch_in.close()
-
- User
- Beiträge: 2
- Registriert: Samstag 21. Juni 2003, 18:59
Hallo Milan
Danke für die super schnelle Antwort
Habe deine code ausprobiert und ich denkemal erfunktioniert. Ich kann das nicht genau sagen, da die Antwort des gdb ja jetzt in ch_out stehen müßte. Ich habe dann versucht das Sript wie folgt zu erweitern:
Leider bleibt das script stehen wenn ich es ausführe. Kannst du mir sagen was ich falsch mache?
Danke
Danke für die super schnelle Antwort
Habe deine code ausprobiert und ich denkemal erfunktioniert. Ich kann das nicht genau sagen, da die Antwort des gdb ja jetzt in ch_out stehen müßte. Ich habe dann versucht das Sript wie folgt zu erweitern:
Code: Alles auswählen
import sys,os,popen2,string
cmd = 'gdb'
ch_out,ch_in,ch_err=popen2.popen3(cmd)
line = ch_out.readlines()
print "%s" (line)
ch_out.close()
ch_in.write('help\n')
ch_in.write('quit\n')
ch_in.close()
Danke
Hi,
wenn du was etwas aus ch_out auslesen willst, wartet dein Script natürlich bis es was zu auslesen gibt, also wahrscheinlich bis gdb zu Ende ist. Lass also mal zuerst die eingabe machen und schau dann, was zurückgegeben wird (einfach die zwei Blöcke vertauschen). Du musst auch ch_out nicht nach dem auslesen schließen, ich hab das bei mir im Beispiel getan, weil es sonst manchmal bei mir nicht funktioniert (Bsp: versenden von Mails mit sendmail).
Milan
wenn du was etwas aus ch_out auslesen willst, wartet dein Script natürlich bis es was zu auslesen gibt, also wahrscheinlich bis gdb zu Ende ist. Lass also mal zuerst die eingabe machen und schau dann, was zurückgegeben wird (einfach die zwei Blöcke vertauschen). Du musst auch ch_out nicht nach dem auslesen schließen, ich hab das bei mir im Beispiel getan, weil es sonst manchmal bei mir nicht funktioniert (Bsp: versenden von Mails mit sendmail).
Milan
Hallo!
Sowas mit Bordmitteln zu realisieren, wird heftig, vermute ich mal. Abseits von Python macht man sowas (Automation von interaktiven Anwendungen) mit expect.
Ich hab' eben einen Python-Port gefunden, der einen guten Eindruck macht. Quelle: http://pexpect.sourceforge.net
Jan
Sowas mit Bordmitteln zu realisieren, wird heftig, vermute ich mal. Abseits von Python macht man sowas (Automation von interaktiven Anwendungen) mit expect.
Ich hab' eben einen Python-Port gefunden, der einen guten Eindruck macht. Quelle: http://pexpect.sourceforge.net
Code: Alles auswählen
>>> import pexpect
>>> child = pexpect.spawn('gdb')
>>> child.expect('\(gdb\)')
0
>>> child.sendline('help')
5
>>> child.expect('\(gdb\)')
0
>>> child.before
' help\r\nList of classes of commands:\r\n\r\naliases -- Aliases
of other commands\r\nbreakpoints -- Making program stop at certain
points\r\ndata -- Examining data\r\nfiles -- Specifying and examining
files\r\ninternals -- Maintenance commands\r\nobscure -- Obscure
features\r\nrunning -- Running the program\r\nstack -- Examining the
stack\r\nstatus -- Status inquiries\r\nsupport -- Support
facilities\r\ntracepoints -- Tracing of program execution without
stopping the program\r\ntui -- Text User Interface commands\r\nuser-
defined -- User-defined commands\r\n\r\nType "help" followed by a class
name for a list of commands in that class.\r\nType "help" followed by
command name for full documentation.\r\nCommand name abbreviations are
allowed if unambiguous.\r\n'
>>>
string.readlines() wartet auf EOF.MiBSchmidt hat geschrieben:Leider bleibt das script stehen wenn ich es ausführe. Kannst du mir sagen was ich falsch mache?Code: Alles auswählen
import sys,os,popen2,string cmd = 'gdb' ch_out,ch_in,ch_err=popen2.popen3(cmd) line = ch_out.readlines() print "%s" (line) ch_out.close() ch_in.write('help\n') ch_in.write('quit\n') ch_in.close()
Danke
Das kommt erst, wenn der Prozess beendet wird.
Du kannst stattdessen in einer Schleife mit string.readline() die Zeilen einzeln einlesen...