programing

segfault 메시지 해석

coolbiz 2021. 1. 17. 11:02
반응형

segfault 메시지 해석


다음 segfault 메시지의 올바른 해석은 무엇입니까?

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]

이것은 실행할 코드를 찾으려고하는 널 포인터를 따르기 때문에 (즉, 명령을 가져 오는 동안) segfault입니다.

이것이 공유 라이브러리가 아닌 프로그램이라면

addr2line -e yourSegfaultingProgram 00007f9bebcca90d오류가 발생한 위치를 확인하려면 실행 (및 주어진 다른 명령 포인터 값에 대해 반복)합니다. 더 나은 방법은 디버그 계측 된 빌드를 얻고 gdb와 같은 디버거에서 문제를 재현하는 것입니다.

공유 라이브러리이기 때문에

불행히도 당신은 물에 빠져 있습니다. 사후 동적 링커에 의해 라이브러리가 메모리에 배치 된 위치를 알 수 없습니다. 에서 문제를 재현합니다 gdb.

오류의 의미

다음은 필드 분석입니다.

  • address(애프터 at) - 메모리의 위치 코드가 액세스하려고 (그것은 가능성이 높습니다 그 1011포인터의 오프셋은 우리가 올바른 값으로 설정 될 것으로 예상하지만,있는 대신에 가리키는 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
     */
    

오류 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"는 segfault가 발생했을 때 명령 포인터가 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

제 경우에는 성공하지 못했습니다. 제가 설치 한 사본이 귀하의 사본과 동일하지 않거나 제거되었습니다.


예를 들어 소스 2.6.32 로 가자 . 메시지는 show_unhandled_signals sysctl이 설정된 경우 arch / x86 / mm / fault.c의 show_signal_msg () 함수에 의해 인쇄됩니다.

"error" is not an errno nor a signal number, it's a "page fault error code" -- see definition of enum x86_pf_error_code.

"[7fa44d2f8000+f6f000]" is starting address and size of virtual memory area where offending object was mapped at the time of crash. Value of "ip" should fit in this region. With this info in hand, it should be easy to find offending code in gdb.

ReferenceURL : https://stackoverflow.com/questions/2549214/interpreting-segfault-messages

반응형