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 |