출처:
https://en.wikipedia.org/wiki/GNU_Debugger
http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/1/ulimit
사실 GDB 자체는 cygwin을 통해 윈도우에서도 쓸 수 있고,
프로그램 언어에서도 Java 등도 디버깅 할 수 있다고 한다.
그러나 내가 GDB를 쓸 곳은 리눅스에서 C언어 소스를 만질 때이기 때문에 카테고리는 여기로 두겠다.
(이상하게 자바는 윈도우에서, C는 리눅스에서 작업하는 것을 선호하게 된다.
사실 운영체제 때문이라기 보단 그 운영체제에서 돌아가는 툴 때문이겠지만.)
애초에 이걸 알게된 것이 앞에 포스팅한 세그멘테이션 오류 때문이기도 하고.
1. 코어 파일을 남기기 위해서는 먼저 다음과 같은 명령어를 입력하여
코어 파일을 남기는 설정이 필요하다.
ulimit -c unlimited
ulimit는 bash 쉘에서의 명령어로 시스템 자원의 제한값을 조정한다.(쉘마다 명령어가 다를 수 있다.)
-c 옵션은 코어에 대한 옵션.
unlimited는 영어 읽어보면 알겠지만 제한을 걸지 않겠다는 뜻이다.
참고로 현재 시스템 제한 상황을 보려면 ulimit -a로 보면 된다.
2. 그리고 소스를 컴파일 하기 전에 -g 옵션으로 디버깅을 할 수 있게 해야 한다.
gcc -g -o 실행파일명 소스파일명.c
3. 컴파일 후 실행 파일을 실행하여 에러가 나 코어가 생성되면 다음과 같은 명령어를 입력한다.
gdb ./실행파일명 ./core
코어 파일명은 무슨 규칙이 있는지 모르겠다.
내가 본 블로그에서는 무슨 숫자값도 붙던데, 정작 내가 해보니 core하고 아무것도 안 붙은 채
깔끔하게 나왔다.
그러면 gdb에서 어디에서 오류가 났는지 알려줄 것이다.
그리고 이하는 gdb 명령어.
사실 요건 이전에회사에 있을 떄 안드로이 라이브러리를 디버깅하면서 알고 있었다.
· help : 명령어나 토픽의 리스트를 출력
· quit/q : gdb 종료
· list : 지금 실행된 코드의 주변에 있는 라인들을 보여줌
· print : 변수 값 출력
· backtrace/bt : 현재의 위치와 Stack Trace를 출력(어디에서 이 함수가 불러졌나 뭐 그런 개념)
· break/b : 브레이크포인트 설정
· info breakpoints : 모든 브레이크포인트와 워치포인트를 보여줌
· kill : 실행중인 프로세스를 중단
· delete : 브레이크포인트 제거
· next : 다음 줄로 가기. 함수를 만나면 함수 다음 줄로 넘어감
· step : 한 단계 더 나아감. 함수를 만나면 그 함수 안으로 들어갑
· continue/c : 실행 계속
· detach : 디버깅 종료
근데 막상 이 툴까지 써봤는데 오류를 못 잡아서 결국 윈도우로 넘어와 CL로 컴파일 하고 나서야
오류를 찾을 수 있었다.
그 오류의 원인은 앞 포스트에도 말했지만 "="을 "-"로 잘못 친 것.
결론은 툴이 암만 좋아도 기반지식이 후달리면 헤메기 쉽다는 것.