728x90

macOS에서 memory leak 체크하려다
-valgrind는 너무 유용하고 간단한 툴이지만: 리눅스 환경에서만 실행된다는 소식...
-sanitizer는 과제 환경인 g++ 컴파일러가 아닌 clang 컴파일러에서만 실행된다는 소식...


그렇게 알게된 게 'leaks'
macOS에서 valgrind의 역할을 해주는 요긴한 친구다 ❤️
하지만 leaks를 실행하기 위한 코드를 컴파일코드의 '어디'에 넣어야 할지 몰랐고, 이를 이해하면 과제에서 주어진 makefile의 문법을 알아야 했다. 역시 프로그래밍은 성급히 하면 오히려 꼬이고 세 배의 시간이 소요된다는 것.. ㅎㅎ 처음부터 찬찬히 해보니 성공했다!


 

1. makefile 친숙해지기 (아래링크에서 완벽 정리)
https://hwan-shell.tistory.com/188

c++] make, makefile의 사용방법(기본적인 설명)

1. makefile 이란?? 요 세개의 파일이 있다고 가정해 봅시다. 우리는 아래와 같은 명령어를 통해 실행파일을 만들어낼 수 있습니다. $ g++ -c test1.cpp add.cpp -> test1.o, add.o 파일 생성(오브젝트 파일) $ g++

hwan-shell.tistory.com

나의 makefile

CC = g++-11 --std=c++17
RD = rm -f
DoublyLinkedList.o: DoublyLinkedList.h DoublyLinkedList.cpp
	$(CC) -c DoublyLinkedList.cpp

part1_main.o: part1_main.cpp DoublyLinkedList.h
	$(CC) -c part1_main.cpp

part1_main.out: DoublyLinkedList.o part1_main.o
	$(CC) DoublyLinkedList.o part1_main.o -o part1_main.out

part2_main.o: part2_main.cpp DoublyLinkedList.h
	$(CC) -c part2_main.cpp

part2_main.out: DoublyLinkedList.o part2_main.o
	$(CC) DoublyLinkedList.o part2_main.o -o part2_main.out

clean:
	$(RD) *.o

→ 근데 결론은,, Makefile을 수정하지 않아도 됐더라는 것..! ㅋㅋ
그래두 이제 Makefile 읽을 수 있음
 
1. 일단 첫 번째는 DoublyLinkedList.o를 만들기 위한 코드임.
2. 두 번째는 part1_main.o를 만들기 위한 코드임. 앞에 Make 쳐주면 됨.
 
하지만, 내가 실제로 커맨드로 입력하는 코드는 $make part1_main.out (과제 명세) 임.

3. '$make part1_main.out'는 part1_main.out를 만드는 makefile 문법이 반영된 커맨드임. 이걸 터미널에 입력하면, makefile의 세 번째 코드가 실행됨. 세 번째 코드의 오른쪽 부분을 살피면, "part1_main.out를 만들기 위해서는 DoublyLinkedList.o와 part1_main.o가 필요하다"는 것을 알 수 있음. 이를 위해, 아까 언급한 첫 번째 두 번째 코드가 실행되는 것임.

$(CC) DoublyLinkedList.o part1_main.o -o part1_main.out

- $(CC)에는 g++-11 --std=c++17가 입력됨.

- 첫 번째 두 번째 코드를 통해 생성된 DoublyLinkedList.o와 part1_main.o를 활용하여

- part1_main.out라는 이름의 executable file을 만들어라

 

2. brew install leaks

사랑스러운 leaks를 mac에 설치하는 커맨드임

 

3. 아래 영상을 따라함

https://www.youtube.com/watch?v=bhhDRm926qA

이 영상이 진짜 최고임...
 
+추가 →근데 이거 볼 것도 없음. 위 영상에서 다 설명해줌.
https://stackoverflow.com/questions/59122213/how-to-use-leaks-command-line-tool-to-find-memory-leaks

How to use leaks command-line tool to find memory leaks?

leaks command-line tool will report the address of the leaked memory the size of the leak (in bytes) the contents of the leaked buffer like the following: Process: checker [84357] Path: ...

stackoverflow.com

커맨드라인에 이하를 입력

export MallocStackLogging=1 

→ memory leak과 관련된 모든 log를 터미널창에 출력해주도록 설정하는 것(option)

 
make part1_main.out

executable file 생성

 
leaks --atExit -- ./part1_main.out

현재 디렉토리의 part1_main.out를 실행하는데, memory leaks을 detect하고 그 결과를 보고하라!
 

  • leaks -atExit : tells which leaks exist, but not where any leaked allocation came from
  • MallocStackLogging : creates logs that can tell me where the leaked allocations came from, but the logs are automatically deleted when the program exits, and leaks -atExit runs, obviously, at exit

실행 결과

2 7
1 1
R
L
P 2
L
L
P 3
V
1 2 1 3 
part2_main.out(10555) MallocStackLogging: stack logs deleted from /tmp/stack-logs.10555.1008e8000.part2_main.out.0iRX5O.index
Process 10555 is not debuggable. Due to security restrictions, leaks can only show or save contents of readonly memory of restricted processes.

Process:         part2_main.out [10555]
Path:            /Users/USER/*/part2_main.out
Load Address:    0x10082c000
Identifier:      part2_main.out
Version:         0
Code Type:       ARM64
Platform:        macOS
Parent Process:  leaks [10554]

Date/Time:       2023-10-23 14:19:02.367 +0900
Launch Time:     2023-10-23 14:18:53.129 +0900
OS Version:      macOS 13.1 (22C65)
Report Version:  7
Analysis Tool:   /usr/bin/leaks

Physical footprint:         3585K
Physical footprint (peak):  7601K
Idle exit: untracked
----

leaks Report Version: 4.0, multi-line stacks
Process 10555: 228 nodes malloced for 117 KB
Process 10555: 0 leaks for 0 total leaked bytes.

leaks(10554) MallocStackLogging: stack logs deleted from /tmp/stack-logs.10554.104b18000.leaks.MUDEON.index

0 leaks for 0 total leaked bytes. !!!!

나의 소중한 코드에세서는 다행히 leak이 detect되지 않음...🥰🥰🥰

728x90

+ Recent posts