当在旧输出中匹配字符串时,方法期望pexpect python模块中断

时间:2014-07-22 07:33:48

标签: python gdb stdout interactive pexpect

我尝试使用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,它没用。

2 个答案:

答案 0 :(得分:2)

GDB似乎有时会在命令输出之前再次显示提示。您正在匹配第一个提示,发送命令,然后在显示结果之前立即匹配“过早”提示。这意味着最终的Control-C在显示“info registers”的结果之前发送,但脚本的其余部分似乎有效。

解决方案是在发送下一个命令之前匹配任何预期的输出。

答案 1 :(得分:0)

我遇到了同样的问题。 Joelmatth的回答让我想起了修复。

trash = child.expect([".+"])

“。+”匹配它找到的第一件事并帮助清除所有内容。