gdb hält sich mit zu vielen Beobachtungspunkten, wenn es nur ein
Kennst du weitere Gründe, warum Sie einen watchpoint konnte nicht eingefügt werden, andere als zu viele hardware-breakpoints/watchpoints?
Habe ich folgende debug-Sitzung:
GNU gdb (GDB) 7.1
...
(gdb) watch itrap_t_beg[1][222]
Hardware watchpoint 1: itrap_t_beg[1][222]
(gdb) cont
Continuing.
...
Hardware watchpoint 1: itrap_t_beg[1][222]
...
(gdb) cont
Continuing.
Warning:
Could not insert hardware watchpoint 1.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.
(gdb) info break
Num Type Disp Enb Address What
1 hw watchpoint keep y itrap_t_beg[1][222]
breakpoint already hit 1 time
Wie Sie sehen können, gibt es nur einen Beobachtungspunkt, dennoch kann es nicht einfügen, die den Haltepunkt.
Wissen Sie, wie kann ich dieses Problem beheben?
- Was ist der Typ der Objekte in
itrap_t_beg
array? - Hi, es ist eine Struktur mit 7 ints.
- Möglich, Duplikat der gdb problem bei der Festlegung von hardware watchpoint/wie set-software Beobachtungspunkt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Soweit ich weiß commodity-x86-CPUs haben vier debug-Register verfügbar für die Unterstützung von hardware-Pausen/- Uhren. Dies begrenzt die Größe des Objekts, das Sie beobachten können. Objekt-Ausrichtung spielt auch hier.
Versuchen Sie, die Begrenzung der Uhr Umfang zu einem kleineren Objekt wie einem paar von ersten und letzten Elemente der Struktur.
Können erzwingen, software-breakpoints (die keine Begrenzung auf die Größe) durch ausführen
setzen können-Nutzung-hw-Beobachtungspunkte 0
Shot Antwort: Verwenden Sie
watch -location itrap_t_beg[1][222]
oder die kurze formwatch -l
.Lange Antwort: Unter Angabe der GDB-Handbuch:
gdb buchstäblich Uhren der Ausdruck selbst nicht, was es anzugehen Punkte zu. In diesem Fall, es bedeutet, dass der breakpoint getroffen wird, wenn
itrap_t_beg
selbst geändert wird, so dassitrap_t_beg[1][222]
unterstützt; es ist nicht nur ein Aussichtspunkt füritrap_t_beg[1][222]
, sondern auch eine füritrap_t_beg
selbst. Dies kann mehr als das, was verfügbar ist.In deinem Fall
itrap_t_beg
7 ints, 28 bytes. Ein x86_64 watchpoint bis zu acht bytes, also GDB muss vier Beobachtungspunkte für die gesamte Struktur - plus einen fünften füritrap_t_beg
selbst. Der x86-Familie unterstützt nur vier gleichzeitige Beobachtungspunkte.Einem umfassenderen Beispiel, wie Beobachtungspunkte Arbeit:
In der Theorie, dies ist eine nützliche Funktion, können Sie beobachten, zu einem komplexen Ausdruck, zu brechen, sobald es falsch ist, etwas wie ein ständig getestet Behauptung. Zum Beispiel können Sie
watch a==b
im obigen Programm.In der Praxis, es ist unerwartet, löst oft dieses Problem, und in der Regel nicht, was Sie wollen.
Nur zusehen, die Ziel-Adresse, verwenden Sie
watch -location itrap_t_beg[1][222]
. (Dies ist als der GDB 7.3, veröffentlicht im Juli 2011, wenn Sie noch auf 7.1, verwenden Sieprint &itrap_t_beg[1][222]
undwatch *(itrap_t)0x12345678
, oder welche Adresse er druckt.)