바이너리, 개발 및 디버그 패키지 설치

바이너리, 개발 및 디버그 패키지 설치

배경: 저는 Qt5로 프로그래밍 중이고 GDB를 사용하여 Debian에서 핵심 Qt5 라이브러리를 디버깅하고 싶습니다.

-dev필요한 모든 패키지를 설치했습니다 -dbg. 디버깅하려고 하면 GDB에서 소스 코드를 찾을 수 없다고 불평합니다.

소스 코드를 설치하고 GDB에서 사용하는 방법은 무엇입니까?

답변1

나는 내 자신의 질문에 대답하고 있습니다. 생각보다 어려웠고 모든 정보를 편리한 한 곳에 모아두고 싶었습니다.

바이너리, 개발 및 디버그 패키지 설치

이는 apt( 또는 aptitude)를 사용하여 수행할 수 있습니다.

Qt5의 예:

  • 컴파일된 라이브러리:qt5-default
  • 개발 패키지(헤더):qtbase5-dev
  • 디버깅 기호:qtbase5-dbg

소스 패키지 이름 찾기

aptitudeDebian 패키지 검색 도구를 사용하여 찾을 수 있습니다 :https://www.debian.org/distrib/packages#search_packages

예: 검색하면 다음이 검색 qtbase5-dbg됩니다.https://packages.debian.org/jessie/qtbase5-dbg

각 바이너리 패키지 페이지 상단에는 소스 패키지에 대한 링크가 있습니다.

예:qtbase-opensource-src

소스 패키지 설치

필요한 경우 먼저 apt다음 답변을 읽고 소스 패키지 저장소를 구성하십시오.https://unix.stackexchange.com/a/121042/29414

  1. 루트 삭제:su -
  2. cd /usr/src
  3. apt-get source ${source_package_name}
    • 예:apt-get source qtbase-opensource-src
  4. 소스 패키지를 다운로드하고 압축을 풀고 새 디렉터리에 패치합니다.
    • 예:/usr/src/qtbase-opensource-src-5.3.2+dfsg/
  5. 다운로드한 TAR 공 및 기타 파일(아마도 .dsc)을 삭제합니다.
    rm *.tar.* *.dsc
  6. 심볼릭 링크를 생성합니다:ln -s qtbase-opensource-src-5.3.2+dfsg qtbase-opensource-src

GDB 구성

(이 부분은 루트가 아닌/일반 계정을 사용하여 수행할 수 있습니다.)

소스 코드를 찾을 수 있는 위치를 알 수 있도록 GDB를 구성해야 합니다.

소스 패키지마다 조금씩 다르기 때문에 Qt5를 예로 들어보겠습니다.

  1. cd /usr/src/qtbase-opensource-src/src
  2. 소스 하위 디렉터리 목록을 찾습니다.
    find $(pwd) -mindepth 1 -maxdepth 1 -type d
    • 예:/usr/src/qtbase-opensource-src/src/corelib ...
  3. findGDB 명령을 생성하려면 출력 형식을 다시 지정하십시오 .
    find $(pwd) -mindepth 1 -maxdepth 1 -type d | sort | xargs -l -i printf -- 'directory %s\n' "{}"
    • 예:directory /usr/src/qtbase-opensource-src/src/3rdparty ...
  4. 편의를 위해 GDB 명령을 파일에 삽입하십시오 ~/.gdbinit.

샘플 ~/.gdbinit:

set auto-load safe-path /
set history save
set history filename ~/.gdb_history

directory /usr/src/qtbase-opensource-src/src/3rdparty
directory /usr/src/qtbase-opensource-src/src/android
directory /usr/src/qtbase-opensource-src/src/angle
directory /usr/src/qtbase-opensource-src/src/concurrent
directory /usr/src/qtbase-opensource-src/src/corelib
directory /usr/src/qtbase-opensource-src/src/dbus
directory /usr/src/qtbase-opensource-src/src/gui
directory /usr/src/qtbase-opensource-src/src/network
directory /usr/src/qtbase-opensource-src/src/opengl
directory /usr/src/qtbase-opensource-src/src/openglextensions
directory /usr/src/qtbase-opensource-src/src/platformsupport
directory /usr/src/qtbase-opensource-src/src/plugins
directory /usr/src/qtbase-opensource-src/src/printsupport
directory /usr/src/qtbase-opensource-src/src/sql
directory /usr/src/qtbase-opensource-src/src/testlib
directory /usr/src/qtbase-opensource-src/src/tools
directory /usr/src/qtbase-opensource-src/src/widgets
directory /usr/src/qtbase-opensource-src/src/winmain
directory /usr/src/qtbase-opensource-src/src/xml
show directories

GDB 실행

이 섹션에서는 관심 있는 라이브러리(예: Qt5)에 연결된 디버깅 기호로 컴파일된 프로그램이 이미 있다고 가정합니다.

  1. gdb ${program_name}
  2. 프로그램을 시작하고 main()자동으로 중단합니다.start
  3. 라이브러리 함수에 중단점 설정: 작은따옴표가 있는 b '${function_signature}'
    명령은 b(reakpoint)탭 완성을 지원합니다(매우 인상적입니다!).
    • 예: b 'QStyled<tab>
      -> b 'QStyledItemDelegate
      -> ::paint(<tab>
      ->b 'QStyledItemDelegate::paint(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const'
  4. 계속해서 새 중단점을 설정합니다. c또는continue
  5. 라이브러리 중단점에 도달하면 GDB는 소스 코드를 찾아 표시합니다.

관련 정보