OS X 10.5/10.6에서 자체 프로세스의 메모리 맵 검색
-
06-07-2019 - |
문제
Linux에서는 프로세스를 보는 가장 쉬운 방법 '메모리 맵을보고 있습니다. /proc/PID/maps
, 다음과 같은 것을 제공합니다.
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 08056000-08058000 rw-p 0000d000 03:0c 64593 /usr/sbin/gpm 08058000-0805b000 rwxp 00000000 00:00 0 40000000-40013000 r-xp 00000000 03:0c 4165 /lib/ld-2.2.4.so 40013000-40015000 rw-p 00012000 03:0c 4165 /lib/ld-2.2.4.so 4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so 40135000-4013e000 rw-p 00115000 03:0c 45494 /lib/libc-2.2.4.so 4013e000-40142000 rw-p 00000000 00:00 0 bffff000-c0000000 rwxp 00000000 00:00 0
프로세스가 OSX 10.5 또는 10.6에 따른 프로세스 '자체 메모리 맵에 대한 동등한 정보 (주소 범위, 보호, 매핑 된 파일 이름 등)를 어떻게 얻을 수 있습니까?
해결책
이있다 Procfs의 MacFuse 구현. 그것으로, 당신은 다음과 같이 메모리 맵을 얻을 수 있습니다.
cat /proc/PID/task/vmmap
보고 소스 코드, 그것은 그것을 사용하는 것처럼 보입니다 마하 가상 메모리 인터페이스 커널에서 메모리 맵을 가져옵니다.
다음은 다음과 같습니다 vmmap
pseudofile :
/*
* procfs as a MacFUSE file system for Mac OS X
*
* Copyright Amit Singh. All Rights Reserved.
* http://osxbook.com
*
* http://code.google.com/p/macfuse/
*
* Source License: GNU GENERAL PUBLIC LICENSE (GPL)
*/
READ_HANDLER(proc__task__vmmap)
{
int len = -1;
kern_return_t kr;
#define MAX_VMMAP_SIZE 65536 /* XXX */
char tmpbuf[MAX_VMMAP_SIZE];
task_t the_task;
pid_t pid = strtol(argv[0], NULL, 10);
kr = task_for_pid(mach_task_self(), pid, &the_task);
if (kr != KERN_SUCCESS) {
return -EIO;
}
vm_size_t vmsize;
vm_address_t address;
vm_region_basic_info_data_t info;
mach_msg_type_number_t info_count;
vm_region_flavor_t flavor;
memory_object_name_t object;
kr = KERN_SUCCESS;
address = 0;
len = 0;
do {
flavor = VM_REGION_BASIC_INFO;
info_count = VM_REGION_BASIC_INFO_COUNT;
kr = vm_region(the_task, &address, &vmsize, flavor,
(vm_region_info_t)&info, &info_count, &object);
if (kr == KERN_SUCCESS) {
if (len >= MAX_VMMAP_SIZE) {
goto gotdata;
}
len += snprintf(tmpbuf + len, MAX_VMMAP_SIZE - len,
"%08x-%08x %8uK %c%c%c/%c%c%c %11s %6s %10s uwir=%hu sub=%u\n",
address, (address + vmsize), (vmsize >> 10),
(info.protection & VM_PROT_READ) ? 'r' : '-',
(info.protection & VM_PROT_WRITE) ? 'w' : '-',
(info.protection & VM_PROT_EXECUTE) ? 'x' : '-',
(info.max_protection & VM_PROT_READ) ? 'r' : '-',
(info.max_protection & VM_PROT_WRITE) ? 'w' : '-',
(info.max_protection & VM_PROT_EXECUTE) ? 'x' : '-',
inheritance_strings[info.inheritance],
(info.shared) ? "shared" : "-",
behavior_strings[info.behavior],
info.user_wired_count,
info.reserved);
address += vmsize;
} else if (kr != KERN_INVALID_ADDRESS) {
if (the_task != MACH_PORT_NULL) {
mach_port_deallocate(mach_task_self(), the_task);
}
return -EIO;
}
} while (kr != KERN_INVALID_ADDRESS);
gotdata:
if (the_task != MACH_PORT_NULL) {
mach_port_deallocate(mach_task_self(), the_task);
}
READ_PROC_TASK_EPILOGUE();
}
다른 팁
보세요 이 스레드 2007 년부터 다윈 커널 메일 링리스트. 간단히 말해서, 당신의 선택은 그럴 것입니다 popen vmmap
(그게 setgid
적절하게) 또는 Mach VM 지역 API를 사용하십시오. /usr/include/mach/mach_vm.h
. 나는 Mach API를 세이지 수학 시스템 소스.
VMMAP 소스를 찾는 사람들을위한 몇 가지 링크 ( 출판되지 않았습니다):
- http://www.newosxbook.com/src.jl?tree=listings&file=12-1-vmmap.c
- https://code.google.com/p/psutil/source/browse/psutil/_psutil_osx.c#274 (get_process_memory_maps) 및 https://code.google.com/p/psutil/issues/detail?id=260
Dyld_shared_cache에서 매핑 된 파일 이름과 라이브러리 이름을 얻습니다. https://stackoverflow.com/a/17180619/1026
gnulib (gnulib)http://www.gnu.org/software/gnulib/) Mac OS X를 포함하여 대부분의 OS에서 모든 가상 메모리 세그먼트를 반복하는 기능이 포함되어 있습니다.