コード例 #1
0
ファイル: basewin.py プロジェクト: dzabraev/mcgdb
 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
コード例 #2
0
ファイル: basewin.py プロジェクト: dzabraev/mcgdb
 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
         }
コード例 #3
0
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)
コード例 #4
0
 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
コード例 #5
0
ファイル: basewin.py プロジェクト: dzabraev/mcgdb
 def byemsg(self):
     gdb_print("type `{cmd}` to restart {type}\n{prompt}".format(
         cmd=self.startcmd, type=self.type, prompt=get_prompt()))
コード例 #6
0
ファイル: basewin.py プロジェクト: dzabraev/mcgdb
    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)