AUTOEXP.dat활용하여STL사용시디버깅조금더쉽게하기 DarkKaiser, 2007년 7월 1일2023년 9월 6일 이 후 부터는 VC6 이 “C:\Program Files\Microsoft Visual Studio” 에 설치되었다고 가정합니다. 따라서 MSDEV.exe 파일은 “C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin” 에 위치하게 됩니다. VC6의 MSDEV.exe 파일이 있는 폴더에는 AUTOEXP.dat 란 파일이 존재합니다. AUTOEXP.dat 파일은 툴팁에서나 디버그 Watch 창에서 해당 변수의 내용을 어떻게 표시할 지를 사용자가 결정할 수 있게 해줍니다. 간단하게 예를 들어서 MFC의 CPoint 형 변수를 디버그 Watch 창에 추가하면 오른쪽에 결과로 “{x=100 y=200}” 과 같은 형식으로 표시가 됩니다. 또는 디버깅 시 해당 변수위에 마우스 커서를 올려놓고 잠시 기다리면 나오는 툴팁에서도 똑같은 결과가 표시됩니다. AUTOEXP.dat 파일을 열어보면 기본적으로 ” CPoint =x=<x> y=<y> ” 라는 아이템이 있습니다. 즉 CPoint 형 변수는 그 구조체(클래스)의 멤버변수인 x, y 를 각각 x=<x> y=<y>의 식으로 표시하라는 의미입니다. (재미있게도 CSize 에 대해서는 기본적으로 확장이 정의되어 있지 않습니다. CSize 형의 데이터를 watch 창에 추가한 경우에는 왼쪽의 + 마크를 클릭하여 트리를 확장하여 멤버를 직접 접근함으로써 CSize에 저장된 내용을 볼 수 있습니다.) 다음과 같은 내용을 추가함으로써 STL 사용 시 디버깅이 조금 더 수월해질 수 있습니다. 1) 우선 다음 내용의 부분을 찾아서 주석 처리합니다. std::basic_string<*>=<_Ptr> 을 ; std::basic_string<*>=<_Ptr> 2) 다음의 내용을 AUTOEXEC.dat 파일의 끝에 추가합니다. ;STL std::basic_string<*>=strlen=<_Len,d> string=<_Ptr,st> std::basic_stringstream<*>=strlen=<_Sb.str()._Len,d> strbuf=<_Sb._Pbeg,st> std::basic_ostringstream<*>=strlen=<_Sb.str()._Len,d> strbuf=<_Sb._Pbeg,st> std::basic_istringstream<*>=strlen=<_Sb.str()._Len,d> strbuf=<_Sb._Pbeg,st> std::vector<*>=size=<size(),d> begin=<_First,x> <_First[0]> <_First[1]> <_First[2]> <_First[3]> <_First[4]> <_First[5]> <_First[6]> <_First[7]> <_First[8]> <_First[9]> std::set<*>=size=<size(),d> std::list<*>=size=<size(),d> std::map<*>=size=<size(),d> std::deque<*>=size=<size(),d> std::queue<*>=size=<size(),d> ; STLPort _STL::basic_string<*>=strlen=<size(),d> string=<_M_start,st> _STL::basic_stringstream<*>=strlen=<_M_buf._M_str.size(),d> strbuf=<_M_buf._M_str._M_start,st> _STL::basic_ostringstream<*>=strlen=<_M_buf._M_str.size(),d> strbuf=<_M_buf._M_str._M_start,st> _STL::basic_istringstream<*>=strlen=<_M_buf._M_str.size(),d> strbuf=<_M_buf._M_str._M_start,st> _STL::vector<*>=size=<size(),d> begin=<_M_start,x> <_M_start[0]> <_M_start[1]> <_M_start[2]> <_M_start[3]> <_M_start[4]> <_M_start[5]> <_M_start[6]> <_M_start[7]> <_M_start[8]> <_M_start[9]> _STL::set<*>=size=<size(),d> _STL::list<*>=size=<size(),d> _STL::map<*>=size=<size(),d> _STL::deque<*>=size=<size(),d> _STL::queue<*>=size=<size(),d> _STL::_DBG_iter<*>=<_M_iterator,x> ; Jae tagSIZE =cx=<cx> cy=<cy> [ExecutionControl] CString::CString=NoStepInto CString::~CString=NoStepInto CString::operator==NoStepInto operator new=NoStepInto ; STL std::*=NoStepInto ; STLP _STL::*=NoStepInto 마지막의 ExecutionControl 섹션은 “Step Into (F11)” 명령 시 해당 소스로 들어가는 것을 금지시킬 수 있는 기능입니다. 일반적으로 CString 생성자/소멸자나 대입 연산자의 정의로 step into 할 필요성이 별로 없습니다. 마찬가지로 STL의 소스로 step into 하는 것도 커다란 의미가 없다고 생각합니다. STL의 소스로 step into 하기를 원한다면 해당 사항을 적절하게 제거또는 수정하시면 됩니다. C/C++/VC++ STLAutoExp.dat디버깅