많은사람들이 질문을 할 수 있을것이다.
비주얼스튜디오, vscode와 같이 다루기 쉬운 툴이 있는데 뭐하러 불편하게 리눅스에서 C언어를 공부하나??
맞는말이다. 비주얼스튜디오는 C언어를 배우기 위해 잘 만들어진 소프트웨어 툴이다.
그러나 실제로 전자공학에서는 C언어로 MCU를 다루기 때문에 문제가 된다.
우리가 사용는 PC대부분은 64비트 프로세서라서 넉넉한 메모리공간을 갖고 있지만
PC이외의 임베디드 제품(냉장고, 로봇청소기, 프린터 등)은 전부 8비트, 16비트와 같이 매우 협소한 공간을 갖는다.
심지어 OS가 내장되지 않은 제품은 더욱 고려할 사항이 많아진다.
이번 포스팅에서는 리눅스에서 C언어 코드를 작성, 컴파일, 디버깅하는 과정을 다뤄보자.
C 코드작성
1. C언어코드를 담을 디렉토리를 생성하자.
/ mkdir project
/ cd project
2. vi 편집기를 이용하여 파일 생성
vi(m) 혹은 nano는 루트권한으로 접속해야 편집기를 이용할 수 있다.
/ vi var.c
3. 코드 작성
나중에 디버깅하기 위해 숫자를 여럿 작성했다.
컴파일
1. gcc컴파일하기
비주얼스튜디오를 설치할때 C컴파일러도 같이 설치되어서 바로 실행 할 수 있지만
리눅스에서는 C언어를 컴파일하기 위해 GCC(GNU C Compiler)를 설치해야 한다.
/ apt-get install gcc
2. 작성한 코드 컴파일 하기
다음과 같이 명령을 내리면 a.out이라는 파일이 생긴다.
/ gcc var.c
3. a.out파일 실행하기
/ ./a.out
컴파일과 실행 전부 정상적으로 작동한다.
디버깅
코드를 처음부터 깔끔하게 작성하는게 최고겠지만 아쉽게도 그럴 가능성은 매우 적다....
뜻대로 프로그램이 동작하지 않을때 오류를 정확하고 빠르게 찾아내는 방법도 정말 중요하다.
비주얼스튜디오에서 디버깅을 할 때 중단점을 달고 차례대로 하나씩 디버깅을 하는 방법이 있지만
리눅스에서도 이와 같은 디버깅 방식인 GDB(GNU Debugger)가 있다.
1. GDB설치하기
GCC와 마찬가지로 디버거를 설치해야한다.
/ apt-get install gdb
2. 디버깅마킹 후 디버깅모드 진입
디버깅을 하기 위해서 작성한 소스파일에 마킹을 해줘야 한다.(-g)
이후에 디버깅모드로 진입한다.
/ gcc -g var.c
/ gdb a.out
위의 코드를 실행하면 아래와같은 화면이 나온다.
성공적으로 디버깅 모드로 진입했다.
3. run명령어를 작성하면 내가 작성한 코드 실행할 수 있다.
4. l명령을 내리면 내가 작성한 코드를 줄별로 확인할 수 있다.
다음 코드가 나오지 않으면 엔터를 계속 누른다.
5. 중단점 설정(break point)
(gdb) b <줄번호>
예를들어 24번 줄에 중단점을 단 후 실행을 해보자.
중단점 한개를 main함수 24번줄에 설정했다는 알림이 나온다.
(gdb) p <변수명>
위의 명령어를 통해 변수 하나하나 값을 확인 할 수 있다.
심화
여기서 끝내면 서운하니 조금 더 나아가보자.
리눅스에서 C언어를 다루는 이유는 메모리 공간을 최대한 효율적으로 사용하기 위해서 일 수도 있다.
따라서 내가 작성한 코드의 변수들이 어느 메모리위치에 있는지 한눈에 확인 하는 방법도 있다.
(gdb) disas main
디버깅모드에서 위의 명령어를 작성하면 다음과같은 화면이 출력된다.
처음보면 당황할 수 있는 난잡한 숫자들이다.
이는 어셈블리단으로 내려온 것이며 작성한 코드를 16진수형태로 확인 할 수 있다.
간단히 살펴보자면 위의 3줄은 전처리기, 헤더파일호출, main함수 생성을 나타내며
4번째 줄부터 변수 값, 주소값을 16진수 형태로 확인 할 수 있다.
'테크 > 리눅스' 카테고리의 다른 글
[리눅스] 쉘 스크립트 맛보기 (0) | 2022.01.25 |
---|---|
[리눅스] I/O Redirection (0) | 2022.01.24 |
[리눅스] 패키지 매니저(apt, wget, git) (0) | 2022.01.22 |
[리눅스] 에디터 편집하기(nano) (0) | 2022.01.20 |
[리눅스] 기본 명령어 (0) | 2021.08.06 |