E D R , A S I H C RSS

STL Error Decryptor

1. Before Reading

본 문서는 QuickInstallation For STLErrorDecryptor내용을 백업하기 위한 목적으로 만든 페이지입니다. 따라서 원 홈페이지의 자료가 사라지지 않은 이상 가능하면 원 홈페이지에서 글을 읽으셨으면 합니다.
개인홈페이지가 출처라서 언제사라지게 될지 모르겠군요.
이하 원 홈페이지의 내용과 동일한 내용르 위키의 문법으로 재구성한 것 입니다.

2. 들어가기 전에

VC++를 가지고 STL 프로그래밍을 하시는 분들이 가장 많이 느끼는 불편함(어느 플랫폼이나 마찬가지이지만)중 하나가 바로 "에러 메시지에 나타나는 STL 컴포넌트가 무엇인지 도통 모르겠다"라는 점일 겁니다. 이는 컴파일러가 STL 템플릿을 인스턴스화할 때 타입 매개 변수가 모두 포함된 상태로 전체 이름을 써 버리기 때문에 STL 책에 나오지도 않는 클래스 이름과 템플릿 이름 등이 마구 튀어나옴은 물론이거니와, 인스턴스화한 클래스 이름 자체가 엄청나게 길어져서, 코드 한 줄에 대한 에러 메시지가 수십 여 줄까지 만들어지는 현상이 일어나지요.
이러한 현상은 이펙티브 STL의 항목 49에서도 다루어진 이야기입니다. 원저자는 "많이 읽어서 익숙해져라"라는 결론을 내리고 있지만, 이 문제를 도구적으로 해결한 방법도 있다는 언급도 하고 있었죠. 여기서 이야기하는 STL 에러 해독기(이하 해독기)가 바로 그것입니다. 이 도구는 VC 컴파일러가 출력하는 에러 메시지를 가로채어 STL에 관련된 부분을 적절하게 필터링해 줍니다.
역시, 잘 아시겠지만, 본 문서는 읽으시는 분께서 Visual C++ 개발 환경과 C++ 사용에 불편해하지 않고 탐색기 화면을 두려워하지 않는다는 가정 하에 작성했고, 윈도우 환경을 최대한 사용하는 쪽으로 작성하였습니다. :)

3. STL 에러 해독기의 작동 원리

가) 여느 개발도구와 마찬가지로 VC의 IDE는 그 자체에 빌드용 장치(컴파일러와 링커)를 내장하고 있지 않고, 외부에 있는 컴파일러와 링커를 실행해서 프로그램을 빌드합니다. 컴파일러와 링커의 출력 결과는 실제로 콘솔로 빠져 나오는 출력이지만, 네임드 파이프(named pipe)란 것을 통해 VC의 IDE로 다시 들어가 출력(output) 윈도우에 디스플레이되는 것입니다.
컴파일을 맡은 프로그램은 CL.EXE란 것인데, 이 프로그램은 C/C++컴파일러(C2.DLL+C1XX.DLL)를 내부적으로 실행시키는 프론트엔드의 역할만을 맡습니다. VC IDE는 컴파일시 이 프로그램을 사용하도록 내정되어 있습니다.

나) 원래의 C/C++ 컴파일러를 작동시키되 그 결과를 필터링해주는 기능이 추가된 프론트엔드를 CL.EXE이란 이름으로 행세(?)하게 하면, VC의 IDE나 기존의 개발환경에 전혀 영향을 주지 않고 필터링만 할 수 있게 될 겁니다. 해독기 패키지에는 이런 CL.EXE가 포함되어 있습니다. 이것을 "프록시(proxy) CL"이라고 부릅니다.

다) 해독기는 이런 상태에서 작동합니다.

  • 원래의 CL,EXE이 CL2.EXE로 리네임됨
  • 해독기 패키지에 포함된 프록시 CL이 원래의 CL.EXE이 있던 자리를 대신함
  • 펄 스크립트 인터프리터(PERL.EXE)가 사용 가능함
  • 해독기 패키지에 포함된 에러 필터 스크립트(STLfilt.pl)가 사용가능 함

