def get_term(self): if USETERM: term = USETERM abspath = distutils.spawn.find_executable(term) if abspath is None: gdb_print('ERROR: cant find terminal from USETERM=%s\n' % term) sys.exit(0) return term, abspath for term in ['gnome-terminal', 'xterm']: abspath = distutils.spawn.find_executable(term) if abspath: return term, abspath
def pkg_transaction(self, pkgs): ''' Сначала будут выполнены команды из всхе пакетов. и только потом будет сделана перерисовка''' assert type(pkgs) is list pkgs = filter(lambda x: x is not None, pkgs) if pkgs: if not type(pkgs[0]) is dict: gdb_print('pkg=' + str(pkgs[0]) + '\n\n') assert type(pkgs[0]) is dict return { 'cmd': 'transaction', 'table_name': self.subentity_name, 'pkgs': pkgs }
def check_chunks(chunks): if type(chunks) not in (dict, list): gdb_print('bad chunks: `{}`\n'.format(chunks)) return if type(chunks) is dict: if 'str' in chunks: return elif 'chunks' in chunks: check_chunks(chunks['chunks']) else: gdb_print('bad chunks: {}'.format(chunks)) return else: for child in chunks: check_chunks(child)
def get_register_chunks(self, regname, regvalue): chunks = [] try: if regvalue.type.strip_typedefs().code == gdb.TYPE_CODE_INT: chunks += self.integer_as_struct_chunks(regvalue, regname) else: chunks += self.value_to_chunks(regvalue, regname, integer_mode='hex', disable_dereference=True, slice_clickable=False) except: gdb_print(regname + '\n') raise return chunks
def byemsg(self): gdb_print("type `{cmd}` to restart {type}\n{prompt}".format( cmd=self.startcmd, type=self.type, prompt=get_prompt()))
def __init__(self, **kwargs): ''' Args: **manually (bool): Если false, то команда для запуска граф. окна не будет выполняться. Вместе этого пользователю будет выведена команда, при помощи которой он сам должен запустить окно. Данную опцию нужно применять, когда нет возможности запустить граф. окно из gdb. Например, если зайти по ssh на удаленную машину, то не всегда есть возможность запустить gnome-terminal. При создании класса, в методе __init__ будет создан процесс, в котором будет запущено графическое окно. Данному окну будет передан порт, который прослушивается в gdb. Графическое окно будет устанавливать соединение с этим портом на адрес 127.0.0.1 Данное соединение должно приниматься методом `process_connection`. ''' mcgdb._dw[self.type] = self #debug self.lsock = socket.socket() self.lsock.bind(('', 0)) self.lsock.listen(1) self.listen_port = self.lsock.getsockname()[1] self.listen_fd = self.lsock.fileno() manually = kwargs.pop('manually', False) cmd = self.make_runwin_cmd() self.subentities = {} if manually: gdb_print('''Execute manually `{cmd}` for start window'''.format( cmd=cmd)) else: gui_window_cmd = '{cmd}' if VALGRIND is not None: gui_window_cmd = 'valgrind --log-file={logprefix}_{type}.log {cmd}'.format( type=self.type, logprefix=VALGRIND, cmd=gui_window_cmd, ) if COREDUMP: gui_window_cmd = 'bash -c "cd {COREDUMP}; ulimit -c unlimited; {cmd}"'.format( COREDUMP=COREDUMP, cmd=gui_window_cmd) xterm, xterm_abspath = self.get_term() gui_window_cmd = '''{xterm} -e '{cmd1}' '''.format( cmd1=gui_window_cmd, xterm=xterm_abspath) complete_cmd = gui_window_cmd.format(cmd=cmd) proc = subprocess.Popen(complete_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if xterm == 'gnome-terminal': proc.wait() rc = proc.returncode if rc != 0: out, err = proc.communicate() error('''command: `{complete_cmd}` return error code: {rc}. You can try execute this command manually from another terminal. stdout=`{stdout}`\nstderr=`{stderr}`'''.format(complete_cmd=complete_cmd, rc=rc, stdout=out, stderr=err)) gdb_print( '''\nCan't open gui window({type}). execute manually: `{cmd}`\n''' .format(cmd=cmd, type=self.type)) super(BaseWin, self).__init__(**kwargs)