2011-05-13 7 views
12

GDB 소스를 파기에 부족합니다. 코어 파일을 만드는 데 사용되는 형식에 대한 문서는 어디에서 찾을 수 있습니까?ELF 코어 파일 형식

ELF 사양은 코어 파일 형식을 그대로 유지하므로 GDB 사양의 일부 여야합니다. 슬프게도, 나는 GNU의 gdb 문서에서 이런 점에서 도움을 얻지 못했다.

다음은 수행하려는 작업입니다. 실행중인 프로세스를 구성하는 실행 파일/라이브러리의 함수 이름에 가상 주소를 매핑하십시오. 이를 위해, 먼저 핵심 파일에서 가상 주소 공간의 맵을 실행 파일/라이브러리의 이름으로 매핑 한 다음 관련 파일을 파헤어 심볼 정보를 얻고 싶습니다.

이제 'readelf -a core'는 코어 파일의 거의 모든 세그먼트가 '로드'유형이라는 것을 알 립니 다.이 섹션은 .text 및 .bss/.data 세그먼트가 모두 참여 파일, 스택 세그먼트. 이로드 세그먼트를 제외하면 하나의 노트 세그먼트가 있지만지도가 포함되어 있지 않은 것 같습니다. 그렇다면 코어 파일에 저장된 세그먼트에 해당하는 파일에 대한 정보는 어떻게됩니까? 이러한 '로드'세그먼트가 파일 정보를 포함하는 특정 방식으로 포맷되어 있습니까? gdb, binutils 의해 사용 bfd 라이브러리 등

+0

당신이 '핵심 파일 형식'가 무엇을 의미하는지에 조금 정교한? gcc가 생성하는 객체 코드 형식이나 최종 실행 파일의 형식을 언급하고 있습니까?이 경우 ELF 또는 다른 것입니까? – greatwolf

+1

이 질문에 대한 새로운 대답은 [여기] (http://stackoverflow.com/a/38427225/5058676)입니다. – evaitl

답변

2

순전히. 여기에는 프로그램 세그먼트, 스택, 힙 및 기타 데이터가 포함됩니다. 내용물을 이해하기 위해서는 원본 프로그램이 필요합니다 : 심볼 테이블과 다른 데이터는 메모리 이미지의 원시 주소와 구조를 의미있게 만듭니다.

3

코어 덤프가 충돌 프로세스의 메모리 이미지로서 gdb

2

코어 파일을 생성 한 프로세스에 대한 추가 정보는 운영 체제에 따라 다르지만 ELF 참고 섹션에 저장됩니다. 예를 들어 NetBSD의 경우 core(5) manual page을 참조하십시오.

2

문제의 간단한 해결책은/proc/$ pid/maps의 텍스트를 구문 분석하여 주어진 가상 주소가 매핑되는 파일을 결정하는 것입니다. 그런 다음 해당 파일을 구문 분석 할 수 있습니다.

Kenshoto의 오픈 소스 VDB (디버거)는이 접근법을 사용합니다. 파이썬을 읽을 수 있으면 좋은 예입니다.

6

코어 덤프 파일 형식은 ELF 형식을 사용하지만 ELF 표준에는 설명되어 있지 않습니다. AFAIK, 이에 대한 권위있는 언급이 없습니다.

그럼 세그먼트 파일이 코어 파일에 저장되어있는 파일에 대한 정보는 어떻게됩니까?

많은 추가 정보가 ELF 노트에 포함되어 있습니다. readelf -n을 사용하면 그들을 볼 수 있습니다.

코어/NT_FILE 주 (+ 오프셋) 메모리 어드레스 범위 및 파일 사이의 관계를 정의

각 스레드
Page size: 1 
      Start     End   Page Offset 
0x0000000000400000 0x000000000049d000 0x0000000000000000 
    /usr/bin/xchat 
0x000000000069c000 0x00000000006a0000 0x000000000009c000 
    /usr/bin/xchat 
0x00007f2490885000 0x00007f24908a1000 0x0000000000000000 
    /usr/share/icons/gnome/icon-theme.cache 
0x00007f24908a1000 0x00007f24908bd000 0x0000000000000000 
    /usr/share/icons/gnome/icon-theme.cache 
0x00007f24908bd000 0x00007f2490eb0000 0x0000000000000000 
    /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf 
[...] 

가 당신에게 스레드의 레지스터를 제공하는 CORE/NT_PRSTATUS 참고 있어야 (포함 스택 포인터). 이 위치에서 스택의 위치를 ​​추측 할 수 있습니다.ELF 코어 파일의 형식에 대한

더 많은 정보 :