这是我的代码:
#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
。