목록programming/Debugging (7)
관심있는 것들 정리
예전 Redhat 관련해서 국내에서 사용되었던 알짜리눅스 사용할 때는 기본적으로 프로그램이 동작하다가 죽으면 core 파일이 생성되었고 이를 이용해 gdb를 통해서 debugging을 할 수 있었는데, 언젠가부터 리눅스 배포판 작업시 segmentation fault 등이 발생하였을 때 core 파일이 생성되지 않는다... 이유는 아마도 보안 문제일 듯 싶은데, 프로그램 작성시 core 파일은 상당히 유효한 정보이므로 이를 생성할 수 있도록 다음과 같이 설정이 가능하다 * 현재 core 파일이 생성되는지 확인 방법 > ulimit -c 위 명령을 통해 core 파일이 생성될 때의 core 파일의 크기를 체크할 수 있다. 만약 결과값이 0 이라면, core 파일이 생성되지 않는다. * core 파일 생성되..
gdb의 breakpoint 설정 방법 중 자주쓰는 사용법: break(또는 b) break(또는 b) 함수이름 break(또는 b) 라인번호 break(또는 b) 파일이름:라인번호 break(또는 b) 파일이름:함수이름 break(또는 b) +오프셋 break(또는 b) -오프셋 break(또는 b) *주소 간단한 것들 말고 헷갈릴 만한 것에 대해 설명하면 다음과 같다. b +오프셋 : 현재 멈춰있는 위치에서 오프셋 라인 만큼 뒷 라인에 breakpoint가 설정됨 b -오프셋 : 현재 멈춰있는 위치에서 오프셋 라인 만큼 앞 라인에 breakpoint가 설정됨 b *주소: 실행되는 이미지의 주소 영역을 breakpoint로 설정 shared library를 명시하기를 원할 경우 b -shlib shar..
gdb에서 backtrace를 이용하면 stack frame의 정보를 출력하는 것이 가능하다. 사용법: backtrace (또는 bt) : 모든 backtrace를 표시 backtrace N (또는 bt N) : 처음(innermost) N개의 frame만 표시 backtrace -N (또는 bt -N) : 마지막 (outermost) N개의 frame만 표시 backtrace와 함께 full qualifier가 함께 사용되면 local 변수들도 함께 출력됨 예: backtrace full (또는 bt full)
gdb에서 레지스터 출력하는 명령 info regsters 또는 info reg Macbook에서 실행한 예는 다음과 같음 rax 0x100000e584294970968 rbx 0x00 rcx 0x7fff5fbffb38140734799805240 rdx 0x7fff5fbffa98140734799805080 rsi 0x7fff5fbffa88140734799805064 rdi 0x11 rbp 0x7fff5fbffa600x7fff5fbffa60 rsp 0x7fff5fbffa600x7fff5fbffa60 r8 0x9dbad16165391638 r9 0x00 r10 0x12004608 r11 0x206518 r12 0x00 r13 0x00 r14 0x00 r15 0x00 rip 0x100000e980x100000..
gdb의 print 명령의 설명은 다음과 같다. (gdb) help print Print value of expression EXP. Variables accessible are those of the lexical environment of the selected stack frame, plus all those whose scope is global or an entire file. $NUM gets previous value number NUM. $ and $$ are the last two values. $$NUM refers to NUM'th value back from the last one. Names starting with $ refer to registers (with the value..
visual C++을 쓰면 마우스 버튼만으로 간단히 디버깅을 할 수 있지만 gdb를 쓸 경우는 step, next, continue를 직접 입력해야만 한다. 사용법은 다음과 같다. * step 사용법 step(또는 s) * next 사용법 next(또는 n) * continue 사용법 continue(또는 c) 회수 여기서 회수는 break를 몇번 건너뛸 것인지 수를 지정