반응형

출처: 

https://en.wikipedia.org/wiki/GNU_Debugger

http://blog.pages.kr/169

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로 컴파일 하고 나서야

 오류를 찾을 수 있었다.

그 오류의 원인은 앞 포스트에도 말했지만 "="을 "-"로 잘못 친 것.


결론은 툴이 암만 좋아도 기반지식이 후달리면 헤메기 쉽다는 것.

반응형
Posted by 애콜라이트
l

free counters