From 37e78463e58c374ba2ff933acfc4441cbb666c1f Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Sun, 9 Aug 2015 00:07:05 -0700 Subject: oeqa/qemurunner: Improve runqemu log output debug If runqemu fails, ensure the log output is shown as its invaluable to aid debugging. Its slightly convoluted since we need to ensure we don't block on reading the pipe which may still be executing hence the need for nonblocking IO. (From OE-Core rev: 0e0fa1461863ec586b4f028dfd7d641f091ea928) Signed-off-by: Richard Purdie --- meta/lib/oeqa/utils/qemurunner.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py index 02ac89c142..9bb1f4bb2d 100644 --- a/meta/lib/oeqa/utils/qemurunner.py +++ b/meta/lib/oeqa/utils/qemurunner.py @@ -94,12 +94,19 @@ class QemuRunner: if qemuparams: self.qemuparams = self.qemuparams[:-1] + " " + qemuparams + " " + '\"' + def getOutput(o): + import fcntl + fl = fcntl.fcntl(o, fcntl.F_GETFL) + fcntl.fcntl(o, fcntl.F_SETFL, fl | os.O_NONBLOCK) + return os.read(o.fileno(), 1000000) + launch_cmd = 'runqemu %s %s %s' % (self.machine, self.rootfs, self.qemuparams) # FIXME: We pass in stdin=subprocess.PIPE here to work around stty # blocking at the end of the runqemu script when using this within # oe-selftest (this makes stty error out immediately). There ought # to be a proper fix but this will suffice for now. self.runqemu = subprocess.Popen(launch_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, preexec_fn=os.setpgrp) + output = self.runqemu.stdout logger.info("runqemu started, pid is %s" % self.runqemu.pid) logger.info("waiting at most %s seconds for qemu pid" % self.runqemutime) @@ -109,9 +116,8 @@ class QemuRunner: if self.runqemu.returncode: # No point waiting any longer logger.info('runqemu exited with code %d' % self.runqemu.returncode) - output = self.runqemu.stdout self.stop() - logger.info("Output from runqemu:\n%s" % output.read()) + logger.info("Output from runqemu:\n%s" % getOutput(output)) return False time.sleep(1) @@ -128,7 +134,7 @@ class QemuRunner: self.ip = ips[0] self.server_ip = ips[1] except IndexError, ValueError: - logger.info("Couldn't get ip from qemu process arguments! Here is the qemu command line used: %s" % cmdline) + logger.info("Couldn't get ip from qemu process arguments! Here is the qemu command line used:\n%s\nand output from runqemu:\n%s" % (cmdline, getOutput(output))) self.stop() return False logger.info("Target IP: %s" % self.ip) @@ -170,9 +176,8 @@ class QemuRunner: return False else: logger.info("Qemu pid didn't appeared in %s seconds" % self.runqemutime) - output = self.runqemu.stdout self.stop() - logger.info("Output from runqemu:\n%s" % output.read()) + logger.info("Output from runqemu:\n%s" % getOutput(output)) return False return self.is_alive() -- cgit v1.2.3-54-g00ecf