시스템 힙의 내용을 인쇄하고 분석하고 싶습니다. 분명히 이것은 특권적인 작업이어야 하며 GDB의 목적을 무너뜨릴 수 있습니다.
특히 힙의 프로세스 부분뿐만 아니라 전체 시스템 힙을 스캔하고 싶습니다.
gdb가 이것을 할 수 있습니까? 가능하다면 어떤 명령으로 이를 수행할 수 있나요? 그렇지 않다면 이를 수행할 수 있는 도구가 있습니까?
필요한 경우 이를 수행하기 위해 사용자 정의 드라이버/디버그 커널/중단점을 설정하겠습니다.
답변1
먼저 다음과 같은 기본 지식을 알아야 합니다.가상 메모리. MMU가 어떻게 작동하는지 이해할 필요는 없지만 가상 주소 공간이 무엇인지, 가상 주소나 물리적 주소를 언제 처리해야 하는지는 이해해야 합니다. 그렇지 않으면 당신이 보는 모든 것을 이해하지 못할 것입니다.
Linux에서는 다음을 통해 시스템의 물리적 메모리에 액세스할 수 있습니다./dev/mem
: 바이트질소of /dev/mem
는 바이트입니다질소RAM 또는 메모리 매핑된 주변 장치. 무엇을 찾아야 할지, 어디를 봐야 할지 이미 알고 있지 않다면 그곳에서 흥미로운 것을 찾기가 어려울 것입니다. 이 파일은 /proc/iomem
물리적 주소 공간(RAM 및 주변 장치)에 매핑된 내용을 설명합니다.
다음을 통해 커널의 가상 메모리에 액세스할 수 있습니다. /dev/kmem
이를 통해 커널 코드 및 데이터 구조는 물론 현재 커널에 매핑된 장치에 액세스할 수 있지만 프로세스 메모리에는 액세스할 수 없습니다. Linux에도 /proc/kcore
비슷한 기능이 있지만 /dev/kmem
커널에서 디버거 실행을 용이하게 하기 위해 ELF 헤더를 처음에 넣습니다. 디버거는 /proc/kcore
프로세스의 메모리처럼 이를 열고 작업할 수 있습니다. 다음을 실행하여 실행 중인 커널을 디버깅할 수 있습니다.gdb /path/to/vmlinux /proc/kcore
(특히 원격 디버깅 등 더욱 편리한 기능이 있습니다.)
다음을 통해 프로세스의 가상 메모리에 접근할 수 있습니다./proc/$PID/mem
. 이 파일에는 /proc/$PID/maps
프로세스 주소 공간에 매핑된 내용이 요약되어 있습니다 /proc/$PID/smaps
.
"시스템 힙"이나 "중앙 집중식 힙 관리자"와 같은 것은 없습니다. 가장 가까운 것은전체 시스템 메모리그리고메모리 관리자(아키텍처 관련 부분을 제외하고 Linux에서는 모두 ~100kLoC)