'소스분석'에 해당되는 글 1건

안녕하세요? 환민입니다.

방금 소스 분석에 대한 Q/A글을 보고서, 한번 정리해 봐야지 하는
맘으로 글을 씁니다.

프로그래머라면 자주 해야 하는.. 피할 수 없는 것이 바로
남의 소스를 분석하는 일입니다.

그러나 항상 부담되고, 피하고 싶은 것이기도 하지요.

가장 기본적인 소스 분석법이자, 초보분들이 즐겨 사용하시는 방법이
텍스트 뷰어나 개발툴의 에디터에 소스를 불러 놓고, 텍스트 읽듯이
소스를 눈으로 읽어가는 방법입니다.

어떤 함수가 호출이 되는데.. 그게 무슨 내용일까? 하면
텍스트 뷰어나 개발툴의 문자열 Find 기능으로 함수를 찾아갑니다.

머 이런 방식을 사용합니다.

그나마 주석이 많이 달려 있으면 다행이지만, 또한 따로 문서화가
되어 있는 소스면 금상첨화겠지만.. 대부분 그렇지 못하죠.
(자신을 위해, 다른 사람을 위해 주석 많이 달고 문서화 합시다!)

본론으로 들어가서...

결론부터 말하자면,
"개발툴의 디버깅 기능을 활용해라!" 입니다.

디버깅의 주요 기능은 다음과 같습니다.

1. 브레이크 포인트 걸기/풀기
2. Step over
3. Trace into
4. 변수의 내용 살피기 등의 조사 기능

Step over는 걍 쭈욱~! 아래로 훑어 내려가는 거고,
Trace into는 함수 호출을 만나면 그 함수 안으로 파고 들어가는 거죠.

이걸 잘 활용하면 됩니다.

일단 엔트리 포인트를 찾습니다. (main이나 WinMain)
거기 맨 앞부분에 브레이크 포인트를 겁니다.

그리고 디버깅을 시작하면, 그 맨 앞의 브레이크 포인트에 걸려서
멈추게 됩니다.

자.. 이제 Step over를 이용합니다.
Step over 단축키를 따다닥 누르면서 어떤 식으로 로직이 수행되는지
머리속으로 생각합니다.

이해됐어~! 라고 생각되면 Step over 단축키 딱~! 누르고,
그 다음 소스 코드도 이해가 됐음 Step over를 누르고...

이렇게 흐름을 따라가면서 머리속에 전체 흐름을 그리기 시작합니다.
문서화를 해 놓아도 아주 좋습니다.

이렇게 한번 쫘악 훑습니다. 도중에 모르는 함수를 만나서 대강
이름을 보고 어떤 함수겠지.. 전체 흐름을 보고 어떤 일을 하는 함수겠거니
파악만 해둡니다. (Trace into로 파고들지 마세요.)

이제 한번 쭈욱 훑어 보았다면, 다시 엔트리 포인트부터 디버깅을 해나가기
시작합니다.

이제는 모르는 함수를 만나면 Trace into 기능을 이용해서 함수를 파고 듭니다.

이런식으로 한단계 파고 드는 방식으로 파악을 하고..
다시 디버깅을 해서 이번에는 그 함수 내에 또 모르는 함수가 호출되고
있다면 또 파고 들고..

이렇식으로 파고드는 깊이를 한단계씩 높여가면서 디버깅을 해 나갑니다.

API 함수나 어떤 라이브러리 함수 같은 저수준 함수는 굳이 디버깅해서
살펴보지 않아도 어떤 일을 하는지 알 수 있을테니까,
저수준 함수까지는 디버깅 안하셔도 됩니다.

이 디버깅을 이용한 소스코드 분석 방법이 제일 빠르고 좋은 방법인 것 같습니다.

한번 직접 해보세요. 그냥 눈으로 소스코드만 훑어보던 때와 비교하면
엄청난 시간 단축을 느끼실 수 있습니다.

저도 아직 이게 습관화 되지는 못했는데, 앞으로 습관화 시켜야 될 것 같네요. ^^

