gdb 사용에 유용한 명령어 정리
출력시 page 단위로 줄력되는 기능 비활성화
gdb 사용시 한 페이지가 넘어가게 출력되면 다음과 같은 메시지가 출력된다.
(gdb) thread apply all bt
Thread 68 (Thread 0x7f4df9010700 (LWP 5669)):
......
......
---Type <return> to continue, or q <return> to quit---
이때마다 키를 계속 입력해줘야 되는데, pagination 를 off 하여 연속적으로 출력할 수 있다.
(gdb) set pagination off
디버깅 내용 파일로 출력
logging 기능을 이용하여 디버깅 내용을 파일로 출력할 수 있다.
(gdb) set logging on
Copying output to gdb.txt.
(gdb)
logging off 시 파일 출력을 종료한다.
(gdb) set logging off
Done logging to gdb.txt.
(gdb)
logging on 시 파일명을 지정해줄수도 있다.
(gdb) set logging on test.txt
Copying output to test.txt.
(gdb)
print 시 문자열 전체 출력
gdb에서 print 시 문자열이 긴 경우 전부 출력되지 않는다.
(gdb) p str
$1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ...
set print elements 0
을 입력해주면 문자열 출력 길이 제한이 사라져 문자열 전부를 출력할 수 있다.
(gdb) p str
$2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
메모리 주소에 watch point 설정
watch 에 주소값을 입력하여 특정 주소에 값이 변경되는 시점에 break가 되도록 할 수 있습니다.
아래는 stack pointer 에 값이 변경되는 현상을 확인하기 위해 gdb를 이용한 디버깅을 활용한 예시입니다. (작성한 프로그램에서 스택에 값이 변경돠는 현상이 있어서 해당 현상을 분석하려 함)
rsp 는 0x7fff0b68a4d0 주소를 가리키고 있으며 해당 주소의 값은 1이 체워져 있습니다.
해당 주소에 watch를 설정해서 언제 스택의 값이 바뀌는지 확인할 수 있었습니다.
(gdb) x/32x $rsp
0x7fff0b68a4d0: 0x00000001 0x00000000 0x0b68a950 0x00007fff
0x7fff0b68a4e0: 0x00000001 0x00000000 0x0b68a8c0 0x00007fff
0x7fff0b68a4f0: 0x0b68a9a0 0x00007fff 0x00c8fe6c 0x00000000
0x7fff0b68a500: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fff0b68a510: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fff0b68a520: 0x01409db1 0x00000000 0x00570c54 0x00000000
0x7fff0b68a530: 0x00000000 0x00000000 0x63981018 0x00000000
0x7fff0b68a540: 0x0b68a9a0 0x00007fff 0x01409db1 0x00000000
(gdb) watch *0x7fff0b68a4d0
Hardware watchpoint 5: *0x7fff0b68a4d0
(gdb) c
Continuing.
Hardware watchpoint 5: *0x7fff0b68a4d0
Old value = 1
New value = 0
0x00007f7ec2e5da64 in __memset_sse2 () from /lib64/libc.so.6
(gdb) bt
#0 0x00007f7ec2e5da64 in __memset_sse2 () from /lib64/libc.so.6
#1 ....
#2 ....
....
(gdb)
Leave a comment