2017-04-04 4 views
0

Ich möchte nur den Code auf einem Remote-GDB-Ziel blinken, wenn es seit dem letzten Mal gdb wurde geändert hat. Ich stelle mir etwas im GdB-Skript vor;GDB Skript Ablaufsteuerung für Remote-Ziel

target extended-remote /dev/<device> 
<Attach to Target> 
file <Target Program> 
if ![compare-sections -r] 
    load 
start 

... jedoch kann ich nicht sehen, wie man eine Befehlsausgabe bedingt.

Kann jemand helfen? Ich glaube, ich wahrscheinlich etwas übersehen, aber ich habe keine Ahnung, was ....

Antwort

0

Der compare-sections Befehl keinen Wert zurückgibt, der in einer if Anweisung verwendet werden kann, aber das Folgende tun, was Sie wollen.

Zunächst definieren ein convenience function namens $cmdeval, die einen gdb-Befehl ausgeführt wird und dessen Ausgang als String zurück:

import gdb 

class CmdEval(gdb.Function): 
    """$cmdeval(str) - evaluate argument string as a gdb command 
    and return the result as a string. 
    """ 

    def __init__(self): 
     super(CmdEval, self).__init__("cmdeval") 

    def invoke(self, gdbcmd): 
     return gdb.execute(gdbcmd.string(), from_tty=False, to_string=True) 

CmdEval() 

Sie diese Namen in einer Datei cmdeval.py und (gdb) source cmdeval.py geben Sie es in GDB zu laden setzen.

Als nächstes da compare-sections Ausgänge "MIS-MATCHED" für jeden Abschnitt, der geändert wurde, können Sie für diese Saite suchen die $_regex Komfort-Funktion, die in neueren Versionen von GDB enthalten ist:

(gdb) if $_regex($cmdeval("compare-sections -r"),".*MIS-MATCHED.*") 
>echo need to load again\n 
>end