Я добавил две точки останова в функции одной общей библиотеки (.so), запустил gdb 7.4
и прикрепил его к процессу.
GDB достиг точки останова, и я запустил n
на несколько шагов, и GDB сообщил о следующих ошибках (текст полужирный ):
(gdb) b [имя функции]
Точка останова 1 в 0xf1f28a49: файл ../../../../../ имя файла файла] .cpp, строка 167.
Точка останова 2 в 0xf1f2dae5: файл ../../../../../ имя файла_файла] .cpp, строка 60.
предупреждение: было установлено несколько точек останова.
Используйте команду «delete» для удаления нежелательных точек останова.
(GDB) C
Продолжая.
[Новая тема 0xcaafab90 (LWP 28480)]
[Тема 0xcaafab90 (LWP 28480) вышла]
[Новая тема 0xcaafab90 (LWP 29558)]
[Новая тема 0xc8cb6b90 (LWP 29980)]
[Переключение на тему 0xc8cb6b90 (LWP 29980)]
Точка останова 2, [имя функции] (ostr = ..., clientResponse = ..., httpProtocol = ...,> reqType = ...) в ../../../../../ [ имя файла] .cpp: 60
60 ../../../../../ имя файла_файла] .cpp: Нет такого файла или каталога.
в ../../../../../ имя_файла] .cpp
(gdb) ni
0xf1f2daed 60 in ../../../../../[file name] .cpp
(gdb) n
Точка останова 1, [имя функции] (ostr = ..., clientResponse = ..., httpProtocol = ...,> closeConn = ..., asynchResponse = ..., reqType = ...)
в ../../../../../ имя файла файла] .cpp: 167
167 в ../../../../../ имя файла_файла] .cpp
(GDB) N
Внимание:
Невозможно вставить точку останова 0.
Ошибка доступа к адресу памяти 0x36cc6dde: Ошибка ввода / вывода.
0xf7082771 в siglongjmp () из /lib/libc.so.6
(ГБД)
Это вывод из /proc/[PID]/maps
:
08048000-08146000 r-xp 00000000 08:03 293876
08146000-08150000 rw-p 000fe000 08:03 293876
08150000-099c8000 rw-p 08150000 00:00 0
[куча]
c21f9000-c21fa000 --- p c21f9000 00:00 0
c21fa000-c29fa000 rwxp c21fa000 00:00 0
c29fa000-c29fb000 --- p
c29fa000 00:00 0
……
f1e1b000-f1e24000 rw-p f1e1b000 00:00
0
f1e24000-f2093000 r-xp 00000000 08:03 295549
.so
f2093000-f2094000 --- p 0026f000 08:03 295549
.so
f2094000-f2098000 r - p 0026f000 08:03 295549
.so
f2098000-f209c000 rw-p 00273000 08:03 295549
.so
f209c000-f209d000 rw-p f209c000 00:00 0
Мои вопросы:
GDB не может вставить внутреннюю точку останова для команды ni
, но почему он пытается получить доступ к адресу 0x36cc6dde
, если текстовый раздел имеет значение 0xf1******
? Этот адрес не включается в выходные данные карт как Вы можете видеть.
Более общий вопрос, мне сказали, что разделяемая библиотека начинается в 0x40000000
, но почему это не так в моей среде?
Общая библиотека скомпилирована с -fPIC
. Я скрываю некоторые имена символов в следах выше.