//123.c char macro_ptr=0; void next(void) { redo: if (!macro_ptr) { if (macro_ptr) { if (macro_ptr) { if (macro_ptr) { goto redo; } } } } else { goto redo; } } int main() { char a=0,b=9; next(); b=a+b; return 0; } jiang@jiang:~$ gcc -o123 -g -O0 123.c jiang@jiang:~$ gdb 123 GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2) 7.4-2012.04 Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". For bug reporting instructions, please see: <http://bugs.launchpad.net/gdb-linaro/>... Reading symbols from /home/jiang/123...done. (gdb) break main Breakpoint 1 at 0x4004f4: file 123.c, line 28. (gdb) run Starting program: /home/jiang/123 Breakpoint 1, main () at 123.c:28 28 char a=0,b=9; (gdb) s 29 next(); (gdb) [Inferior 1 (process 2322) exited normally] warning: Error removing breakpoint 0 warning: Error removing breakpoint 0 warning: Error removing breakpoint 0 (gdb)
The line warning: Error removing breakpoint 0 is already fixed - GDB PR 13776. The bug itself is GCC debug PR already tracked as: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52160
In addition to the-O0 option, the other can enter the next ()
step in next() -g -O0 fail step in next() -g -O1 or -g -O2,so,successful Optimization options related I hope you will attention to this bug jiang@jiang:~$ gcc -o123 -g -O1 123.c iang@jiang:~$ gdb 123 GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2) 7.4-2012.04 Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". For bug reporting instructions, please see: <http://bugs.launchpad.net/gdb-linaro/>... Reading symbols from /home/jiang/123...done. (gdb) break main Breakpoint 1 at 0x4004c1: file 123.c, line 28. (gdb) run Starting program: /home/jiang/123 Breakpoint 1, main () at 123.c:28 28 next(); (gdb) s next () at 123.c:6 6 if (!macro_ptr) (gdb) q A debugging session is active. Inferior 1 [process 2307] will be killed. Quit anyway? (y or n) y
* You may rather follow-up at the GCC bug above, this bug is off-topic for GDB: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52160 * That -O1+ works is nice but it is still a real bug that -O0 does not. * It is more clear to use 'gcc -S' or 'objdump -dl' examples than showing GDB.