Что такое Segfault RIP / RSP номера и как их использовать - PullRequest
11 голосов
/ 22 сентября 2009

Когда мое linux-приложение аварийно завершает работу, оно выдает в журналах строку, похожую на:

segfault в 0000000 рип 00003f32a823 rsp 000123ade323 ошибка 4

Что это за адреса rip и rsp? как я могу использовать их, чтобы точно определить проблему? соответствуют ли они чему-либо на выходах "objdump" или "readelf"? полезны ли они, если моя программа удаляет свои символы (в отдельный файл, который можно использовать с помощью gdb)

Ответы [ 2 ]

7 голосов
/ 22 сентября 2009

Ну, указатель разрыва сообщает вам инструкцию, которая вызвала сбой. Вы должны найти его в файле карты.

В файле карты у вас будет список функций и их начальный адрес. Когда вы загружаете приложение, оно загружается по базовому адресу. Указатель разрыва - базовый адрес дает вам адрес файла карты. Если вы затем ищете в файле карты функцию, которая начинается с адреса, несколько меньшего, чем у вашего указателя копирования, и в списке следует функция с более высоким адресом, вы нашли функцию, которая потерпела крах.

Оттуда вам нужно попытаться определить, что пошло не так в вашем коде. Это не очень весело, но, по крайней мере, дает вам отправную точку.

Редактировать: Бит "segfault at" говорит вам, я готов поспорить, что вы разыменовали нулевой указатель. Rsp - текущий указатель стека. Увы, это, вероятно, не все, что полезно. С дампом памяти вы «сможете» более точно определить, куда вы попали в функцию, но может быть действительно сложно разобраться, где именно вы находитесь в оптимизированной сборке

3 голосов
/ 24 января 2011

Я тоже получил ошибку. Когда я увидел:

probe.out[28503]: segfault at 0000000000000180 rip 00000000004450c0 rsp 00007fff4d508178 error 4

probe.out - приложение, использующее libavformat (ffmpeg). Я его разобрал.

objdump -d probe.out

Рип - это место, где будет выполняться инструкция:

00000000004450c0 <ff_rtp_queued_packet_time>:
  4450c0:       48 8b 97 80 01 00 00    mov    0x180(%rdi),%rdx
  44d25d:       e8 5e 7e ff ff          callq  4450c0 <ff_rtp_queued_packet_time>

наконец, я обнаружил, что приложение не работает в функции ff_rtp_queued_packet_time

PS. иногда адрес не совсем совпадает, но он почти там.

...