강좌 & 팁
그래서 따로 시간을 내서 학습을 했습니다. 뭔가 장점이 있으니까 그 많은 사람들이 사용하고 지금까지 버전업해 오겠지 라고 생각하면서 말이죠. 그리고 그 생각을 맞았습니다. 파일 하나를 수정할 때에는 MS 윈도 메모장만도 못하지만, 프로젝트를 생성해서 작업하게 되면 작업 효율이 매우 높아 집니다. 이제는 UltraEdit가 불편해서 사용할 수 가 없을 정도입니다.
프로젝트 내의 모든 소스를 일일이 확인해서 따로 데이터베이스화하는지 다를 모듈이든, 사용하는 라이브러리든 관련 함수, 전역 변수, 스트럭쳐 등등 다른 소스 정보를 쉽게 확인할 수 있고 바로 이동해서 볼 수 있습니다. 그래서 Eclipse는 파일 내의 선언된 변수나 상수 외에도 다른 소스에서 공개하는 변수와 상수까지도 "자동 완성" 이라는 매우 편리한 기능을 이용해서 쉽게 상용할 수 있습니다.
그런데 정신을 차리지 않으면 저처럼 험한 꼴을 당합니다. 소스를 보시지요.
#include <stdio.h> #include <string.h> #include <tstrlist.h> #define MAXBUFFSIZE 1024 static char rx_buff[MAXLISTSIZE]; void test_fun(){ memset( rx_buff, '\0', MAXBUFFSIZE); printf( "Clean %s\n", rx_buff); } int main( void){ printf( "Hello, world\n"); test_fun(); return 1; }
실제로는 매우 긴 프로그램입니다만, 소개를 위해 짧게 줄였습니다. MAXBUFFISIZE를 정의한 이후에는 Eclise에서는 MAX만 타이프해도 관련 변수나 상수들이 주루륵 나옵니다. 그 목록 중에 하나를 선택하고 스페이스키를 누르면 나머지는 자동으로 입력해 줍니다. 그렇게 늘 하던 식으로 프로그램을 작성해 나갔는데, 컴파일하고 실행하니 Killed라는 메시지와 함께 죽어 버리네요.
]$ ./a.out Killed ]$
위의 예제를 PC에서 실행하면 이런 문제가 없습니다만, Embedded Linux Board에서 실행하면 바로 죽어 버립니다. 예제를 보면 최소한 "Hello, wordl"라고 찍혀야 하는데 그마저도 출력 못하고 죽어 버리네요. 그래서 한참 고생해서 원인을 찾았는데 한심하게도 Eclise의 편리한 자동화 기능으로 생긴 오타였습니다.
#define MAXBUFFSIZE 1024 static char rx_buff[MAXLISTSIZE];
rx_buff[MAXBUFFSIZE]로 해야 하는 것을 MAXLISTSIZE로 입력한 것이죠. 이렇게 입력된 이유는 #include로 포함한 tstlist.h에 MAXLISTSIZE가 정의되어 있었고 #include가 위에 있으므로 Eclipse는 MAXBUFFSIZE대신에 MAXLISTSIZE권한 것으로 생각됩니다. 그거도 모르고 그냥 자동 완성을 해 버린 것이죠.
거기에다가 MAXLISTSIZE로 지정된 값이 무려 0x7FFFFFF. PC에서야 환경이 좋으니 이상이 없지만, 하드웨어 사양이 낮은 Embedded 보드에서는 문제가 발생하는 것이죠. 한참 작업 중이라 눈이 피곤해 졌는지 MAXBUFFSIZE 와 MAXLISTSIZE를 구분하지를 못했네요. 실행하기도 전에 죽는 것은 전역 변수 선언일 경우라는 것을 알고 있었으면서도 이렇게 고생했네요. 아으~