manually generating a core dump file에 관한 나의 질문에 이어, 나는 그것에 잠수하고 더러운 손을 잡기로 결정했습니다.코어 덤프 노트 섹션
기본 코어 덤프 구조를 빌드하고 죽은 프로그램의 메모리를 큰 LOAD 섹션의 코어 덤프에 다시 가져올 수 있습니다. GDB에서 디버깅 할 때, 내 변수가 문제가되지 않습니다. 여기 까다로운 부분이 있습니다. GDB에서 프로그램이 추락했을 때의 위치 정보를 가져 오는 방법은 무엇입니까?
코어 덤프의 노트 섹션에이 정보가 포함되어 있다는 것을 알고 있습니다 (다른 것들 중에서도 cpu 레지스터).
Notes at offset 0x000000f4 with length 0x000001e8:
Owner Data size Description
CORE 0x00000090 NT_PRSTATUS (prstatus structure)
CORE 0x0000007c NT_PRPSINFO (prpsinfo structure)
CORE 0x000000a0 NT_AUXV (auxiliary vector)
: 그 .REG 부분이 어떤 구조에서 매핑 된 데이터를 포함하는 것을
readelf 덕분에 파악
core.28339: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 note0 000001e8 00000000 00000000 000000f4 2**0
CONTENTS, READONLY
1 .reg/28339 00000044 00000000 00000000 00000150 2**2
CONTENTS
2 .reg 00000044 00000000 00000000 00000150 2**2
CONTENTS
3 .auxv 000000a0 00000000 00000000 0000023c 2**2
CONTENTS
4 load1a 00001000 08010000 00000000 00001000 2**12
CONTENTS, ALLOC, LOAD, READONLY, CODE
.. other load sections ...
: 여기 objdump를 -h가 "진짜"코어 덤프를 위해 제공 무엇인가
메모 섹션이 어떻게 구성되어 있는지 안내해 줄 수 있습니까? 필자는 이러한 구조를 직접 파일에 쓰려고 시도했지만 작동하지 않았으며 여기에 뭔가 빠져 있습니다. 나는 Google Coredumper code을보고 약간의 비트를 썼지 만, 노트 섹션을 작성하는 것이 그렇게 간단하지 않으며 정확히 무엇이 포함되어 있으며 형식이 환영되는지에 대한 자세한 정보는 환영 받는다.
편집 # 1 : 1 코멘트 다음 나는 다음과 같이 내 엘프 파일을 구성해야 알아 낸
:
- 엘프 헤더 ElfW (Ehdr)
- 프로그램 헤더 (Ehdr.e_phnum times ElfW (Phdr)), 여기에서는 기본적으로 하나의 PT_NOTE와 하나의 PT_LOAD 헤더를 사용했습니다.
- 참고 섹션 :
- 섹션의 헤더 (.n_descsz 긴) (긴 .n_namesz) (ElfW (Nhdr))
- 섹션의 이름
- 섹션의 데이터
모든 내 프로그램의 메모리를 포함
이것은 올바른 방법 인 것 같습니다. readelf은 제가 실제 코어 덤프와 비슷한 결과물을 제공합니다.
편집 # 2 : 올바른 구조를
을받은 후 지금 노트 기록을 구성하는 다른 구조에 어려움을 겪고 있어요.
다음Note segment of 540 bytes at offset 0x74:
Owner Data size Type
CORE 336 PRSTATUS
CORE 136 PRPSINFO
CORE 8 AUXV
NULL
실제 코어 덤프에 동일한 명령을 실행할 때 내가 무엇을 얻을 : 여기
는 유럽 연합 (EU)-readelf를 실행하는 내 코어 덤프에을 --notes 때 내가 무엇을 얻을Note segment of 488 bytes at offset 0xf4:
Owner Data size Type
CORE 144 PRSTATUS
info.si_signo: 11, info.si_code: 0, info.si_errno: 0, cursig: 11
sigpend: <>
sighold: <>
pid: 28339, ppid: 41446, pgrp: 28339, sid: 41446
utime: 0.000000, stime: 0.000000, cutime: 0.000000, cstime: 0.000000
orig_eax: -1, fpvalid: 0
ebx: -1 ecx: 0 edx: 0
esi: 0 edi: 0 ebp: 0xffb9fcbc
eax: -1 eip: 0x08014b26 eflags: 0x00010286
esp: 0xffb9fcb4
ds: 0x002b es: 0x002b fs: 0x0000 gs: 0x0000 cs: 0x0023 ss: 0x002b
CORE 124 PRPSINFO
state: 0, sname: R, zomb: 0, nice: 0, flag: 0x00400400
uid: 9432, gid: 6246, pid: 28339, ppid: 41446, pgrp: 28339, sid: 41446
fname: pikeos_app, psargs: ./pikeos_app
CORE 160 AUXV
SYSINFO: 0xf7768420
SYSINFO_EHDR: 0xf7768000
HWCAP: 0xbfebfbff <fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe>
PAGESZ: 4096
CLKTCK: 100
PHDR: 0x8010034
PHENT: 32
PHNUM: 2
BASE: 0
FLAGS: 0
ENTRY: 0x80100be
UID: 9432
EUID: 9432
GID: 6246
EGID: 6246
SECURE: 0
RANDOM: 0xffb9ffab
EXECFN: 0xffba1feb
PLATFORM: 0xffb9ffbb
NULL
누군가 내 메모 기록이 제대로 읽히지 않는 이유에 대한 단서가 있습니까? 잘못된 오프셋이 원인 일 수 있다고 생각했지만 레코드가 올바르게 나열되는 이유는 무엇입니까?
감사합니다.
노트 레코드에 포함 된 구조에 관한 질문을 구체화 – d6bels
(이전 질문이지만 다른 사람들에게 유용 할 수 있음) 표준 코어 덤프를 생성하는 커널 소스를 확인하는 것이 좋습니다. - 기본 코드 : http : // lxr. free-electrons.com/source/fs/coredump.c - ELF 관련 부분 : http://lxr.free-electrons.com/source/fs/binfmt_elf.c#L1090 – patrickdepinguin