지난일들/GDB

임베디드 Linux 시스템 기반 다중 프로세스 동시 디버깅을 지원하는 원격 디버거 설계 및 구현

바위맨 2012. 8. 7. 13:36
반응형

[출처]임베디드 Linux 시스템 기반 다중 프로세스 동시 디버깅을 지원하는 원격 디버거 설계 및 구현

  1. 요약
    - 임베디드 리눅스 환경에서 gdb/gdb server를  사용한 원격 디버깅이 가능하지만 개발자의 부가적인 코딩과 추가적인 어려움들로 인해서 불편한 점이 많다. 따라서mgdb와 mgdbserver를 사용해서 리눅스 커널의 변경없이 라이브러리 매핑을 이용한 원격 디버거 제안
  2. 기존 GDB와 gdbserver를 사용한 디버깅 실행 과정
      • 실행에 필요한 과정
        - 새로이 생설될 프로세서에 sleep코드 삽입(스케줄링 되어 수행시에 커널에 의한 종료 방지)
            -> sleep코드 가 실행 되는 경우 발생
            -> 자식 프로세스 정지
            -> 타겟 시스템에서 새로운 gdbserver 실행 및 정지된 프로세스를 자식 프로세스로 설정
            -> ptrace변수에 PT_TRACED값을 설정( 이후 진행될 디버깅을 위해서)
            -> host의 새로운 gdb와 타겟의 gdbserver의 연결
            -> 디버깅 실행

      • 기존 디버깅 방식의 단점
        - 디버깅을 수행해야하는 프로세스의 수 만큼 gdbserver와 gdb가 쌍으로 존재해야한다.

      • 기존 디버깅 방식의 제약
        - 디버깅할 프로세스가 gdbserver의 자식 프로세스여야 한다. 

      • gdbserver의 자식 프로세스여야하는 이유(x86타겟)
        - gdbserver는 ptrace 시스템 콜을 통해서 디버깅 환경을 제공
        - ptrace 시스템 콜의 별수중에 PT_TRACED라는 값이 설정되어 있어야 정지점 예외 발생 시에 프로세스를 종료 시키지 않고 TASK_STOPPED상태로 만들고 제어를 부모 프로세스이 gdbserver로 넘겨 준다. 
        - 만약, 디버깅할 프로세스가 gdbserver의 자식 프로세스가 아닐 경우에는 ptrace의 변수를 설정할 수 가 없기 때문에 SIGTRAP발생시 프로세스를 종료하게 된다.
  3. 원격 디버거 시스템의 구조

    •  mgdbserver의 역활
      1) gdb와 통신을 하며 gdb의 디버깅 요청을 적절한 gdbserver에게 전달하고 디버깅 결과를 다시 gdb에게로 전달하는 교환기의 역활을 한다.
      2) fork시스템 콜에 의해서 새로운 자식 프로세스의 생성시 gdbserver를 생성하고 자동 연결
      ==> 다중 프로세스의 원격 디버깅 시에도 호스트의 터미널이서 gdb를 실행할 필요가 없다.
    •  현재 디버깅 중인 응용 프로그램이 새로운 자식 프로세스를 생성한 경우 
      1) mgddbserver에서  fork실행 으로 기존의 gdbserver를 생성하고 app을 생성 해서 연결 실행(완료)
      2) fork를 통해서 새로운 gdbserver 생성
      3) 새로운App생성 및 새로운 gdbserver와의 연결 실행
      4) ptrace()로 설정 실행
    •  mgdb라이브러리 설계
      - wrapping방식으로 설계
      : glibc 라이브러리 호출 발생시 해당 함수가 실행 되기 전에 mgdb라이브 러리에 있는 함수를 먼저 실행 시킨다.
      -> 커널 에서 시스템콜을 가로챌 경우 유지보수등 여러가지 문제점 발생.

  4. 디버깅 중인 프로세서가 fork의 실행 과정
    1) mgdb라이브러리는 새로 실행되는 프로세스를 정지 시킨후 mgdbserver에 SIGUSR1시그널 전달
    2) mgdbserver는 SIGUSR1을 받아 새로운 gdbserver실행
    3) gdbserver와 새로 생성되어 디버깅을 실행할 프로세스 연결(ptrace시스템콜의 PTRACE_ATTACH인자를 사용)


반응형

'지난일들 > GDB' 카테고리의 다른 글

qemu gdb사용하기  (0) 2014.03.01
QEMU에서 remote gdb의 사용  (0) 2012.08.16
gdb_stub 코드 분석_AT128 시뮬레이션용 코드  (0) 2012.08.10
논문 쓰기  (0) 2012.08.02
GDB stub에 대해서....  (0) 2012.08.02