C/C++ 프로그램 디버깅의 일반적인 방법

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 디버깅과 비교하여 디버깅 중에 프로그램이 중단되지 않고 실제 환경에 더 가깝다는 장점이 있습니다.

참조

  1. C 언어 기술 네트워크

  2. Bilibili_C 언어 기술 네트워크_C 언어로 된 gdb 디버깅의 본질

추천

출처blog.csdn.net/hesorchen/article/details/124436643