何度も呼び出され、最終的にセグメンテーション違反になる関数があります。
ただし、この関数にブレークポイントを設定して、呼び出されるたびに停止するのは望ましくありません。何年もここにいるからです。
ブレークポイントにGDBでcounter
を設定できると聞きましたが、ブレークポイントにヒットするたびにカウンターが減分され、counter
= 0の場合にのみトリガーされます。
これは正確ですか?もしそうなら、どうすればいいですか?そのようなブレークポイントを設定するためのgdbコードを提供してください。
GDBマニュアルの セクション5.1.6 を読んでください。あなたがしなければならないことは、最初にブレークポイントを設定し、次にそのブレークポイント番号に「無視カウント」を設定することです。 ignore 23 1000
。
ブレークポイントを無視する回数がわからず、手動でカウントしたくない場合は、次の方法が役立ちます。
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
continue <n>
これは、最後のヒットブレークポイントをスキップする便利な方法ですn - 1
回:
gdb -n -q tmp.out
Reading symbols from tmp.out...done.
(gdb) l
1 #include <stdio.h>
2
3 int main(void) {
4 int i = 0;
5 while (1) {
6 i++;
7 printf("%d\n", i);
8 }
9 }
(gdb) start
Temporary breakpoint 1 at 0x6a8: file tmp.c, line 4.
Starting program: /home/ciro/bak/git/cpp-cheat/gdb/tmp.out
Temporary breakpoint 1, main () at tmp.c:4
4 int i = 0;
(gdb) b 6
Breakpoint 2 at 0x5555555546af: file tmp.c, line 6.
(gdb) c
Continuing.
Breakpoint 2, main () at tmp.c:6
6 i++;
(gdb) c 5
Will ignore next 4 crossings of breakpoint 2. Continuing.
1
2
3
4
5
Breakpoint 2, main () at tmp.c:6
6 i++;
(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).