반응형
The /Proc Filesystem for Debugging
proc - process infomation pseudo-filesystem
(Process infomation)
리눅스가 인기 있는 이유 중 하나는 UNIX 시스템의 좋은 feature들을 결합시킨 점입니다. Proc 파일시스템은 그 좋은 feature들 중 한가지 인데요, 대다수의 Linux 배포판에 포함되어 있습니다. proc 파일시스템은 /proc에 마운트되어 있으며 kernel data 구조에 대해 인터페이스를 제공하고 있습니다. proc 파일시스템의 파일들은 READ-ONLY 이지만, 몇몇의 파일들은 커널 변수를 변경하여 적용할 수 있도록 WRITE가 가능합니다. proc 파일시스템의 구성요소를 하나하나 살펴보도록 하시죠.
이번 글에서는 /proc file system 중 process 정보에 관련된 내용을 살펴보겠습니다.
/proc/self
/proc/self는 현재 실행중인 프로세스의 정보를 확인할 수 있는 특별한 링크입니다. 터미널에서 cd로 /proc/self로 이동하게 되면, 현재 shell 프로세스의 정보를 포함하는 디렉토리로 이동할 수 있습니다. 이 때 /proc/self가 cd 커맨드가 아닌 shell의 정보인 이유는 cd는 shell에 의해 제공되는 명령어 이기 때문이죠. 여러분이 만약 ls -l /proc/self 를 수행하게 되면 이 디렉토리는 ls 프로세스에 연결되게 됩니다. 그럼 여러분이 작성한 프로그램에서 pid를 모르는 상황에서 자신의 어떠한 정보를 알고싶다면 /proc/self로 접근하면 됩니다.
/proc/<pid>
/proc/self는 실제로 현재 실행중인 프로세스의 PID에 맞는 /proc/<pid>로 연결되어 있습니다. 예를 들어 shell의 PID가 1000이라고 하면 현재 shell에서 /proc/self는 /proc/1000 디렉토리로 연결되어 있는거죠. 이렇게 /proc/ 디렉토리를 확인해보면 굉장히 많은 숫자의 디렉토리르 볼 수 있습니다. 각 디렉토리르 현재 실행중인 프로세스들의 PID들인거죠.
/proc/<pid>/maps
maps 파일은 프로세스의 메모리 주소공간의 정보를 제공합니다. 모든 프로세스는 각각 가상 메모리 관리자(Virtual memory manager)에 의해 제공되는 메모리를 가지고 있는거 아시죠? maps는 그 정보들을 확인할 수 있습니다. 현재 프로세스의 maps를 확인해봅시다. 저는 기본 shell로 zsh을 사용하고 있기때문에 /proc/self 는 zsh입니다.
/proc/<pid>/cmdline
cmdline 파일은 프로세스의 전체 argv를 포함하고 있습니다. 해당 프로세스가 실행 될 때 어떤 Argument가 전달되었는지 판단하기 유용합니다.
/proc/<pid>/environ
environ 파일은 프로세스의 현재 environment를 확인할 수 있습니다. 프로세스의 스택 메모리와 바로 연결되어 있습니다. environ 파일은 프로세스의 현재 환경변수 설정값을 알아야 할 때 유용하게 사용할 수 있습니다. getenv()나 putenv(), setenv()와 같은 environment와 관련된 함수들을 이용해 프로그래밍 할 때 관련된 문제점을 확인하는데 필요합니다.
/proc/<pid>/mem
mem 파일은 프로세스의 매핑된 메모리 정보를 보여줍니다. 메모리 주소가 프로세스에서 매핑되지 않은 경우 EIO가 반환됩니다. 또한 /proc/<pid>/mem 파일의 권한은 r--/---/--- 이기에 다른 프로세스에서 mem 파일을 읽으려 한다면 ESRCH 에러가 발생합니다.
/proc/<pid>/fd
fd 디렉토리는 해당 프로세스가 현재 가지고 있는 File descriptor를 가리키는 심볼릭 링크들이 있습니다. 파일의 이름은 File descriptor의 번호로써 stdin은 0, stdout은 1, stderr는 2란 이름의 파일로 존재할 겁니다. File descriptor Leak 문제는 흔히 발생하지만 쉽게 해결하지 못하는 문제인데요, 디버깅 하는 프로세스가 종료되는 시점까지 fd가 close 되지 않는 문제들에 대해 /proc/<pid>/fd 를 이용하면 좀 더 문제 해결에 도움이 될 것 같습니다.
지금까지 proc filesystem의 process 관련된 내용들을 살펴보았습니다. mapped_base 관련된 내용과 memory segment 내용은 나중에 따로 다루도록 하겠습니다.
미약하나마 도움이 되었으면 좋겠네요, 감사합니다 :-D
반응형
'Linux > Debugging & Testing' 카테고리의 다른 글
/Proc FileSystem - Kernel (0) | 2018.04.10 |
---|---|
/Proc FileSystem - Process in More detail (2) | 2018.04.10 |
Strace - trace system calls and signals (0) | 2018.03.19 |
pwndbg (0) | 2017.05.04 |
Software Based Memory Testing (0) | 2016.09.18 |