코드 디버깅 능력은 프로그래머와 사이버 보안 전문가 모두에게 중요하며, 이를 통해 프로그램의 내부 작동을 근본적인 수준에서 파악하고 잠재적인 문제를 식별할 수 있기 때문입니다. 이러한 숙련도는 문제를 해결하거나 소프트웨어 시스템의 안정성을 보장할 때 매우 유용할 수 있습니다.
GNU 디버거(일반적으로 GDB라고 함)는 오랜 시간 동안 개발자들의 신뢰를 받아온 지속적인 디버깅 유틸리티입니다. Linux 시스템에서 이 다용도 도구를 활용하려면 다음 단계를 따르세요:
샘플 프로그램 준비
GDB의 기능을 조사하기 위해서는 실험을 수행할 실행 파일이 필요합니다. 예를 들어, 해당 소스 코드 및 디버그 심볼과 함께 제공되는 키 검사 애플리케이션과 화면에 메시지를 표시하는 멀티 스레드 프로그램, 그리고 C 프로그래밍 언어를 사용하여 생성되고 GNU C 컴파일러를 사용하여 컴파일된 두 개의 개별 프로그램에서 GDB를 실행해 보겠습니다.
다른 C 컴파일러를 사용하여 프로그램을 컴파일하는 경우 프로세스 중에 생성된 실행 파일을 제거하지 않는 것이 중요합니다.
GDB를 사용할 때는 개인이 자신의 코드베이스에서 실행하는 것이 일반적입니다. 이 프로세스를 용이하게 하려면 `g` 플래그와 함께 `gcc`를 사용하여 프로그램을 컴파일하면 효과적인 디버깅 세션에 필요한 디버그 심볼을 생성합니다.
디버깅 심볼이나 내부 작동에 대한 광범위한 정보 없이 고도로 최적화된 실행 파일을 효과적으로 분석하려면 디스어셈블된 코드를 자세히 살펴보고 Linux 환경 내에서 메모리 관리의 복잡성을 이해해야 합니다. 이 프로세스를 수행하려면 어셈블리 언어에 대한 고급 이해와 프로세서 스택 및 레지스터 내의 데이터 구성에 대한 친숙함이 필요합니다.
GDB에서 프로그램 실행하기
GNU 디버거(GDB)를 통해 프로그램을 실행하는 방법에는 크게 두 가지가 있습니다. 첫 번째 방법은 터미널에 “gdb
명령줄 매개변수가 필요한 경우 프로그램이 올바르게 동작하려면 명령줄을 통해 프로그램을 호출할 때 프로그램 제목 뒤에 해당 매개변수를 포함시켜야 합니다.
gdb <program>
run <args>
이 백서의 저자는 [개념]에 대한 우리의 이해에 상당한 기여를 했습니다. 연구를 통해 이 분야의 새로운 통찰력과 과제를 발견하여 향후 이 분야의 연구를 이끌었습니다. 이 연구 결과는 [관련 분야]에 접근할 때 [주요 특징]을 고려하는 것의 중요성과 [기타 관련 주제]를 기존 방법에 통합할 경우 얻을 수 있는 잠재적 이점을 보여줍니다. 전반적으로 이 작업은 해당 분야의 추가 탐색 및 개발을 위한 귀중한 토대를 제공합니다.
gdb
file <program>
run <args>
GDB로 중단점 설정하기
디버깅에는 코드 내에 수동 중단 또는 “중단점”을 설정하여 특정 지점에서 프로그램 진행을 중단하는 것이 포함됩니다. 이를 통해 각 실행 단계가 관련 데이터와 변수에 미치는 영향을 면밀히 조사하고 분석할 수 있습니다.
디버그 기호가 포함된 소프트웨어 애플리케이션을 디버깅하기 위해 GNU 디버거(GDB)를 사용할 때 특정 함수의 제목을 통해 식별하거나 코드베이스 내에서 특정 줄 번호를 지정하여 중단점을 설정하는 옵션이 있습니다. 해당 명령 구조는 다음과 같습니다:
break main
break 47
현재 디버깅 세션의 중단점을 관찰하려면 다음 명령을 입력하세요:
info breakpoints
문서에서 북마크된 특정 지점 또는 모든 지점을 제거하려면 “삭제” 명령어를 입력한 다음 적절한 작업을 수행하면 됩니다. 중단점을 하나만 지우려면 “삭제
delete 2
delete 3-5
GDB를 사용하여 조건부 중단점을 만들려면 프로그램 실행을 일시 중지하기 위해 충족해야 하는 특정 조건을 지정할 수 있습니다. 이 조건에는 변수 값의 변경이나 특정 함수가 제대로 실행되지 않는 경우가 포함될 수 있습니다. 이러한 중단점을 설정하는 구문은 중괄호 안에 원하는 조건을 지정하고 이를 중단점 명령의 일부로 통합하는 것입니다.
break <location> if n == 2
중단점이 발생한 후 프로그램 실행을 다시 시작하려면 “계속” 명령을 사용합니다.
continue
코드 단계별 실행
컴퓨터 프로그램의 실행을 한 줄씩 살펴보는 것은 프로그램이 처리하는 정보에 대한 작동을 이해하는 데 필수적입니다. 소프트웨어 내에서 여러 기능의 진행 상황을 추적하고 각 단계에서 데이터의 상태를 관찰함으로써 프로그램이 소스 코드에 인코딩된 원칙을 어떻게 수행하는지 더 깊이 이해할 수 있습니다.
GDB는 사용자가 시스템 오류를 분석하고, 근본적인 원인을 파악하고, 프로그램 실행을 최대한 정확하게 한 줄씩 추적할 수 있도록 하여 디버깅을 위한 포괄적인 솔루션을 제공합니다. 이 디버거는 제어된 중단점, 감시점 명령, 고급 데이터 조작 기법 등 세 가지 주요 코드 단계별 방법을 제공합니다.
GDB의 “step” 명령을 사용하면 소스 코드의 각 줄을 순차적으로 진행하여 전체 코드를 종합적으로 검사할 수 있습니다.
“next” 명령을 사용하면 지정된 함수 내의 후속 줄을 순차적으로 실행하고 그 이후에는 종료할 수 있습니다. 이 명령을 사용할 때 함수는 단일 개체로 간주되므로 함수 호출 전에 “다음”을 실행하도록 선택하면 해당 함수 전체가 단독 명령으로 취급되는 반면 “단계” 명령은 이와 관련하여 다르게 동작한다는 점에 유의해야 합니다.
‘finish’ 명령의 완료는 해당 함수 내에서 미결 명령을 모두 실행한 후 작동을 중단하는 것을 포함합니다.
변수 검사하기
GDB를 사용하여 프로그램을 디버깅할 때 코드가 실행되는 동안 변수의 값이 변하는 것을 검사하는 것이 도움이 될 수 있습니다. 이를 위해서는 검사할 변수의 이름 뒤에 “print” 명령을 사용해야 합니다. 이 작업의 구문에는 정보가 있는 위치에 따라 메모리 또는 레지스터 내에서 변수의 위치를 지정하는 것이 포함됩니다. 이 접근 방식을 통해 개발자는 프로그램이 데이터를 조작하는 방식에 대한 통찰력을 얻고 잠재적인 개선 또는 최적화에 대한 정보에 입각한 결정을 내릴 수 있습니다.
print <variable>
특정 컨텍스트 내에서, 특히 반복 또는 루프 중에 특정 변수의 가치의 동적 변화를 인쇄하려면 ‘디스플레이’ 기능을 활용합니다.
display <variable>
감시점 설정
감시점과 조건부 중단점은 프로그램 내의 변경에 반응하기 때문에 서로 밀접하게 연결되어 있습니다. 특히, 워치포인트는 소스 코드 내에서 발견된 데이터의 수정 사항을 모니터링하는 역할을 합니다. 예를 들어, 특정 변수의 가치가 변경될 때마다 프로그램이 일시 중지되기를 원할 수 있습니다. 개발자가 디버깅 작업에 널리 사용하는 강력한 도구인 GDB를 활용하면 이 기능을 구현할 수 있습니다.
watch <variable_name>
GDB를 사용한 스레드별 디버깅
멀티 스레드 애플리케이션을 개발할 때 GDB는 개별 스레드에서 디버그 작업을 수행할 수 있는 기능을 제공합니다.이 기능을 설명하기 위해 동시 메시지를 생성하고 표시하는 데 사용되는 여러 개의 스레드를 갖춘 기본 C 프로그램을 살펴보겠습니다.
애플리케이션의 실행 컨텍스트 내에서 진행 중인 스레드를 살펴보기 위해 “정보” 명령을 사용하세요.
info threads
사용 가능한 스레드 목록에서 특정 스레드를 선택하려면 해당 인덱스 번호를 식별하고 해당 정보를 활용하여 원하는 스레드에 액세스해야 합니다. 이 과정에는 추가 조작 또는 분석을 위해 선택한 스레드와 관련된 관련 데이터를 검색하는 작업이 포함됩니다.
thread 2
특정 실행 스레드를 선택하면 앞서 예시한 대로 단계, 다음 및 마침 명령을 사용하여 스레드를 진행할 수 있습니다.
GDB를 사용한 원격 디버깅
다른 장치에서 실행 중인 애플리케이션의 원격 디버깅을 용이하게 하려면 해당 특정 시스템에서 gdbserver 애플리케이션을 구성해야 합니다. 이 프로세스는 운영 체제에 사전 설치된 패키지 관리 유틸리티 또는 컴퓨터에 추가된 추가 패키지 관리자를 통해 실행할 수 있습니다.
우분투 또는 데비안을 기본 운영 체제로 사용하는 시스템에 gdbserver를 설치하려면 고급 패키지 도구(APT)를 사용할 수 있습니다.
sudo apt install gdbserver
바이너리를 설치한 후 설치 디렉토리로 이동하여 특정 명령을 실행하면 해당 위치에서 gdbserver의 작동을 시작할 수 있습니다.
gdbserver <ip>:<port> <binary>
GDB 서버와 클라이언트 간의 연결을 설정하는 과정에는 여러 단계가 포함됩니다. 먼저 GDB 서버는 지정된 포트를 통해 승인을 반환하여 준비 상태를 확인해야 합니다. 그 후 클라이언트 측에서 GDB가 시작되고 ‘target’ 명령을 통해 원격 서버에 연결됩니다.
target remote <server_ip>:<port>
디버깅 자동화를 위한 GDB 스크립트 작성
GDB 스크립팅을 사용하면 개발자가 디버깅 세션 중에 자동으로 실행되는 맞춤형 GDB 명령 시퀀스를 작성할 수 있습니다. 이를 통해 동일한 코드 섹션을 검사하는 반복적인 인스턴스에서 중단점을 반복적으로 설정하고, 코드를 탐색하고, 변수 값을 출력할 필요가 없어 디버깅 프로세스가 간소화됩니다. GDB 스크립트를 활용하면 이러한 모든 단계를 효율적으로 자동화하여 귀중한 시간과 노력을 절약할 수 있습니다.
주어진 텍스트는 직장에서 생산성과 성공을 촉진하기 위해 동료들과 긍정적인 관계를 유지하는 것이 중요하다는 것을 강조하는 간결한 글입니다.자신이 대접받고 싶은 대로 다른 사람을 대하고, 동료에 대한 험담이나 부정적인 말을 피하고, 팀원을 지지하고, 개인의 강점과 공헌을 인정하고, 함께 성과를 축하하는 것이 중요하다는 점을 강조합니다. 이러한 태도를 함양함으로써
set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit
위의 코드 스니펫은 GNU 디버거(GDB)에 로깅 기능을 활성화하고 생성된 로그를 “sample.out”이라는 파일에 저장하도록 지시합니다. 또한 디버깅 중인 프로그램의 기본 함수 내에 중단점을 설정합니다.
은 백트레이스를 시작하여 문제의 원인을 찾고, “N” 변수 값을 표시하고, 프로그램 실행을 진행하고, 작업을 종료하고, 세션을 종료합니다. 기본적으로 GDB의 순서는 문제의 원인을 추적하고, “N” 변수의 내용을 표시하고, 프로그램 진행을 계속하고, 작업을 종료하고, 디버깅 프로세스를 종료하는 순서로 이루어집니다.
이 Python 스크립트를 실행하는 명령은 “python3
gdb -x <script> <binary>
이제 GDB로 프로그램을 디버깅하는 방법을 알았습니다!
GDB 디버깅은 기술 역량을 강화하는 중요한 능력입니다. 디버깅 목적으로 GDB를 능숙하게 활용하면 Linux 시스템에서 복잡한 바이너리 파일을 원활하게 탐색할 수 있습니다. 단계별 실행 제어, 세심한 중단점 배치, 타깃 스레드 분석과 같은 다양한 기능은 강력한 진단 도구로서 그 위력을 발휘합니다.
Microsoft Windows 운영 체제에서 소프트웨어 프로그램 문제를 해결하려는 경우, Windows 고유의 디버깅 도구이며 잠재적 유용성에 대해 조사해 볼 가치가 있는 WinDBG 형태의 옵션이 존재합니다.