почему я не могу установить точку останова на fopen в Linux - PullRequest
2 голосов
/ 06 февраля 2012

Вот мои коды:

#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) 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 работаетхорошо.Зачем?

Спасибо

1 Ответ

4 голосов
/ 06 февраля 2012

Это ошибка в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...