GNU 디버거는 프로그램을 디버그하거나 충돌을 분석하거나 프로그램이 특정 지점에서 수행하는 작업을 확인하는 데 사용됩니다. 1980년대에 GNU 프로젝트에 의해 개발되었으며 가장 널리 사용되는 명령줄 디버거 중 하나이자 가장 널리 사용되는 GNU 소프트웨어 중 하나입니다.
먼저 디버깅할 작은 C 프로그램을 작성해 보겠습니다. 시작하려면 새 .씨
파일 사용 정력
또는 원하는 편집자:
vim test.c
다음 C 프로그램을 작성하십시오.
#include int main() { int i = 5; 부동 f = 5.5 나는 = 나는 + 3; f = f + 2.2; printf("i와 f의 값은 %d와 %f입니다\n", i, f); 반환 0; }
누르다 탈출하다
vim 명령 모드로 이동합니다. 그런 다음 입력 :wq
프로그램을 저장하고 종료합니다.
프로그램이 실행되는지 컴파일하고 확인하십시오.
gcc test.c -o test ./test i와 f의 값은 8과 7.700000입니다.
프로그램에서 디버깅 지원을 활성화하려면 우리는 그것을 컴파일 -G
깃발. 플래그가 사용되지 않으면 사용자는 제한된 옵션을 사용하더라도 여전히 프로그램을 디버그할 수 있습니다.
gcc test.c -g -o 테스트
디버깅을 시작하려면 우리의 실행 파일 테스트
~에 gdb
, 우리는 다음을 실행합니다:
gdb 테스트
그것은 열 것이다 gdb
콘솔에서 다음을 입력할 수 있습니다. gdb
명령. 명령 목록을 보려면 다음을 사용하십시오. 돕다
명령.
$(gdb) help 명령 클래스 목록: aliases -- 다른 명령의 별칭 중단점 -- 특정 지점에서 프로그램 중지 데이터 -- 데이터 파일 검사 -- 파일 지정 및 검사 내부 -- 유지 관리 명령 모호함 -- 실행 중인 모호한 기능 -- 프로그램 스택 실행 -- 스택 상태 검사 -- 상태 조회 지원 -- 지원 기능 추적점 -- 프로그램 중지 없이 프로그램 실행 추적 사용자 정의 -- 사용자 정의 명령 "help" 다음에 클래스 이름 입력 해당 클래스의 명령 목록입니다. 모든 명령 목록을 보려면 "help all"을 입력하십시오. 전체 문서를 보려면 "help" 다음에 명령 이름을 입력하십시오. "apropos word"를 입력하면 "word"와 관련된 명령어를 검색할 수 있습니다. 명령 이름 약어는 모호하지 않은 경우 허용됩니다.
그런 다음 입력할 수 있습니다. 도움말 class_name
해당 클래스에 속하는 명령을 보려면 하위 문자열을 사용하여 명령을 검색하려면 다음을 사용하십시오. 부분 문자열에 가까운
.
프로그램이 함수에 들어갈 때 중단점을 설정하려면, 운영:
$(gdb) 메인 브레이크
여기서 우리는 우리 코드의 유일한 함수에 중단점을 설정합니다. 기본
. 명령 사용 운영
다음 중단점까지 또는 종료될 때까지 프로그램을 실행합니다.
$(gdb) 실행
함수의 특정 위치에 중단점을 설정하려면 사용:
휴식 *메인 + 4
이것은 main 함수의 4번째 줄에 중단점을 설정합니다.
지금, 다음 코드 라인으로 프로그램의 흐름을 건너 뛰기 위해, 단순히 실행 단계
명령.
$(gdb) 5단계: float f = 5.5;
변수의 내용을 표시하려면, 운영 표시하다
.
$(gdb) 디스플레이 i 6: i = 5
변수의 내용을 수정하려면, 변수의 특정 값에서 프로그램 실행을 분석하는 데 필요할 수 있는 변수 설정 = 식
.
$(gdb) 변수 i=10 설정 $(gdb) i 7 표시: i = 10
여기서 'Expression'은 모든 유효한(산술/논리) 표현식이 될 수 있습니다. 단순함을 위해 변수에 다른 값(10)을 할당합니다. 나
.
프로그램의 어셈블리 코드를 인쇄하려면, 명령을 사용 디스어셈블 함수 이름
:
그냥 사용 분해하다
전체 프로그램의 어셈블리 코드를 인쇄합니다. 어셈블리 코드의 특정 줄에 있는 화살표에 유의하십시오. 디버깅 세션이 현재 특정 메모리 위치(즉, 해당 코드 줄)에서 일시 중지되었음을 나타냅니다.
특정 코드 라인에서 디버거를 점프하려면, 운영:
$(gdb) jump *main + 2 0x400528에서 계속. 중단점 2, 0x000000000040052a at test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i =
이렇게 하면 디버거가 함수의 두 번째 코드 줄의 메모리 위치에서 점프합니다. 기본
. 여기서 나는 메인의 시작 부분에서 바로 두 번째 위치로 점프했음을 주목하십시오. 따라서 변수 나
설정되지 않았으므로 디버거에서 변수 주소의 메모리 내용에 액세스할 수 없다는 오류가 발생합니다. 나
.
다음은 Linux에서 실행 파일 디버깅을 시작하는 데 도움이 되는 몇 가지 기본 명령입니다. 이 페이지의 정보가 도움이 되기를 바랍니다.