diff --git a/pyringe/inferior.py b/pyringe/inferior.py index 3efc37a..841d7d5 100644 --- a/pyringe/inferior.py +++ b/pyringe/inferior.py @@ -32,6 +32,7 @@ import subprocess import tempfile import time +import distutils.spawn # Setting these overrides the defaults. See _SymbolFilePath. @@ -151,7 +152,8 @@ def __init__(self, args=None, arch='i386:x86-64'): self._outfile_r = open(outfile_w.name) self._errfile_r = open(errfile_w.name) - self._process = subprocess.Popen( + if self.is_installed: + self._process = subprocess.Popen( bufsize=0, args=arglist, stdin=subprocess.PIPE, @@ -159,15 +161,15 @@ def __init__(self, args=None, arch='i386:x86-64'): stderr=errfile_w.file, close_fds=True, preexec_fn=os.setpgrp, - ) - outfile_w.close() - errfile_w.close() + ) + outfile_w.close() + errfile_w.close() - self._poller = select.poll() - self._poller.register(self._outfile_r.fileno(), - select.POLLIN | select.POLLPRI) - self._poller.register(self._errfile_r.fileno(), - select.POLLIN | select.POLLPRI) + self._poller = select.poll() + self._poller.register(self._outfile_r.fileno(), + select.POLLIN | select.POLLPRI) + self._poller.register(self._errfile_r.fileno(), + select.POLLIN | select.POLLPRI) def __getattr__(self, name): """Handles transparent proxying to gdb subprocess. @@ -202,6 +204,15 @@ def Kill(self): self._errfile_r.close() self._outfile_r.close() + @property + def is_installed(self): + """ Check if gdb is installed """ + gdb_path = distutils.spawn.find_executable("gdb") + if not gdb_path: + raise OSError("I can not find gdb") + else: + return True + @property def is_running(self): return self._process.poll() is None