为什么我不能在fopen中设置断点?

这是我的代码:

#include <stdio.h> int main() { fopen("./1.txt","r"); printf("hello"); return 0; } 

$ g ++ -g -om main.cpp

 $gdb ./m (gdb) b fopen Breakpoint 1 at 0x804842c (gdb) b printf Breakpoint 2 at 0x804843c (gdb) ib Num Type Disp Enb Address What 1 breakpoint keep y 0x0804842c <fopen@plt> 2 breakpoint keep y 0x0804843c <printf@plt> (gdb) r 

似乎函数fopen的断点永远不工作,但在printf工作正常。 为什么?

谢谢

这是GDB中的一个bug,似乎在当前的CVS资源中是固定的(截至20120124)。

问题是Linux上的32位libc.so.6两个版本的fopen ,而且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