2016-06-06 11 views
1

Ich experimentiere mit Python-interaktiven Modus in Gdb, und ich kann nicht herausfinden, wie man eine Variable von innen ändern. Ich weiß, wie man es ohne Python macht - set variable a = 10.Lese/schreibe eine Variable/Symbol aus dem GDB-Python-Interactive-Modus

Ich verwende dieses Testprogramm:

#include <stdio.h> 
int main(int argc, char *argv) { 
    int a; 
    printf("Enter a: "); 
    scanf("%d", &a); 
    printf("You entered: %d\n", a); 
} 

ich einen Haltepunkt nach dem scanf() platziert haben, und wenn es ich geben Python interaktiven Modus getroffen wird. Jetzt möchte ich die Variable a auf einen anderen Wert ändern. Ich versuchte mit a = 10, aber es wurde nicht geändert, und der gleiche Wert, den ich in scanf() eingegeben habe (in diesem Fall ist es 5) wurde stattdessen gedruckt.

(gdb) b main.c:6 
Breakpoint 1 at 0x8048503: file main.c, line 6. 
(gdb) r 
Starting program: /home/sashoalm/Desktop/test/a.out 
Enter a: 5 

Breakpoint 1, main (argc=1, argv=0xbffff1d4 "\214\363\377\277") at main.c:6 
6  printf("You entered: %d\n", a); 
(gdb) python-interactive 
>>> a = 10 
>>> 
(gdb) c 
Continuing. 
You entered: 5 
[Inferior 1 (process 26133) exited normally]

Also, was ist der richtige Weg, es zu tun?

Antwort

2

Nach einigem Durchsuchen der Python-API-Dokumentation habe ich die Antwort gefunden. Ich musste gdb.execute('set var a = 10') verwenden, die Python-Skripten erlaubt, gdb-Befehle auszuführen, und die Befehle werden ausgewertet, als ob der Benutzer sie geschrieben hätte.

habe ich diesen Code a zu lesen, fügen Sie 5, um es und legen Sie es dann:

symbol = gdb.lookup_symbol('a')[0] 
frame = gdb.selected_frame() 
value = symbol.value(frame) 
gdb.execute('set var a = %d' % (int(value)+5))