본문 바로가기

디버깅5

디버깅의 도 (5) - 메모리 관련 문제들 프로그래밍을 하다가 만나게 되는 문제들 중 상당수가 (특히 C/C++ 프로그래머의 경우) 메모리 문제입니다. 메모리 문제는 찾아내기도 어렵고, 교정하기도 어렵습니다. 잘못된 메모리 사용이 실제 어떤 형태의 현상으로 드러나게 될지를 단언할 수가 없는 탓입니다. 특히 Java같은 언어는 메모리를 할당하는 과정은 프로그래머가 통제할 수 있지만, 메모리를 반환하는 과정은 통제할 수 없기 때문에, 메모리 문제를 발견하기도 어렵고 교정하기는 더더욱 어렵습니다. 그래서 Java 프로그래밍을 하는 와중에 험한 꼴을 당하지 않으려면 Effective Java같은 책을 잘 읽어야 합니다. X-) C/C++ 프로그래밍 언어의 경우에는 메모리를 조작하는 데 있어 프로그래머가 갖는 자유도가 꽤 큽니다. 그래서 메모리를 엉뚱하게.. 2008. 2. 17.
디버깅의 도 (4) - gdb 지난 시간까지 손수 디버깅 툴을 만드는 사례를 살펴보았습니다. 구구절절 말이 많았습니다만, 사실 그 모든 매크로들은 결국 printf 함수를 사용해 뭔가를 화면에 찍어보도록 하는 것에 불과했어요. C 프로그래머들 사이에 유명한 농담 가운데 하나로 (정말 농담?) "세상에 printf보다 강력한 디버깅 툴은 없다"는 말이 있습니다. (Java 프로그래머라면 "세상에 System.out.println보다 강력한 디버깅 툴은 없다"는 말로 바꾸어야 하겠군요.) 사실 디버깅이라는 작업의 대부분이 "어디어디에 값이 제대로 들어가 있는지 확인하는" 것이기 때문에, 이 말은 비록 농담이긴 하지만 유효합니다. 뭔가를 화면에 찍어 보는 데 printf보다 더 나은 방법은 사실 드무니까요. 그런데 printf를 사용해 만.. 2008. 1. 14.
디버깅의 도 (3) - assert 사실 이번 글은 독립적인 글이라기 보다는 이전 글의 연장선상에 있는 글이라고 보는 것이 좋겠네요. C에서 assert 관련 기능은 assert.h에 정의되어 있습니다. assert는 흔히 '프로그램 수행 중에 반드시 충족되어야 하는 조건을 디버깅 단계에서 검증하기 위해 사용하는' 루틴입니다. Java라면 VM을 실행할 때 -ea를 옵션으로 주고 실행시키면 assert 기능이 활성화되도록 만들 수 있고, java -ea:com.wombat.fruitbat와 같이 하면 특정한 package에 대해서만 assert 기능이 활성화되도록 만들 수 있습니다. 예전에 assert 기능을 release 모드에서 꼭 제거할 필요가 있느냐, 라는 논쟁이 있었던 것으로 기억합니다. 제거해야한다는 입장을 취하는 사람들은 "이.. 2008. 1. 11.
디버깅의 도 (2) - 손수 만드는 디버깅 툴 손수 만드는 디버깅 툴 디버깅을 할 때 가장 많이 쓰게 되는 툴은 무엇일까요? 아이러니하게도, 디버거가 아닙니다. 사실 툴이라고 하기도 좀 뭐하죠. 사람들이 디버깅할 때 가장 많이 사용하는 도구는, printf입니다. (Java라면 System.out.println이나 System.err.println쯤 되겠군요. C++이라면 cout이나 cerr가 되겠습니다.) 프로그램을 디버깅할 때 '프로그램의 상태를 화면에 출력하는' 일을 가장 많이 하게 된다는 뜻이죠. 하지만 printf를 무작정 프로그램 코드 안에 삽입하다보면, 나중에 삽질을 하게 됩니다. 어떤 삽질일까요? 네, 맞습니다. 나중에 프로그램 개발을 완료하고 시스템을 패키지화 해서 릴리즈 할 때가 되면, 그 모든 'printf' 문들을 전부 코드에.. 2007. 12. 28.