这是我的代码:
#include <stdio.h>
int main()
{
fopen("./1.txt","r");
printf("hello");
return 0;
}
$ g ++ -g -o m main.cpp
$gdb ./m
(gdb) b fopen
Breakpoint 1 at 0x804842c
(gdb) b printf
Breakpoint 2 at 0x804843c
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0804842c <fopen@plt>
2 breakpoint keep y 0x0804843c <printf@plt>
(gdb) r
似乎函数fopen的断点永远不会工作,但是在printf工作正常。 为什么?
由于
答案 0 :(得分:4)
这是GDB中的一个错误,它似乎在当前的CVS来源中得到修复(截至2012012年)。
问题是Linux上的32位fopen
中存在两个版本的libc.so.6
,并且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
上设置断点,但调用的函数是{{1} }。