2010-07-08 14 views
12

Conosci altri motivi per cui non è possibile inserire un punto di controllo oltre a un numero eccessivo di punti di interruzione/punti di controllo dell'hardware?gdb si interrompe con troppi punti di controllo quando c'è solo uno

Ho la seguente sessione di debug:

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 

Come si può vedere, c'è solo un watchpoint ancora non è possibile inserire il punto di interruzione.

Sai come posso risolvere questo?

+0

Qual è il tipo di oggetti nell'array 'itrap_t_beg'? –

+0

Ciao, è una struttura con 7 pollici. – Gaston

+0

Possibile duplicato di [gdb problem setting watchpoint hardware/come impostare il software watchpoint] (http://stackoverflow.com/questions/3470704/gdb-problem-setting-hardware-watchpoint-how-to-set-software-watchpoint) – Alcaro

risposta

12

Per quanto ne so le CPU x86 commodity hanno quattro debug registers disponibili per supportare interruzioni/orologi hardware. Questo limita la dimensione dell'oggetto che puoi guardare. Anche l'allineamento degli oggetti gioca qui.

Provare a limitare l'ambito dell'orologio a un oggetto più piccolo come la coppia di primi e ultimi membri della struttura.

+0

Ehi! Ha funzionato! Grazie. La cosa strana è che potrei impostare il primo orologio. Forse, a quel punto, itrap_t_beg era un char * e poi è stato castato per trap * (il codice sorgente è molto vecchio e cose del genere possono accadere). Grazie ancora! – Gaston

+0

Certo, felice che funzionasse. –

8

possibile forzare breakpoint software (che non hanno limite delle dimensioni) eseguendo

set can-uso-HW-watchpoints 0

0

colpo risposta: Usare watch -location itrap_t_beg[1][222], o la forma breve watch -l.

Risposta lunga: Quoting the GDB manual:

Guardando le espressioni complesse che fanno riferimento a molte variabili possono anche esaurire le risorse disponibili per watchpoints hardware-assisted. Questo perché gdb ha bisogno di guardare ogni variabile nell'espressione con risorse allocate separatamente.

gdb osserva letteralmente l'espressione stessa, non l'indirizzo a cui punta. In questo caso, significa che il punto di interruzione verrà colpito se lo stesso itrap_t_beg viene modificato in modo tale da fare itrap_t_beg[1][222]; non c'è solo un punto di riferimento per itrap_t_beg[1][222], ma anche uno per lo stesso itrap_t_beg. Questo potrebbe essere più di ciò che è disponibile.

Nel tuo caso, itrap_t_beg è 7 pollici, 28 byte. Un watchpoint x86_64 ha fino a otto byte, quindi GDB ha bisogno di quattro watchpoint per l'intera struttura, più un quinto per lo stesso itrap_t_beg. La famiglia x86 supporta solo quattro watchpoint simultanei.

Un esempio più completa su come watchpoints lavoro:

//set a watchpoint on '*p' before running 
#include <stdio.h> 
int a = 0; 
int b = 0; 
int c = 0; 
int* p = &a; 

int main() 
{ 
    puts("Hi"); // Dummy lines to make the results clearer, watchpoints stop at the line after the change 
    *p = 1; // Breaks: *p was changed from 0 to 1 
    puts("Hi"); 
    a = 2; // Breaks: a is *p, which changed from 1 to 2 
    puts("Hi"); 
    p = &b; // Breaks: p is now b, changing *p from 2 to 0 
    puts("Hi"); 
    p = &c; // Doesn't break: while p changed, *p is still 0 
    puts("Hi"); 
    p = NULL; // Breaks: *p is now unreadable 
    puts("Hi"); 
    return 0; 
} 

In teoria, questa è una caratteristica utile; puoi guardare un'espressione complessa, che si rompe non appena è falsa, un po 'come un'affermazione costantemente testata. Ad esempio, è possibile eseguire watch a==b nel programma precedente.

In pratica, è inaspettato, spesso causa questo problema e di solito non è quello che desideri.

Per visualizzare solo l'indirizzo di destinazione, utilizzare watch -location itrap_t_beg[1][222]. (Disponibile a partire da GDB 7.3, rilasciato a luglio 2011, se si è ancora su 7.1, utilizzare print &itrap_t_beg[1][222] e watch *(itrap_t)0x12345678 o qualsiasi indirizzo stampato.)

+1

Questa risposta è per lo più posta in corrispondenza di [questa domanda] (http://stackoverflow.com/questions/3206332/gdb-stops-with-too-many-watchpoints-when-there-is-only-one), dal questo è il miglior hit di Google per "Potrebbe essere richiesto un numero eccessivo di punti di interruzione/punti di controllo hardware". – Alcaro

+1

Si prega di non aggiungere la stessa risposta a più domande. Rispondi al migliore e contrassegna il resto come duplicato. Vedi [È accettabile aggiungere una risposta duplicata a diverse domande?] (Http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add-a-duplica te-answer-to- diverse-domande) –

Problemi correlati