소스 인사이트(Source Insight) 파서 문제

@codemaru · November 21, 2007 · 4 min read

요즈음 간단한 드라이버를 만들 일이 있어서 소스 인사이트를 설치했습니다. 뭐 드라이버를 꼭 소스 인사이트로 개발해야 되는 것은 아니지만 제가 처음 드라이버란 것을 알게된 회사에서 대부분의 드라이버 개발자 분들이 소스 인사이트를 사용했기에 은연중에 소스 인사이트로 개발하면 편리하다는 생각을 하게 되었습니다. 그 많은 개발자들이 쓰는데는 이유가 있다고 생각했거든요. ㅋ 그러고 보면 참 첫 경험은 정말 중요합니다. 누군가 노트패드로 드라이버 개발하는 것을 봤으면 저 또한 그렇게 할지도 모르는 일이니까요. ㅋ

하여튼 설치하고 업데이트 받고 했습니다. 그리곤 DDK 경로를 설정하고 심볼 패스에 추가하고 *드디어* 실제 드라이버 프로젝트를 생성했습니다. 으례 그렇듯이 DriverEntry를 코딩합니다. 심벌이 제대로 설정됐나 보기 위해서 PDRIVER_OBJECT에서 커서를 놓아봅니다. 오오 좋습니다. ㅋ 옆에 PUNICODE_STRING으로 이동합니다. 그런데 이놈 PUNICODE_STRING을 찾지를 못합니다. 쌩 쑈 끝에 원인을 알아 내었습니다. ntdef.h에 정의된 PUNICODE_STRING 정의 위쪽 어느 부분 부터 파싱을 못하더군요.

        Source Insight        md 0

문제를 단순화 시키면 위와 같습니다. 똑같은 두 문장이 반복되서 나오는데 첫 번째 A_FOO를 보면 진하게 표시된게 소스 인사이트가 알아 먹었음을 알 수있습니다. 그런데 두 번째 A_FOO를 보면 연하게 표시된게 소스 인사이트가 알아먹지 못했음을 알 수 있습니다. 헐헐. 뭔가 파서의 문제라는게 확 느껴지지 않나요. 삽질한게 아까워서 감히 염치도 없이 소스 인사이트 서포트 메일에 버그인 것 같다고 메일을 보냈습니다. 그리고는 Visual Studio를 꺼내서 ddkbuild로 작업했습니다. 소스 인사이트 뽀대가 좀 아쉽긴 했습니다. ㅋ

오늘 답장이 왔습니다. 아래 부분이 메일의 핵심입니다.

The problem can be handled by using the Edit Condition dialog, and defining the state of DEFA. You can find information here:

About Edit Condition:http://www.sourceinsight.com/docs35/af914765.htm
andhttp://www.sourceinsight.com/docs35/ad918685.htm

간단하게 해결책을 설명드리면 파싱하지 못하는 곳의 #if, #ifdef, #ifndef 등에 사용된 조건 변수를 지정해 주라는 것입니다. 위의 그림에서는 두번째 A_FOO가 시작되는 #ifdef ABC 부분에서 ABC를 선택하고 오른쪽 마우스 버튼을 누르면 메뉴가 나오죠. 거기서 Edit Condition을 선택합니다. 그리고 ABC를 0으로 설정해 줍니다. 그럼 제대로 파싱이 된답니다. 그런데 이걸 일일히 찾아서 해주기엔 너무 귀찮잖아요. ㅋㅋ 그래도 소스 인사이트 뽀대를 쓰기 위해서 ddk 헤더를 열어서 저 뻘짓을 해줬습니다. 물론 심벌 못보고 코딩해도 별 상관은 없지만 좀 아쉽잖아요. 소스 인사이트 쓰는게 그것 때문인데. ^^;;

        Source Insight        md 1

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중