배경: 저는 Qt5로 프로그래밍 중이고 GDB를 사용하여 Debian에서 핵심 Qt5 라이브러리를 디버깅하고 싶습니다.
-dev
필요한 모든 패키지를 설치했습니다 -dbg
. 디버깅하려고 하면 GDB에서 소스 코드를 찾을 수 없다고 불평합니다.
소스 코드를 설치하고 GDB에서 사용하는 방법은 무엇입니까?
답변1
나는 내 자신의 질문에 대답하고 있습니다. 생각보다 어려웠고 모든 정보를 편리한 한 곳에 모아두고 싶었습니다.
바이너리, 개발 및 디버그 패키지 설치
이는 apt
( 또는 aptitude
)를 사용하여 수행할 수 있습니다.
Qt5의 예:
- 컴파일된 라이브러리:
qt5-default
- 개발 패키지(헤더):
qtbase5-dev
- 디버깅 기호:
qtbase5-dbg
소스 패키지 이름 찾기
aptitude
Debian 패키지 검색 도구를 사용하여 찾을 수 있습니다 :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
- 루트 삭제:
su -
cd /usr/src
apt-get source ${source_package_name}
- 예:
apt-get source qtbase-opensource-src
- 예:
- 소스 패키지를 다운로드하고 압축을 풀고 새 디렉터리에 패치합니다.
- 예:
/usr/src/qtbase-opensource-src-5.3.2+dfsg/
- 예:
- 다운로드한 TAR 공 및 기타 파일(아마도
.dsc
)을 삭제합니다.rm *.tar.* *.dsc
- 심볼릭 링크를 생성합니다:
ln -s qtbase-opensource-src-5.3.2+dfsg qtbase-opensource-src
GDB 구성
(이 부분은 루트가 아닌/일반 계정을 사용하여 수행할 수 있습니다.)
소스 코드를 찾을 수 있는 위치를 알 수 있도록 GDB를 구성해야 합니다.
소스 패키지마다 조금씩 다르기 때문에 Qt5를 예로 들어보겠습니다.
cd /usr/src/qtbase-opensource-src/src
- 소스 하위 디렉터리 목록을 찾습니다.
find $(pwd) -mindepth 1 -maxdepth 1 -type d
- 예:
/usr/src/qtbase-opensource-src/src/corelib ...
- 예:
find
GDB 명령을 생성하려면 출력 형식을 다시 지정하십시오 .find $(pwd) -mindepth 1 -maxdepth 1 -type d | sort | xargs -l -i printf -- 'directory %s\n' "{}"
- 예:
directory /usr/src/qtbase-opensource-src/src/3rdparty ...
- 예:
- 편의를 위해 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)에 연결된 디버깅 기호로 컴파일된 프로그램이 이미 있다고 가정합니다.
gdb ${program_name}
- 프로그램을 시작하고
main()
자동으로 중단합니다.start
- 라이브러리 함수에 중단점 설정: 작은따옴표가 있는
b '${function_signature}'
명령은b(reakpoint)
탭 완성을 지원합니다(매우 인상적입니다!).- 예:
b 'QStyled<tab>
->b 'QStyledItemDelegate
->::paint(<tab>
->b 'QStyledItemDelegate::paint(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const'
- 예:
- 계속해서 새 중단점을 설정합니다.
c
또는continue
- 라이브러리 중단점에 도달하면 GDB는 소스 코드를 찾아 표시합니다.