Интерпретация сообщений segfault - PullRequest
53 голосов
/ 31 марта 2010

Как правильно интерпретировать следующие сообщения о сбоях?

segfault at 10 ip 00007f9bebcca90d sp 00007fffb62705f0 error 4 in libQtWebKit.so.4.5.2[7f9beb83a000+f6f000]
segfault at 10 ip 00007fa44d78890d sp 00007fff43f6b720 error 4 in libQtWebKit.so.4.5.2[7fa44d2f8000+f6f000]
segfault at 11 ip 00007f2b0022acee sp 00007fff368ea610 error 4 in libQtWebKit.so.4.5.2[7f2aff9f7000+f6f000]
segfault at 11 ip 00007f24b21adcee sp 00007fff7379ded0 error 4 in libQtWebKit.so.4.5.2[7f24b197a000+f6f000]

Ответы [ 3 ]

84 голосов
/ 31 марта 2010

Это ошибка из-за следующего нулевого указателя, пытающегося найти код для выполнения (то есть во время выборки инструкции).

Если бы это была программа, а не общая библиотека

Запустите addr2line -e yourSegfaultingProgram 00007f9bebcca90d (и повторите для других значений указателя инструкций), чтобы увидеть, где происходит ошибка. Лучше получите отладочную сборку и воспроизведите проблему в отладчике, таком как gdb.

Так как это общая библиотека

Ты, к сожалению, отыгрался; невозможно узнать, где библиотеки были помещены в память динамическим компоновщиком после этого. Воспроизведите проблему в разделе gdb.

Что означает ошибка

Вот разбивка полей:

  • address (после at) - место в памяти, к которому пытается получить доступ код (вероятно, 10 и 11 являются смещениями от указателя, который мы ожидаем установить на допустимое значение, но который вместо этого указывает на 0)
  • ip - указатель инструкции, т.е. где код, который пытается это сделать, живет
  • sp - указатель стека
  • error - код ошибки для ошибок страницы; см. ниже, что это означает для x86.

    /*
     * Page fault error code bits:
     *
     *   bit 0 ==    0: no page found       1: protection fault
     *   bit 1 ==    0: read access         1: write access
     *   bit 2 ==    0: kernel-mode access  1: user-mode access
     *   bit 3 ==                           1: use of reserved bit detected
     *   bit 4 ==                           1: fault was an instruction fetch
     */
    
46 голосов
/ 29 октября 2014

Ошибка 4 означает «Причиной было чтение в пользовательском режиме, в результате чего страница не была найдена». Есть инструмент, который декодирует его здесь .

Вот определение из ядра. Имейте в виду, что 4 означает, что бит 2 установлен, а другие биты не установлены. Если вы преобразуете его в двоичный код, это становится понятным.

/*
 * Page fault error code bits
 *      bit 0 == 0 means no page found, 1 means protection fault
 *      bit 1 == 0 means read, 1 means write
 *      bit 2 == 0 means kernel, 1 means user-mode
 *      bit 3 == 1 means use of reserved bit detected
 *      bit 4 == 1 means fault was an instruction fetch
 */
#define PF_PROT         (1<<0)
#define PF_WRITE        (1<<1)
#define PF_USER         (1<<2)
#define PF_RSVD         (1<<3)
#define PF_INSTR        (1<<4)

Теперь, «ip 00007f9bebcca90d» означает, что указатель инструкции был 0x00007f9bebcca90d, когда произошла ошибка.

«libQtWebKit.so.4.5.2 [7f9beb83a000 + f6f000]» говорит вам:

  • Объект, в котором произошел сбой: "libQtWebKit.so.4.5.2"
  • Базовый адрес этого объекта "7f9beb83a000"
  • Насколько велик этот объект: "f6f000"

Если вы берете базовый адрес и вычитаете его из ip, вы получаете смещение в этот объект:

0x00007f9bebcca90d - 0x7f9beb83a000 = 0x49090D

Затем вы можете запустить addr2line:

addr2line -e /usr/lib64/qt45/lib/libQtWebKit.so.4.5.2 -fCi 0x49090D
??
??:0

В моем случае это не увенчалось успехом: либо копия, которую я установил, не идентична вашей, либо она удалена.

10 голосов
/ 25 августа 2012

Перейдем к источнику - 2.6.32, например . Сообщение печатается функцией show_signal_msg () в файле arch / x86 / mm / fault.c, если установлен sysctl show_unhandled_signals.

«ошибка» не является ни номером ошибки, ни номером сигнала, это «код ошибки ошибки страницы» - см. Определение enum x86_pf_error_code.

«[7fa44d2f8000 + f6f000]» - это начальный адрес и размер области виртуальной памяти, в которую поврежденный объект был отображен во время сбоя. Значение «ip» должно соответствовать этому региону. Имея эту информацию в руках, должно быть легко найти обидный код в GDB.

...