개요
linux에서 C++로 개발된 application을 실행 할 때 Debugging하는 방법을 알아보겠습니다.
목차
...
실행 전 연결된 library 확인
리눅스에서 현재 실행 전 프로세스에 로딩될 라이브러리를 확인하기 위해 여러 가지 방법을 사용할 수 있습니다. 다음은 그 중 몇 가지 방법입니다:
ldd
ldd 명령어는 실행 파일에 대한 종속 라이브러리를 출력합니다. 실행 중인 프로세스의 실행 파일을 찾아서 `ldd`를 사용하여 어떤 라이브러리가 연결되었는지 확인할 수 있습니다.
ldd /path/to/executable
이 방법은 실행 파일에 대한 경로를 알고 있어야 하며, 현재 로딩된 라이브러리와 실행 시 로딩될 라이브러리 사이에 차이가 있을 수 있음에 유의해야 합니다.
nm
nm 명령어는 바이너리 파일(실행 파일이나 객체 파일 등)의 심볼 정보를 나열합니다. 이를 통해 특정 바이너리에 어떤 심볼이 정의되어 있는지, 어떤 외부 라이브러리의 심볼에 의존하는지 확인할 수 있습니다.
nm /path/to/executable | grep " U "
"U"는 "undefined" 심볼을 의미하며, 이는 해당 심볼이 외부에서 정의되어야 함을 나타냅니다.
실행 후 연결된 library 확인
리눅스에서 현재 실행 중인 프로세스에 로딩된 라이브러리를 확인하기 위해 여러 가지 방법을 사용할 수 있습니다. 다음은 그 중 몇 가지 방법입니다:
lsof
lsof 명령어는 "List Open Files"의 약자로, 현재 시스템에서 열린 모든 파일의 목록을 출력합니다. 이것은 라이브러리 파일을 포함하여 해당 프로세스에 의해 열린 모든 파일을 보여줍니다.
lsof -p PID
여기서 `PID`는 확인하고자 하는 프로세스의 ID입니다. 라이브러리 파일은 `.so` 확장자로 끝나는 것을 찾을 수 있습니다.
/proc 파일 시스템
/proc 디렉토리는 프로세스와 시스템 정보를 포함하는 특별한 가상 파일 시스템입니다. 각 실행 중인 프로세스는 /proc 아래에 PID로 명명된 디렉토리를 가지고 있으며, 여기에는 해당 프로세스에 대한 많은 정보가 들어 있습니다.
/proc/PID/maps
파일은 메모리 매핑 정보를 포함하고 있으며, 어떤 라이브러리가 메모리에 로드되었는지 확인할 수 있습다.
cat /proc/PID/maps
/proc/PID/smaps
파일은 `maps` 파일의 상세 버전으로, 각 메모리 영역에 대한 상세 정보를 제공합니다.
cat /proc/PID/smaps
/proc/PID/map_files
디렉토리는 메모리 매핑된 파일에 대한 링크를 포함합니다.
/proc/PID/environ
실행 중인 프로세스의 환경 변수는 /proc/PID/environ 파일에 저장되어 있습니다. 이 파일에서 LD_PRELOAD를 검색하여 어떤 라이브러리가 preload 되었는지 확인할 수 있습니다.
tr '\0' '\n' < /proc/PID/environ | grep LD_PRELOAD
여기서 PID는 프로세스의 ID입니다. tr 명령은 널 문자로 구분된 환경 변수를 줄 바꿈 문자로 바꿔서 grep으로 필터링하기 쉽게 만듭니다.
ps 명령어를 사용하여 실행 중인 프로세스의 환경 변수를 출력할 수도 있습니다.
ps eww PID | grep LD_PRELOAD
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
[GDB] shared library debug symbol loading (2) | 2023.11.22 |
---|---|
[linux] netfilter 소개 및 동작 방식 (0) | 2023.07.09 |
[Hook ] LD_PRELOAD (0) | 2023.07.05 |
[stress] stress 사용법 (0) | 2023.02.28 |
[linux] libc 와 glibc 와 libstdc++ 와 gcc의 관계 정리 (0) | 2022.10.19 |