gdb 사용에 유용한 명령어 정리

1 minute read

출력시 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)

Tags: ,

Categories:

Updated:

Leave a comment