2016-05-04 4 views
4

Angenommen, ich starte eine gdb-Sitzung und einen Haltepunkt erstellen und ausführen.Ist es möglich, Hardware Watchpoint über Wiederholungen in derselben gdb Sitzung zu erhalten?

Nachdem ich abgebrochen habe, erstelle ich einen Watchpoint basierend auf der Speicheradresse eines Symbols in der aktuellen Ausführung und lösche den ursprünglichen Haltepunkt.

Einige Zeit später unterbreche ich das Programm mit Control-C, immer noch in gdb, ich gebe den run Befehl aus, um das Programm von Anfang an neu zu starten.

Allerdings möchte ich den Hardware-Watchpoint über den Neustart des Debug-Prozesses beibehalten.

Gibt es eine gdb-Einstellung, mit der ich Hardware-Watchpoints bei Wiederholungen beibehalten kann?


Update: Hier ist ein Beispiel, um das Problem zu reproduzieren.

int main(){ 
    int NeverGoOutOfScope = 0; 
    NeverGoOutOfScope = 7; 
    while (1); 
} 

Hier sind die Reihenfolge der gdb Befehle.

break 3 
run 
watch NeverGoOutOfScope 
info watch 
run 
# After this point, the breakpoint remains but the watchpoint is gone. 
info watch 

Ist es möglich, den Watchpoint zu erhalten, ohne ihn neu erstellen zu müssen?

+0

werden sie nicht standardmäßig beibehalten? –

+0

Nein. Die Watchpoints verschwinden. Die Haltepunkte können beibehalten werden. – merlin2011

+0

Ich bekomme die Warnung 'Fehler bei der Neueinstellung Haltepunkt NUMMER: Kein Symbol" Variablenname "im aktuellen Kontext", aber es lässt den Watchpoint in der Breakpoints-Liste: 'NUMMER hw watchpoint behalten y Variablenname 'und sein Wert wird gedruckt im nächsten Lauf ... –

Antwort

2

Es sollte mit zwei Bedingungen arbeiten: erstens, dass Sie Adressraum Randomisierung deaktivieren; und zweitens, dass Sie watch -location verwenden.

Randomisierung zu deaktivieren, verwenden:

(gdb) set disable-randomization on 

Ich denke, dies ist die Standardeinstellung, so dass Sie diese überspringen vielleicht in der Lage.

Als nächstes benutzen:

(gdb) watch -location NeverGoOutOfScope 

Dies wird die Adresse der Variablen in dem Beobachtungspunkt aufzunehmen. Das ist fast immer das, was Sie wirklich wollen - gdb hat etwas ausgefallenen Code, um Watchpoint-Ausdrücke neu auszuwerten, wenn eine Variable den Rahmen sprengt, aber in der Praxis finde ich das verwirrender als hilfreich.

Dieser Ansatz funktioniert für mich bei Ihrem Test, obwohl ich während der Prozessinitialisierung ein paar Treffer des Watchpoints ignorieren muss.

Verwandte Themen