gdb

markyang92·2022년 9월 21일
0
post-thumbnail
  • GDB: GNU 디버거

-g 옵션

  • gcc에 디버깅 심볼을 넣으려면 -g, -ggdb 옵션을 사용해 컴파일한다.
    • -g 옵션에 레벨이 있는데, default: -g2
-g<level>description
0디버깅 정보를 전혀 생성하지 않으며, -g 옵션을 안 쓴 것과 동일 = strip
1backtrace를 생성할 수 있을 정도의 함수명과 외부 변수를 포함한 최소한의 정보를 생성
2소스레벨 디버깅과 단일 단계별 코드 분석을 수행할 수 있도록, 로컬 변수, 행 번호에 대한 정보를 포함한다.
3GDB가 매크로 확장(#define)을 올바르게 처리하는지에 대한 추가 정보가 포함

코드 최적화레벨

  • 컴파일러 최적화는 소스 코드와 머신 코드의 관계를 파괴하는 경향이 있어, 소스를 단계적으로 실행했을 때 결과를 예측할 수 없게한다.
    • 위 문제 발생 시, -O 컴파일 스위치를 제외해 최적화 없이 컴파일
  • GDB가 현재의 함수를 호출할 때까지의 backtrace를 생성할 때 필요한 SP와 연관된 문제가 있다.
    일부 아키텍처에서는 gcc가 높은 수준의 최적화 (-O2 이상) 을 갖는 경우 SP를 생성하지 않는 경우가 있기 때문에 만약 -O2로 컴파일할 수 밖에 없는 상황에서, backtrace를 해야한다면,
    • -fno-omit-frame-pointer를 사용해, 기본 동작을 오버라이드 해야한다.
      • -fno-omit-frame-pointer가 추가되어 프레임 포인터를 삭제하도록 최적화 된 코드가 있는지 살펴보자.
      • 만약 존재시 이 부분은 일시적으로 제거하는 것이 좋다.

디버그 심볼

  • 디버그 심볼실행 파일의 크기를 엄청 증가시킨다.
    • --strip-all: (기본 값) 모든 심볼 제거
      • 응용프로그램, 공유 라이브러리의 경우에는 괜찮지만, kernel module의 경우, 모듈 로딩을 중지하게 된다.
        따라서, --strip-unneeded를 사용할 것
    • --strip-unneeded: relocation 프로세스에 필요하지 않은 심볼 제거
    • --strip-debug: 디버그 심볼만 제거

gdbserver

  • TARGET 보드에, gdbserver 가 설치 되어 있어야한다.또한 gdbserverTARGET 보드 위에서 실행 중인 program 실행 제어를 한다.
  • gdbserver는 네트워크 연결이나, 시리얼 통신으로 Host(native)에서 실행되는 gdb를 연결하는 것이다.
  1. 디버그 세션을 시작할 때, gdbserver를 사용해 Target 보드에서 디버깅하려는 program을 로드한 후, Host(native)의 cross toolchain에서 gdb를 별도로 로드해야한다.
  2. Host(native)gdb <-> Target gdbserver는 디버그 세션이 시작되기 전에 '서로 연결'되어 있어야한다.
  3. 특히 shared library의 경우, Host(native)머신에서 실행되고 있는 gdb디버그 심볼, 소스 코드를 어디에서 찾을지 미리 알고 있어야한다.
  4. (gdb) run 명령이 평소, Host(native)에서 했던대로 되지 않는다. 또한, gdb + gdbserverHost(native)에서 직접 gdb를 실행할때 지원되는 모든 기능을 지원하지는 않는다.
    예를 들어, gdbserverHost(native) gdb와는 달리, fork 후, 자식 프로세스를 따라 갈 수 없다!
  5. 디버그 세션이 끝나면, gdbserver가 종료 되므로, 다른 디버그 세션을 원하면, gdbserver를 재시작해야한다.
  6. 디버깅할 바이너리에 대한 디버그 심볼, 소스 코드Host(native)에서 필요하지만, Target에서는 '필수 사항'이 아니다.
  7. gdb, gdbserver가 다른 버전이거나 동일한 버전이지만 다르게 configure가 된 경우, 이상한 동작을 할 수 있다.
    그러므로, 원하는 빌드 툴을 사용해 같은 소스에서 둘 모두를 빌드하는 것이다.

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글