macOS에서 memory leak 체크하려다
-valgrind는 너무 유용하고 간단한 툴이지만: 리눅스 환경에서만 실행된다는 소식...
-sanitizer는 과제 환경인 g++ 컴파일러가 아닌 clang 컴파일러에서만 실행된다는 소식...
그렇게 알게된 게 'leaks'
macOS에서 valgrind의 역할을 해주는 요긴한 친구다 ❤️
하지만 leaks를 실행하기 위한 코드를 컴파일코드의 '어디'에 넣어야 할지 몰랐고, 이를 이해하면 과제에서 주어진 makefile의 문법을 알아야 했다. 역시 프로그래밍은 성급히 하면 오히려 꼬이고 세 배의 시간이 소요된다는 것.. ㅎㅎ 처음부터 찬찬히 해보니 성공했다!
1. makefile 친숙해지기 (아래링크에서 완벽 정리)
https://hwan-shell.tistory.com/188
나의 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
커맨드라인에 이하를 입력
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되지 않음...🥰🥰🥰
'개발 > c++' 카테고리의 다른 글
[c++] this 포인터 (0) | 2023.11.16 |
---|---|
[디버깅 노트] 메모리 누수를 막으려고... (0) | 2023.10.21 |
[디버깅 노트] null이 된 변수(객체)에는 ... (0) | 2023.10.20 |
[디버깅 노트] 포인터 관련 유의사항 (0) | 2023.10.20 |
[c++] 입력에서 띄어쓰기 (1) | 2023.10.20 |