본문 바로가기

42 Seoul

맥 디버깅 관련

vmmap

메모리맵 확인 도구 

% vmmap --wide [pid]

https://jvns.ca/blog/2018/01/26/mac-memory-maps/

 


 

ctags

함수가 정의된 위치를 찾아가기 위한 도구

맥에 기본으로 깔린 ctags는 -R옵션도 사용할 수 없다. brew로 설치해야함

brew install ctags
echo 'alias ctags="`brew --prefix`/bin/ctags"' >> ~/.zshrc
source ~/.zshrc

% ctags -R : tags 폴더가 생성되며 최하위 디렉터리까지 가져옴

ctrl + ] : 함수 찾아가기

ctrl + t : 밖으로 나오기 

 


 

lldb

디버거

gcc 컴파일 시 -g옵션을 사용하면 dSYM파일이 생기며 c 코드를 볼 수 있게 된다. 사용하지 않으면 어셈으로 디버깅됨

-fsanitize=address 옵션을 같이 사용하면 어디에서 에러가 발생했는지 확인하기 쉬워짐

.lldbinit 파일에서 미리 세팅해둘 수 있음

 

- 디버깅 심볼파일 직접 추가

add-dsym [폴더.dSYM]

 

 

- 소스코드 확인

list [함수명/파일명]

list main.c:20   -> main.c 파일 20번째줄부터 출력

dis : 현재 위치에서 디스어셈블

(lldb) dis -n [함수명]

-s의 위치부터 -c개 만큼의 명령어를 disassemble

(lldb) dis -s 0x1eb8 -c 20

현재 프레임 코드를 소스코드와 함께 디스어셈블. disassemble --frame --mixed

(lldb) dis -f -m 

현재 코드를 소스코드와 함께 확인

(lldb) dis -l

 

 

- 실행명령

run "arg" ... : 프로그램 실행. 실행인자를 전달할 수 있음 (argv)

c : continue. 다음 브레이크 포인트까지 실행

finish : 함수를 빠져나올때까지만 실행

s : step into. 

n : step over (next). call명령을 만나도 들어가진 않음

si : step into (instruction). 어셈 명령어 단위에서 스텝인투

ni : 마찬가지로 어셈 명령어 단위에서 스텝오버

 

jump -by -5 : 5줄 이전으로 강제 이동

jump [address] : 주소로 강제 이동

return 0 : 현재 함수의 리턴값을 0으로 세팅후 리턴

 

 

- breakpoint

브레이크포인트 리스트 확인 (=br l)

(lldb) b

메모리주소로 브레이크포인트 걸기

(lldb) b *0x100003f2c

main.c 7번째 줄에 걸기(함수도 가능)

(lldb) b main.c:7

브레이크포인트 제거. 번호를 지정하지 않으면 전부삭제

(lldb) br del [번호]

breakpoint modify. test라는 변수 값이 5가 될때 break되도록 조건걸기

(lldb) br m -c "test == 5"

 

 

- watchpoint 

(lldb) wa l

watchpoint set variable test. 테스트라는 변수의 값이 변할때마다 브레이크

(lldb) wa s v test

(lldb) watchpoint modify -c "global == 5" 

 

 

- 값 확인 

fr v [변수명] : frame variable. 지역변수 출력. 변수명 없으면 전체출력

fr v -f x [변수명] : frame variable format hex

ta v [변수명] : target variable. 전역변수, 스태틱변수 출력

 

p [변수명]

p/x 20 : 16진수로 출력 (t: 2진수, o: 8, d: signed 10, u: unsigned 10, c, f, a:가장 가까운 심볼오프셋)

p (char)65 : 문자로 형변환해서 출력

 

변수이름이 중복될때

p 'file name.c'::[variable]

p [function]::[variable]

 

메모리 값 출력 16개를 x형식으로 출력

(lldb) x/16x 0x100003f64 

x/[범위][출력format][단위]
x/[범위][단위][출력format]

단위 : b(1byte) h(2byte) w(4byte) g(8byte)

포맷 : t o d u c f ... print명령과 같음

 

- 레지스터, 메모리 읽기 쓰기

register read [레지스터명] : 레지스터 값 출력. 이름없이 사용하면 전체 레지스터 출력

register write [레지스터명] [값] : 레지스터에 값 입력

 

memory read [위치]

memory write [위치] [값]

 

레지스터 값에 접근해서 데이터 출력

(lldb) x/10xw $sp

 

 

- 훅 등록

display var1 var2 : 멈출때마다 var1, var2 변수 출력

 

`frame variable argc argv` stop hook을 등록하기

(lldb) target stop-hook add --one-liner "frame variable argc argv"

`main` 함수 안에서 멈추면 argc, argv 내용을 출력하기

(lldb) target stop-hook add --name main --one-liner "frame variable argc argv"

C 클래스 이름인 MyClass 안에서 멈추면 *this 변수 내용을 출력하기

(lldb) target stop-hook add --classname MyClass --one-liner "frame variable *this"

 

Multiple Line Hook

(lldb) target stop-hook add

> bt

> disassemble --pc

> DONE

 

 

- 기타

bt : 백트레이스 명령어

image list : 공유라이브러리 출력(dylib)

script [python script] : 파이썬 스크립트 사용가능

p var1=(char *)123456 : 변수 값 직접 변경

 

 

'42 Seoul' 카테고리의 다른 글

부동소수점  (0) 2021.06.20
유니코드 write 함수로 출력  (0) 2021.06.15
C 언어 가변인자 사용법  (0) 2021.06.12
ft_printf  (0) 2021.06.07
Ruby on Rails - 여러 기능이 있는 페이지 만들기  (0) 2021.06.07