Bir GDB kesme noktası nasıl ancak noktaya belirli sayıda ulaşıldıktan sonra kırılır?


85

Çok sayıda olarak adlandırılan ve sonunda segment hatası olan bir işlevim var.

Ancak, bu işlevde bir kesme noktası belirlemek ve her çağrıldıktan sonra durmak istemiyorum çünkü yıllarca burada olacağım.

counterBir kesme noktası için GDB'de a ayarlayabileceğimi duydum ve kesme noktasına her vurulduğunda sayaç azaltılır ve yalnızca counter= 0 olduğunda tetiklenir .

Bu doğru mu ve öyleyse nasıl yapacağım? Lütfen böyle bir kesme noktası ayarlamak için gdb kodunu verin.


1
Bilginize buna koşullu kesme noktası denir
sakisk

Yanıtlar:


163

GDB kılavuzunun 5.1.6 bölümünü okuyun . Yapmanız gereken, önce bir kesme noktası ayarlamak, ardından bu kesme noktası numarası için bir 'sayımı yoksay' ayarlamaktır, örn ignore 23 1000.

Kesme noktasını kaç kez yok sayacağınızı bilmiyorsanız ve manuel olarak saymak istemiyorsanız, aşağıdakiler yardımcı olabilir:

  ignore 23 1000000   # set ignore count very high.

  run                 # the program will SIGSEGV before reaching the ignore count.
                      # Once it stops with SIGSEGV:

  info break 23       # tells you how many times the breakpoint has been hit, 
                      # which is exactly the count you want

14

continue <n>

Bu, son isabet kesme noktası n - 1zamanlarını atlayan (ve dolayısıyla n'inci vuruşta duran) uygun bir yöntemdir :

main.c

#include <stdio.h>

int main(void) {
    int i = 0;
    while (1) {
        i++; /* Line 6 */
        printf("%d\n", i);
    }
}

Kullanım:

gdb -n -q main.out

GDB oturumu:

Reading symbols from main.out...done.
(gdb) start
Temporary breakpoint 1 at 0x6a8: file main.c, line 4.
Starting program: /home/ciro/bak/git/cpp-cheat/gdb/main.out

Temporary breakpoint 1, main () at main.c:4
4           int i = 0;
(gdb) b 6
Breakpoint 2 at 0x5555555546af: file main.c, line 6.
(gdb) c
Continuing.

Breakpoint 2, main () at main.c:6
6               i++; /* Line 6 */
(gdb) c 5
Will ignore next 4 crossings of breakpoint 2.  Continuing.
1
2
3
4
5

Breakpoint 2, main () at main.c:6
6               i++; /* Line 6 */
(gdb) p i
$1 = 5
(gdb)
(gdb) help c
Continue program being debugged, after signal or breakpoint.
Usage: continue [N]
If proceeding from breakpoint, a number N may be used as an argument,
which means to set the ignore count of that breakpoint to N - 1 (so that
the breakpoint won't break until the Nth time it is reached).
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.