모든 프로그래머는 경험이 아무리 많아도 소프트웨어의 버그를 완전히 피할 수는 없습니다. 따라서 문제 해결 및 버그 수정은 소프트웨어 개발 주기에서 가장 중요한 작업 중 하나가 되었습니다. 테스트, 코드 자체 검토 등 버그를 해결하는 방법은 다양하지만 전문 디버거 소프트웨어도 문제를 정확히 찾아 해결하는 데 도움이 될 수 있습니다.
C/C++ 프로그래밍 언어나 Fortran 및 Modula-2를 사용하여 소프트웨어를 개발하는 프로그래머에게는 훌륭한 디버거 도구인 GDB가 있는데, 이는 그들에게 좋은 소식이 될 것입니다. GDB는 프로그래머가 코드의 버그 및 기타 문제를 보다 쉽게 디버깅하는 데 도움이 될 뿐만 아니라 많은 유용한 기능과 옵션도 제공합니다. 이 기사에서는 GDB 디버거의 몇 가지 기본 사항과 이것이 제공하는 유용한 기능 및 옵션에 대해 설명합니다.
시작하기 전에, 이 기사의 모든 지침과 예제는 Ubuntu 14.04 LTS에서 테스트되었다는 점을 언급할 가치가 있습니다. 튜토리얼의 샘플 코드는 모두 C 언어로 작성되었습니다. 사용된 쉘은 bash(4.3.11)입니다. GDB 버전은 7.7.1입니다.
일반인의 관점에서 GDB를 사용하면 실행 중에 프로그램의 내부 흐름을 확인하고 문제를 식별하는 데 도움이 됩니다. 다음 섹션에서는 실제 예제와 함께 GDB 디버거의 사용에 대해 논의할 것입니다. 하지만 그 전에 나중에 도움이 될 몇 가지 기본 사항을 다루겠습니다.
우선, GDB와 같은 디버거를 성공적으로 사용하기 위해서는 컴파일러가 디버거에 필요한 디버깅 정보를 생성하도록 지정된 방식으로 프로그램을 컴파일해야 합니다. 예를 들어, gcc 컴파일러(이 자습서의 뒷부분에서 C 프로그램 예제를 컴파일하는 데 사용할)로 코드를 컴파일할 때 -g 명령줄 옵션을 사용해야 합니다.
gcc 컴파일러 매뉴얼 페이지의 -g 명령줄 옵션에 대한 자세한 내용은 여기를 참조하세요.
다음으로 GDB 디버거가 시스템에 설치되어 있는지 확인하세요. 설치되어 있지 않고 Debian 기반 시스템(예: Ubuntu)을 사용하는 경우 다음 명령을 사용하여 도구를 쉽게 설치할 수 있습니다.
으아아아다른 배포판의 설치 방법은 여기를 참조하세요.
이제 위에서 설명한 대로 프로그램을 컴파일하고(gcc -g 명령줄 옵션) GDB 디버거를 설치하면 다음 명령을 사용하여 디버그 모드에서 프로그램을 실행할 수 있습니다.
으아아아이렇게 하면 GDB 디버거가 초기화되지만 실행 파일은 아직 시작되지 않습니다. 이 시점에서 디버깅 관련 설정을 정의할 수 있습니다. 예를 들어, 특정 라인이나 함수에 중단점을 설정하여 GDB가 해당 라인에서 프로그램 실행을 일시 중지하도록 할 수 있습니다.
다음으로, 프로그램을 시작하려면 다음 gdb 명령을 입력하고 실행해야 합니다:
으아아아여기서 프로그램에 일부 명령줄 매개변수가 필요한 경우 여기에서 이러한 매개변수를 지정할 수 있다는 점을 언급할 가치가 있습니다. 예:
으아아아GDB는 디버깅할 때 항상 유용할 수 있는 유용한 명령을 많이 제공합니다. 다음 섹션에서 이러한 명령 중 일부에 대해 설명하겠습니다.
이제 우리는 GDB와 그 사용법에 대한 기본 아이디어를 얻었습니다. 그럼 예시를 통해 배운 내용을 적용해 보겠습니다. 샘플 코드는 다음과 같습니다.
으아아아이 코드의 기능을 간략하게 설명하세요. val 배열의 각 값을 가져와서 out 변수에 할당한 다음 tot 앞의 값과 0xffffffff/out의 결과 값을 추가하고 tot 변수에 할당합니다.
여기서 발생하는 문제는 이 코드로 컴파일된 실행 프로그램을 실행하면 다음과 같은 오류가 발생한다는 것입니다.
으아아아그래서 이 코드를 디버깅하기 위한 첫 번째 단계는 -g
옵션을 사용하여 프로그램을 컴파일하는 것입니다. 명령은 다음과 같습니다:
다음으로 GDB 디버거를 실행하고 디버그할 실행 프로그램을 지정해 보겠습니다. 명령은 다음과 같습니다:
으아아아방금 제가 받은 오류는 부동 소수점 예외입니다. 이는 여러분 대부분이 이미 알고 계시겠지만 x가 0일 때 n % x로 인해 발생합니다. 그래서 이를 염두에 두고 나누기 연산이 일어나는 11번째 줄에 중단점을 추가했습니다. 다음과 같습니다:
으아아아참고(gdb)는 디버거 프롬프트 정보로, break 11 명령만 입력했습니다.
이제 GDB가 프로그램을 실행하도록 하세요:
으아아아처음으로 중단점에 도달하면 GDB는 다음 출력을 표시합니다:
으아아아보시다시피 디버거는 중단점이 있는 코드 줄을 표시합니다. 이제 이때 out의 값을 출력해보자. 다음과 같습니다:
(gdb) print out $1 = 5 (gdb)
如上所示,值 5被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 c 命令来完成:
c
重复上述操作,直到 out值变为0 时。
... ... ... Breakpoint 1, main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out; (gdb) print out $2 = 99 (gdb) c Continuing. Breakpoint 1, main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out; (gdb) print out $3 = 0 (gdb)
现在,为了进一步确认问题,我使用 GDB 的s (或 step) 命令代替 c 命令。因为,我只想让当前程序在第 11 行之后暂停,再一步步执行,看看这个时候是否会发生崩溃。
以下是执行之后输出信息:
(gdb) s Program received signal SIGFPE, Arithmetic exception. 0x080484aa in main () at gdb-test.c:11 11 tot = tot + 0xffffffff/out;
是的,如上输出的第一行内容所示,这就是抛出异常的地方。当我再次尝试运行s 命令时,问题最终也得到了确认:
(gdb) s Program terminated with signal SIGFPE, Arithmetic exception. The program no longer exists.
通过这种方式,你就可以使用 GDB 调试你的程序。
GDB 提供了很多功能供用户研究和使用,在这里,我们仅仅只介绍了很少一部分内容。通过 GDB 的手册页可以进一步了解这个工具,当你在调试代码的时候,尝试使用一下它。GDB 调试器有一定的学习难度,但是它很值得你下功夫学习。
위 내용은 Linux에서 C 프로그램 디버깅의 복음 - gdb의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!