라)해독기는 위의 상태에서 이렇게 작동합니다.
  • 프록시 CL(CL,EXE)이 CL2.EXE를 실행함
  • 펄 스크립트 인터프리터(PERL.EXE)를 실행하고, 에러 필터 스크립트(STLfilt.pl)를 띄움
  • CL2.EXE가 내는 컴파일 결과를 에러 필터 스크립트에 파이프(pipe)를 통해 통과시킴
  • 에러 필터 스크립트는 자신이 받은 컴파일 결과를 필터링하여 다시 VC의 IDE로 전송

전체적인 동작 원리를 간략하게 아래의 그림으로 정리해 보았습니다.

WorkingMethod.gif

마) 별로 복잡해보이진 않지만, 문제는 이 작업을 손으로 모두 해주어야 한다는 겁니다. 여기까지 다 읽으신 분은 이제 본문으로 들어갑시다.

4. 필요한 프로그램과 도구를 받아서 준비하기

가) 해독기를 설치하는데 필요한 준비물은 다음과 같습니다. 하나씩 받아둡시다. 찾아다니기 귀찮으신 분은 이 웹 사이트의 자료실에서 모두 받아 와도 되겠지요.

  • STL 에러 해독기 패키지 (Win32용) : STLfilt.zip이란 이름을 가지고 있습니다 (http://ww.bdsoft.com/tools/stlfilt.html)
  • 펄 스크립트 인터프리터(Win32용) : 여기서는 ActivePerl을 사용합니다. (http://ww.activestate.coml)
  • MSVCP60.DLL : STL 에러 해독기의 컨트롤러가 사용하는 DLL입니다 (옵션).

나) 펄스크립트 인터프리터를 설치합니다.(저는 D:\에 설치했습니다)

다) 만만해 보이는 디렉토리에다가 STLfilt.zip의 압축을 풉니다. (저는 H:\STLfilt 란 디렉토리에 압축을 풀었습니다.)

FilesUnzipped.gif

라) 꼭 알고 있어야 하는 파일만 간단히 설명하면 다음과 같습니다. 일단 훑어만 보시죠.

  • CL.EXE : VC에서 사용하는 원래의 CL.EXE를 대신할 프록시 CL.
  • STLTask.EXE : 해독기의 필터링 기능을 토글하는 컨트롤러로, 윈도우 작업표시줄(TaskBar)에 위치하게 됩니다.
  • Proxy-CL.INI : 프록시 CL이 작동하는 환경을 제공하는 INI 파일.
  • STLfilt.pl : 컴파일러의 출력 결과를 필터링 해주는 펄 스크립트.이 파일의 위치를 잘 기억해두세요.
  • CL.CPP: 프록시 CL의 소스 코드. 관심있는 분은 한 번 보세요. 꽤 잘 짰습니다.
마) 다 되었으면, 4로 넘어갑니다.

5. 프록시 CL 설치하기

프록시 CL이 원래의 CL.EXE의 행세를 할 수 있도록 하는 과정입니다.

가) Visual C++가 설치된 디렉토리로 이동하고, 여기서 \bin 디렉토리까지 찾아 들어갑니다. (제 경우에는 D:\Program Files2\Microsoft Visual Studio .NET\Vc7\bin입니다.) 제대로 갔으면, 원래의 CL을 백업용으로 모셔다 놓을 폴더를 하나 만듭니다. (제 경우에는 native_cl이란 이름으로 만들었습니다.) 그리고 나서 CL.EXE를 그 폴더에 복사해 둡니다.

OriginalCLFolderMaking.gif

나) \bin 디렉토리에 있는 CL.EXE를 CL2.EXE로 이름을 바꾸어 줍니다.

