Понимание GDB и сообщений Segfault

Недавно я регулярно отлаживал приложение, в котором происходил segfaulting - я решил проблему, которая была относительно обыденной (чтение из нулевого указателя), но у меня есть несколько остаточных вопросов, которые я не смог решить самостоятельно.

Трассировка стека GDB начиналась так в большинстве случаев:

0x00007fdff330059f in __strlen_sse42 () from /lib64/libc.so.6

Используя информацию из /proc/[my proc id]/maps для получения базового адреса разделяемой библиотеки, я мог видеть, что проблема возникла при той же инструкции разделяемой библиотеки - в инструкции 0x13259f, которая

pcmpeqb (%rdi),%xmm1 (gdb)

Все идет нормально. Но тогда ОС (linux) также выдает сообщение об ошибке в /var/logs/messags, которое выглядит следующим образом

[3540502.783205] node[24638]: segfault at 0 ip 00007f8abbe6459f sp 00007fff7bf2f148 error 4 in libc-2.12.so[7f8abbd32000+189000]

Что меня смущает. С одной стороны, ядро ​​правильно идентифицирует ошибку (ошибку защиты в пользовательском режиме), и, вычитая базовый адрес совместно используемой библиотеки из указателя инструкции, мы получаем то же относительное смещение -0x13259f- как мы делать GDB. Но библиотека, которую определяет ядро, отличается, адрес инструкции - другой, а функция и инструкция в этой библиотеке - разные. То есть инструкция в libc-2-12.so

0x13259f <__memset_sse2+911>:  movdqa %xmm0,-0x43(%edx)

Итак, мой вопрос заключается в том, как gdb и сообщение ядра могут согласовать тип ошибки и смещение инструкции относительно базового адреса разделяемой библиотеки, но не могут совпадать с адресом указателя инструкции и совместно используемой библиотеки. использовался?

1 ответ

Но библиотека, которую определяет ядро, отличается,

Нет, это не так. Делать ls -l /lib64/libc.so.6, и вы увидите, что это символическая ссылка на libc-2.12.so,

адрес инструкции другой

Сообщение ядра предназначено для выполнения, отличного от того, которое вы наблюдали в GDB, и произошла случайная адресация libc-2.12.so быть загруженным по другому базовому адресу.

и функции и инструкции в этой библиотеке разные. То есть инструкция в libc-2-12.so 0x13259f <__memset_sse2+911>: movdqa %xmm0,-0x43(%edx)

Вполне вероятно, что вы смотрели на файл libc-2.12.so, отличный от того, который фактически используется.

Другие вопросы по тегам