GDB: interromper se o valor da variável for igual

89

Gosto de fazer o GDB definir um ponto de interrupção quando uma variável é igual a algum valor que defini, tentei este exemplo:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

Saída do GDB:

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

Como você vê, o GDB não fez nenhum ponto de interrupção, isso é possível com o GDB?

SIFE
fonte

Respostas:

123

além de um ponto de controle aninhado dentro de um ponto de interrupção, você também pode definir um único ponto de interrupção no 'nome do arquivo: número_da_linha' e usar uma condição. Acho às vezes mais fácil.

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);

Se, como eu, você se cansar de mudar os números das linhas, pode adicionar um rótulo e definir o ponto de interrupção no rótulo assim:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5
mate
fonte
30

Você pode usar um ponto de controle para isso (um ponto de interrupção nos dados em vez de código).

Você pode começar usando watch i.
Em seguida, defina uma condição para ele usandocondition <breakpoint num> i == 5

Você pode obter o número do ponto de interrupção usando info watch

sou real
fonte
3
(gdb) watch i No symbol "i" in current context.
SIFE
2
Você tem que estar em um lugar no código onde iexiste. Tente break main, run, c, s(passo para se certificar de que você começa após a declaração) e, em seguida, os comandos na resposta. Certifique-se de compilar seu programa com o -gsinalizador. (ou seja, com informações de depuração)
imreal
9

Primeiro, você precisa compilar seu código com sinalizadores apropriados, permitindo a depuração no código.

$ gcc -Wall -g -ggdb -o ex1 ex1.c

em seguida, basta executar o código com o seu depurador favorito

$ gdb ./ex1

mostre-me o código.

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }

quebra nas linhas 5 e verifica se i == 5.

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

verificando pontos de interrupção

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5

executando o programa

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)
Alexandre Mulatinho
fonte
4

Existem watchpoints de hardware e software. Eles servem para ler e escrever uma variável. Você precisa consultar um tutorial:

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

Para definir um ponto de controle, primeiro você precisa quebrar o código em um lugar onde o varianle i está presente no ambiente e definir o ponto de controle.

watchO comando é usado para definir um watchpoit para escrever, enquanto rwatchpara ler e awatchpara ler / escrever.

alinsoar
fonte