CL2Rename.gif

다) 이젠 프록시 CL의 동작에 필요한 환경 옵션을 제공하는 Proxy-CL.INI 파일을 여러분의 개발환경에 맞게 고쳐야 합니다. 텍스트 편집기로 Proxy-CL.INI를 열면 아래의 common, proxy.cl, stltask.exe 부분이 모두 비어 있는데, 윗부분의 주석문을 참고하면서 환경 변수를 고쳐줍니다. 반드시 설정해야 하는 옵션은 다음과 같습니다.

  • FILTER_SCRIPT : 필터링 펄 스크립트(STLfilt.zip)의 전체 경로. 반드시 파일 이름까지 써 주어야 합니다.
  • TOGGLE_FILE : 필터링 활성화를 토글링하는 파일이 위치할 디렉토리. 생각할 시간 없는 분은 STLfilt.zip의 압축을 푼 위치로 정해주세요.
  • PERL_EXE : 펄 스크립트 인터프리터(PERL.EXE)의 전체 경로. 역시 파일 이름까지 써 주세요.
  • CL_DIR : VC의 컴파일러 프론트엔드인 CL.EXE가 위치한 디렉토리. 이 부분을 지정하지 않으면 해독기 컨트롤러가 제대로 작동하지 않습니다.

아래의 그림은 저의 Proxy-CL.INI 파일입니다.
ProxyCLConfigure.gif

라) 이렇게 편집한 Proxy-CL.INI를 윈도우 디렉토리에 복사합니다. 윈도우 디렉토리란 윈도우 98/ME 등에선 \WINDOWS이겠고, 윈도우 NT/2000/XP 등에선 \WINNT 이겠지요. 즉 운영체제와 프로파일 파일들이 들어 있는 곳입니다. 프록시 CL은 기본적으로 이 윈도우 디렉토리에서 읽은 Proxy-CL.INI을 가지고 동작 옵션을 정합니다.
ProxyCLConfigFileCopy.gif

마) 이제, STLfilt.zip의 압축을 푼 디렉토리에서 프록시 CL을 복사해서 VC의 \bin 디렉토리에 붙입니다.
ProxyCLCopy.gif

같잖지만 힘든 일은 이제 끝났습니다. ^^ 다 되었으면 5번으로 넘어갑시다.

6. 해독기 컨트롤러 실행하기

프록시 CL의 에러 필터링을 활성화하거나 비활성화하는 역할을 맡은 프로그램인 STLtask.exe를 실행시켜 태스크바에 띄우는 과정입니다.

가) STLfilt.zip의 압축을 푼 디렉토리에서 STLtask.exe를 실행합니다. 별 문제가 없으면 아래와 같은 대화 상자가 뜹니다.
STLTaskFirstRun.gif

참고) 대화 상자의 상단을 보면 "CL.EXE를 CL.STL로 복사했다"란 메시지가 보이는데, 이는 프록시 CL도 백업용으로 하나 복사해 둔다는 뜻이니 괘념치 않아도 됩니다.

참고2) 이 대화 상자가 뜨지 않고 "MSVCP60.DLL이 없다" 라는 메시지가 나오면 이 DLL을 시스템 디렉토리에 복사해 주세요.

나) 위의 대화 상자에서 Back to taskbar 버튼을 누르면 윈도우의 작업 표시줄(태스크바)에 아이콘이 하나 뜹니다. 이 아이콘을 오른쪽 클릭하면 메뉴가 뜹니다.
STLTaskMenu.gif

여기서 "Enable Filtering"을 선택하면 그때부터 STL 에러 필터링이 가능해집니다. 그리고, 앞으로 STL 에러 필터링을 활성화하거나 비활성화할 때에는 이 태스크바의 아이콘을 사용하면 됩니다(Enable filtering/Disable filtering을 선택하면 되겠죠). 필터링이 활성화 되어 있느냐 그렇지 않으냐의 여부는 작업 표시줄의 아이콘 색깔( STLTaskActIcon.gif은 활성화되었다는 뜻)로 확인할 수 있습니다.

