我尝试使用pexpect远程使用gdb。这是我目前的代码:
child = pexpect.spawn("ssh root@192.168.3.10 \"gdb\"")
child.logfile = sys.stdout
child.expect("password:")
child.sendline("xxxx")
child.expect("(gdb)")
child.sendline("attach 9813")
child.expect("(gdb)")
child.sendline("info registers")
child.expect("(gdb)")
child.sendcontrol('c')
这是我的控制台输出的一部分:
(...)
GNU gdb (GDB) 7.4.1-debian
(...)
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 9813
info registers
test@test-virtual-machine:~$
虽然我期待这样的事情:
(...)
GNU gdb (GDB) 7.4.1-debian
(...)
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 9813
<Attaching...>
(gdb) info registers
<Registers info displayed...>
(gdb) <Ctrl+C is done>
test@test-virtual-machine:~$
所以,问题似乎是在匹配第一个(gdb)
并发送第一个命令attach 9813
之后,pexpect不期望第二个(gdb)
行发送新命令{{1} }。它再次看到第一个info registers
,匹配它并且只发送第二个命令而不等待直到执行第一个命令(直到我们连接到所需的进程)。
如何才能分析以下输出?没有匹配前两次输出? 我在ftp服务器上看到了这样的示例:
(gdb)
据我了解,这里pexpect设法按要求的顺序对child = pexpect.spawn('ftp ftp.openbsd.org')
child.expect('(?i)name .*: ')
child.sendline('anonymous')
child.expect('(?i)password')
child.sendline('pexpect@sourceforge.net')
child.expect('ftp> ')
child.sendline('cd /pub/OpenBSD/3.7/packages/i386')
child.expect('ftp> ')
child.sendline('bin')
child.expect('ftp> ')
child.sendline('prompt')
做出反应并连续发送命令。我的代码似乎很相似。
我也试过冲洗stdout,它没用。
答案 0 :(得分:2)
GDB似乎有时会在命令输出之前再次显示提示。您正在匹配第一个提示,发送命令,然后在显示结果之前立即匹配“过早”提示。这意味着最终的Control-C在显示“info registers”的结果之前发送,但脚本的其余部分似乎有效。
解决方案是在发送下一个命令之前匹配任何预期的输出。
答案 1 :(得分:0)
我遇到了同样的问题。 Joelmatth的回答让我想起了修复。
trash = child.expect([".+"])
“。+”匹配它找到的第一件事并帮助清除所有内容。