GDB: перерва, якщо змінна дорівнює значенню


89

Мені подобається змушувати GDB встановлювати точку розриву, коли змінна дорівнює деякому значенню, яке я встановив, я спробував цей приклад:

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

     return 0;
}

Вихід з 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)

Як бачите, GDB не зробив жодної точки розриву, чи можливо це з GDB?

Відповіді:


123

на додаток до точки спостереження, вкладеної всередині точки зупинки, ви також можете встановити єдину точку зупинки для "ім'я файлу: номер_ рядка" і використовувати умову. Мені часом це легше.

(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);

Якщо, як і я, ви втомилися від зміни номерів рядків, ви можете додати мітку, а потім встановити точку зупинки на мітку приблизно так:

#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

30

Ви можете використовувати для цього контрольну точку (Точка зупинки даних замість коду).

Ви можете почати з використання watch i.
Потім встановіть для цього умовуcondition <breakpoint num> i == 5

Ви можете отримати номер точки зупинки за допомогою info watch


3
(gdb) watch i No symbol "i" in current context.
SIFE

2
Ви повинні бути там, де iіснує код . Спробуйте break main, run, c, s(крок , щоб переконатися , що ви отримаєте повз декларації), а потім команди на відповідь. Обов’язково складіть свою програму з -gпрапором. (тобто з інформацією про налагодження)
нереально

Перед початком виконання інші модулі / файли компіляції, пов'язані з вашим основним виконуваним файлом, можуть ще не завантажені. Витончений варіант полягає у використанні то start <args>, що , як tb main, run <args>. Це запустить програму, що дозволить вам легше встановлювати точки перерви / огляду.
JWCS

9

По-перше, вам потрібно скомпілювати свій код із відповідними прапорцями, що дозволить налагоджувати код.

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

тоді просто запустіть свій код за допомогою улюбленого налагоджувача

$ gdb ./ex1

покажи мені код.

(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   }

перерва на рядки 5 і виглядає, якщо 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

перевірка точок зупинку

(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

запуск програми

(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)

4

Існують апаратні та програмні контрольні точки. Вони призначені для читання та для написання змінної. Вам потрібно проконсультуватися з підручником:

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

Щоб встановити контрольну точку, спочатку потрібно розбити код на місце, де варіант i присутній у навколишньому середовищі, і встановити контрольну точку.

watchКоманда використовується для встановлення сторожової точки для письма, rwatchчитання та awatchчитання / запису.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.