7. 테스트!

이제 다 끝났습니다. 해독기가 제대로 설치되었는지 확인하는 의미에서 에러를 일으켜봐야겠습니다.^^

가) VC++를 실행시키고, 아래와 같이 프로그램을 써 봅시다.
~cpp 
#include<string>
using namespace std;

int main()
{
   string s(10); // 컴파일 에러를 일으키는 문장, 하나의 매개 변수를 받는 string 생성자는 할당자만을 받습니다.
   return 0;
}

나) Build나 Complie 명령을 내려서 이 소스를 컴파일해 봅시다.

-> STL 필터링이 활성화되어 있지 않았을 때의 컴파일 결과(VC++.NET의 경우)는 다음과 같습니다. 절망적인 암호가 널브러져 있음을 알 수 있습니다.


~cpp 
컴파일하고 있습니다.

     ****** {BD Software Proxy CL v2.26} STL Message Decryption is Off ******

Test.cpp
h:\MyProgrammingLab\JunkRoom\Weired_C++\Test.cpp(6) : 
error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax>::_Alloc &) with [_Elem=char,_Traits=std::char_traits<char>,_Ax=std::allocator<char>]' : 매개 변수 1을(를) 'int'에서 'const std::basic_string<_Elem,_Traits,_Ax>::_Alloc & with [_Elem=char,_Traits=std::char_traits<char>,_Ax=std::allocator<char>]'(으)로 변환할 수 없습니다.; 원인: 'int'에서 'const std::basic_string<_Elem,_Traits,_Ax>::_Alloc with [_Elem=char,_Traits=std::char_traits<char>,_Ax=std::allocator<char>]'(으)로 변환할 수 없습니다.; 소스 형식을 가져올 수 있는 생성자가 없거나 생성자 오버로드 확인이 모호합니다.

-> STL 필터링이 활성화되어 있을 때의 컴파일 결과(VC++.NET의 경우)는 다음과 같습니다. 참으로 많은 부분이 알기 쉽게 되어 있음을 알 수 있습니다.


~cpp 
컴파일하고 있습니다.

  ****** {BD Software Proxy CL v2.26} STL Message Decryption is ON! ******

Test.cpp
h:\MyProgrammingLab\JunkRoom\Weired_C++\Test.cpp(6): 
error C2664: 'string::basic_string(alloc &)': 매개 변수 1을(를) 'int'에서 'alloc &'(으)로 변환할 수 없습니다.;원인: 'int'에서 'alloc'(으)로 변환할 수 없습니다.; 소스 형식을 가져올 수 있는 생성자가 없거나 생성자 오버로드 확인이 모호합니다.

참고) VC++.NET을 사용하시는 분의 경우엔 컴파일 전에 반드시 /WL 옵션을 주어야 합니다. /WL 옵션은 모든 에러 및 경고 메시지를 한 줄로 표시해 주는 옵션입니다. VC++.NET은 소스 코드 한 줄에 대한 에러 메시지를 여러 줄에 걸쳐(\n문자를 끼워넣어서) 표시하는데, 에러 필터링 스크립트는 에러 메시지가 한 줄로 되어 있을 때 재대로 동작하기 때문입니다. 아래와 같이 프로젝트 속성 페이지에서 C/C++령줄 항목을 선택한 후 /WL 옵션을 추가합시다.

8. 문서정보 및 출처

문서 정보
최초 작성 :2001/04/24
최종 업데이트 : 2001/04/26
포스팅 : 2001/04/26
적용 플랫폼 : Win32 / VC++ 6 & VC++.NET
작성/저작자: 곽용재 (kwak101@hitel.net)
원문)http://www.kwak101.pe.kr/kwak101/works/InternData/STLDecryptor_QuickGuide.html

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.4919 sec