목차
gdb 디버깅
gdb 설치
사용하기 전에 gdb를 설치해야 합니다.
yum install -y gdb
사용 전 준비
파일을 컴파일할 때 -g
컴파일된 파일을 디버깅할 수 있도록 매개 변수를 추가해야 합니다.
g++ -g demo.cpp -o demo
gdb 사용
데모 코드 1
#include <unistd.h>
#include <bits/stdc++.h>
using namespace std;
void print()
{
cout << "hello world 111" << endl;
cout << "hello world 222" << endl;
cout << "hello world 333" << endl;
}
int main(int argc, char **argv)
{
for (int i = 0; i < argc; i++)
cout << i << ' ' << argv[i] << endl;
int a = 1;
cout << a << endl;
a++;
cout << a << endl;
a++;
cout << a << endl;
print();
a++;
cout << a << endl;
a++;
cout << a << endl;
return 0;
}
디버그 입력
gdb 可执行文件名
gdb 디버깅에 성공적으로 진입한 후 명령줄 헤더 설명자가 (gdb) 형식으로 변경된 것을 확인할 수 있습니다.
프로그램을 실행
실행 명령은 프로그램 실행을 시작하고 중단점을 만나면 중지하고 중단점이 없으면 종료합니다. 이 명령은 r로 축약될 수 있습니다.
(gdb) r
중단점이 설정되지 않았으므로 프로그램이 종료되었음을 알 수 있습니다.
중단점 설정
줄 번호를 끊고 이 줄에 중단점을 설정하면 이 줄까지 실행될 때 프로그램이 중지됩니다. 이 명령은 b로 축약될 수 있습니다.
(gdb) break row_id
12행에 중단점이 설정되어 있으므로 실행 명령이 실행된 후 12행에서 프로그램이 멈춥니다.
다음 단계
다음 단계인 두 가지 명령이 있습니다.
다음 명령은 현재 문을 실행합니다.함수 호출이 발생하면 함수에 들어 가지 않습니다 (함수는 실행되지만 gdb는 함수에 들어 가지 않습니다). 이 명령은 n으로 축약될 수 있습니다.
(gdb) next
step 명령은 현재 문장을 실행하는데, 함수 호출(라이브러리 함수일 수 없고, 필요하면 스스로 선언한 함수)을 만나면 함수에 들어간다. 이 명령은 s로 축약될 수 있습니다.
(gdb) step
계속 실행
중단점을 만나 프로그램이 중지된 후 다음 중단점을 만날 때까지 계속 명령을 사용하여 프로그램을 계속 실행할 수 있습니다. 이 명령은 c로 축약될 수 있습니다.
(gdb) continue
중단점을 만난 후 프로그램은 12행에서 멈추고 계속 명령을 입력하면 프로그램이 끝까지 계속 실행됩니다.
주요 기능 매개변수 설정
데모 코드에서는 프로그램 실행 시 다음과 같이 main 함수에 매개변수를 전달할 수 있습니다.
./demo arg1 arg2 arg1000
다음은 실행 결과입니다.
그러나 gdb 모드에서는 이와 같은 매개변수를 전달할 수 없습니다.
따라서 새로운 방식으로 기본 프로그램에 매개변수를 전달해야 합니다.
(gdb) set args 参数1 参数2 ... ...
인쇄 변수
인쇄 명령을 사용하여 변수 값을 봅니다. p로 명칭 및 약칭
(gdb) print a
그만두다
quit 명령을 사용하여 gdb 디버깅을 종료하십시오. 이 명령은 q로 축약될 수 있습니다.
(gdb) quit
코어 덤프
Linux에서 ulimit 명령은 쉘 실행 프로그램의 자원을 제어하는 데 사용됩니다. coredump를 사용하기 전에 core 파일의 최대값을 무제한으로 설정해야 합니다.
ulimit -c unlimited
프로그램이 비정상 종료된 후 프로그램을 디버깅하는 데 사용할 수 있는 코어 파일을 생성합니다.
데모 코드 2
#include <unistd.h>
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char **argv)
{
cout << 1 / 0 << endl;
return 0;
}
위의 코드를 컴파일하고 실행하면 프로그램이 오류를 일으키고 종료됩니다. ls 명령을 사용하여 파일을 보면 코어 파일을 찾을 수 있습니다.
다음 명령을 사용하여 코어 파일을 디버그하십시오.
gdb 可执行文件名 对应的core文件
잘못된 문장을 보는 것이 더 직관적이고 물론 다른 정보도 매우 유용합니다.
프로그램 로그
프로그램 로그 형식을 사용하여 디버그하십시오. 본질적으로 중간 결과를 출력하는 디버깅 방법으로, gdb 디버깅과 비교하여 디버깅 중에 프로그램이 중단되지 않고 실제 환경에 더 가깝다는 장점이 있습니다.