Это ошибка в GDB, которая, по-видимому, исправлена в текущих источниках CVS (по состоянию на 20120124).
Проблема заключается в том, что две версии fopen
в 32-bit libc.so.6
в Linux, и GDB использовал, чтобы выбрать неправильный:
nm -D /lib32/libc.so.6 | grep '\<fopen\>'
0005d0c0 T fopen
00109750 T fopen
readelf -s /lib32/libc.so.6 | egrep '0005d0c0|00109750'
181: 0005d0c0 50 FUNC GLOBAL DEFAULT 12 fopen@@GLIBC_2.1
182: 00109750 136 FUNC GLOBAL DEFAULT 12 fopen@GLIBC_2.0
679: 0005d0c0 50 FUNC GLOBAL DEFAULT 12 _IO_fopen@@GLIBC_2.1
680: 00109750 136 FUNC GLOBAL DEFAULT 12 _IO_fopen@GLIBC_2.0
Если вы также разбите main
и повторите info break
, вы увидите, что GDB установил точку останована fopen@GLIBC_2.0
, но вызывается функция fopen@@GLIBC_2.1
.