[vox-tech] bug in gdb?
Peter Jay Salzman
vox-tech@lists.lugod.org
Fri, 20 Sep 2002 17:52:23 -0700
gdb isn't doing something i'm expecting it to do. i'm wondering if this
is a bug or feature.
here's the code:
int main(void)
{
int i = 5;
while (i)
--i;
return 0;
}
my goal is to teach gdb how to sing the "bottles of beer" song.
here are the commands. blank lines indicate that gdb is singing, so
there will be output. you can cut and paste this into a gdb session,
but cut and paste it in blocks (so do the 1st block first, let gdb run,
then repeat for the 2nd and 3rd blocks).
note, breakpoint 1 is set simply to let the variable "i" come into
scope. after that, i don't need it anymore so i delete breakpoint 1.
break main
run
break 6
commands 2
printf "%d bottles of beer on the wall, %d bottles of beer.\n", i, i
printf "If one of those bottles happen to fall...\n"
end
continue
commands 2
silent
printf "%d bottles of beer on the wall, %d bottles of beer.\n", i, i
printf "If one of those bottles happen to fall...\n"
continue
end
delete 1
run
break 6 if i < 5
commands 3
silent
printf "%d bottles of beer on the wall!\n", i - 1
continue
end
run
if you think about it, i didn't do things quite efficiently. the reason
for this is that this is part of a tutorial i'm writing. but it should
still work.
after the last "run", here's the output:
(gdb) run
5 bottles of beer on the wall, 5 bottles of beer.
If one of those bottles happen to fall...
4 bottles of beer on the wall, 4 bottles of beer.
If one of those bottles happen to fall...
3 bottles of beer on the wall, 3 bottles of beer.
If one of those bottles happen to fall...
2 bottles of beer on the wall, 2 bottles of beer.
If one of those bottles happen to fall...
1 bottles of beer on the wall, 1 bottles of beer.
If one of those bottles happen to fall...
the problem is that breakpoint #3 isn't printing anything:
(gdb) i b
Num Type Disp Enb Address What
2 breakpoint keep y 0x080483d8 in main at sing.c:6
breakpoint already hit 5 times
silent
printf "%d bottles of beer on the wall, %d bottles of beer.\n", i, i
printf "If one of those bottles happen to fall...\n"
continue
3 breakpoint keep y 0x080483d8 in main at sing.c:6
stop only if i < 5
breakpoint already hit 4 times
silent
printf "%d bottle of beer on the wall!\n", i - 1
continue
what if i delete the 2nd breakpoint:
(gdb) disable 2
(gdb) run
Starting program: /home/p/writing/ddd/src/sing
3 bottle of beer on the wall!
2 bottle of beer on the wall!
1 bottle of beer on the wall!
0 bottle of beer on the wall!
looks ok, but i'm not sure why i=4 isn't being printed. anyway, now
i'll re-enable the 2nd breakpoint:
(gdb) enable 2
(gdb) run
Starting program: /home/p/writing/ddd/src/sing
5 bottles of beer on the wall, 5 bottles of beer.
If one of those bottles happen to fall...
4 bottles of beer on the wall, 4 bottles of beer.
If one of those bottles happen to fall...
3 bottles of beer on the wall, 3 bottles of beer.
If one of those bottles happen to fall...
2 bottles of beer on the wall, 2 bottles of beer.
If one of those bottles happen to fall...
1 bottles of beer on the wall, 1 bottles of beer.
If one of those bottles happen to fall...
once the 2nd breakpoint is enabled, the 3rd breakpoint doesn't print
anything. however, as you can see, the 3rd breakpoint was hit 4 times.
i can't find anything in the user manual that talks about command lists
for breakpoints set on top of each other.
is this a bug or am i missing something?
pete
--
Fingerprint: B9F1 6CF3 47C4 7CD8 D33E 70A9 A3B9 1945 67EA 951D