행복하세요.


--------------------------------------------------------------------------------------------
안녕하세요? 홍환민입니다.

소스 분석에는 많은 방법들이 존재하지만, 저는 대표적으로 두가지 방법을 주로 사용합니다.

1. 디버깅 해보기

단순히 소스를 읽는 것에 비해, 디버깅해 보는 것이 훨씬 소스 분석에 유리합니다.
분석 원하는 기능에 해당하는 소스 부분인 것 같은 곳에 브레이크 포인트를 찍어서
해당 라인부터 한줄한줄 추적해 나가는 방법입니다.

2. 리펙토링 해보기

쉽게 설명드리면 소스를 수정해보면서, 소스를 파악하는 방법입니다.
누군가에게 이 프로그램 소스를 인수인계 받았다고 생각하고, 소스를 수정해가면서 소스를 점차적으로 파악해 나가는 방법입니다.
리펙토링이란, 간단히 말하자면 외부적인 기능의 개선/변화 없이 내부적인 소스의 구조를 개선하는 방법을 말합니다.
중복한 소스 코드를 함수로 빼내거나, 알기어려운 변수 이름을 알기 쉬운 변수이름으로 바꾸는 식의 작업을 말합니다.

이러한 리펙토링을 하면서, 리펙토링 후에도 프로그램이 이전과 같이 잘 작동한다면,
그 부분의 소스를 제대로 파악하고 수정하신게 되는겁니다.

그리고 먼저 설명드린, 소스를 수정해 가는 방법은, 기능을 개선하거나 원하는 방향으로 소스를 수정해 보는 방법인데, 이것 역시 소스 수정 후 원하시는 바대로 프로그램이 동작한다면, 소소를 제대로 파악하신게 됩니다.

소스를 자세히 보기 위한 목적으로 함수 하나를 자세히 본다거나 하는 경우를 제외하고는 소스를 책읽듯이 한줄한줄 읽는 것은 최악의 방법이라고 생각합니다.
프로그래밍 처음 접할때 사용하는 방법이기도 하고요.

---------------------------------------------------------------------------------------------

부연 설명입니다.

제가 질문하신 님의 글을 끝까지 안읽고 답변을 했더니 좀 다른 방향으로 답변드린 것 같네요.
(에거~ 비밀번호 안넣어서 저도 제 글을 못고쳐요 ^^)

말씀드린 방법 중 첫번째 방법인 디버깅 해보기를 사용하시면 됩니다.

일하시던 도중에 문뜩 이 부분이 어떠한 원리로 동작하는 것일까 라고 궁금한 것이 생길 수가 있습니다.

아니면, 그 기능에서 버그가 생겨서, 내부적으로 어떻게 돌아가는지 알아야 될 경우가 생깁니다.

aaa.bbb();

aaa라는 컴포넌트의 bbb라는 메서드의 동작원리를 알고 싶다면,
저 곳에 브레이크 포인트를 찍고, 추적해 들어가는 것이죠.

제 경험상 브레이크 포인트, 단계단계 디버깅(추적)해가는 것에 능숙해 지는 것이
한단계 도약하는 방법이 아닌가 싶고요.

F5, F7, F8을 얼마나 능수능난하게 사용하느냐... ^^;;

그리고 적으신대로 VCL 소스 분석하는게 델파이 실력 향상에 무진장 도움이 되는 것이 사실입니다.

델파이에 국한된게 아니라, 전체적인 플밍 실력 향상에도 크나큰 도움이 됩니다.
업무 시간 짬짬히 하나하나 분석해 보세요.
미심쩍거나 궁금해지는 부분을 귀찮아서 그냥 넘기느냐 아니면 분석해보느냐도 실력 향상을 많이 좌지우지 하는 것 같아요.

그리고 제가 강좌란에 적은 글중에도 VCL의 특정 기능의 분석과정을 서술한 것들이 있으니 보시면 도움이 될거에요.

행복하세요.
Posted by csbuilder