프로그래밍/리눅스 프로그래밍

[Debugging] Linux application debugging

jinkwon.kim 2023. 11. 3. 08:11
728x90
반응형

개요

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

728x90
반응형