因此,我正在编写(或者至少尝试编写)一个程序来比较两个gdb在python中运行的输出。这是我到目前为止所做的:
from subprocess import *
import subprocess
file = raw_input('enter program name (with a ./ if in local directory): ')
p1 = Popen(['gdb', file], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p2 = Popen(['gdb', file], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p1.communicate(input='break main')
p2.communicate(input='break main')
args1 = raw_input('args for running program (from file) (ie r < input.txt): ')
args2 = raw_input('args for running program (from file) (for program 2...): ')
p1.communicate(input=args1)
p2.communicate(input=args2)
while True:
p1out = p1.communicate(input='continue')[0]
p2out = p2.communicate(input='continue')[0]
if p1out != p2out:
print 'difference: '
print 'p1: ' + p1out
print 'p2: ' + p2out
cont = raw_input('continue (y/n): ')
if cont != 'y':
break
现在的问题是,这似乎并不起作用。有什么想法,我可能会出错?
更多详情:程序的要点是接收一个可执行文件,在主函数处中断,然后运行每个函数,直到输出在两者之间变化。这是一个调试工具(我会用的,即使没有其他人会!)。然后当你发现一个差异时,它会让你选择是结束程序,还是继续。理论上,这应该可行,但我不知道是什么事
1条答案
按热度按时间mcvgt66p1#
.communicate
等待Popen
对象完成执行。由于您试图在gdb运行时与它对话,因此这将永远挂起。gdb不会在没有任何输入的情况下退出。此外,您需要自己编写新行来模拟用户点击 enter。你想做的是在gdb执行的时候写入和读取它。为此,在发送输入时使用
p1.stdin.write('break main\n')
(注意'\n'
),在阅读输出时使用p1.stdout.readline()
。这适用于开始时的break,正在发送的args和continue。在发送参数并开始执行时,您还应该确保
start
gdb。你还想处理一个进程在另一个进程之前终止的情况。你可以使用
Popen.poll
来检查一个进程是否已经完成,如果没有完成,它将返回None
。虽然这可能不是你想要的处理方式,你可以将循环的顶部改为这样:阅读一行很可能是不正确的,你将不得不校准你读的行数,以获得正确的输出。
您应该向
stderr
添加读操作,或者如果您不关心它,则将其发送到/dev/null
。如果您不这样做,则PIPE缓冲区可能会填满并导致其挂起。