AUTOEXP.dat활용하여STL사용시디버깅조금더쉽게하기

이 후 부터는 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 하기를 원한다면 해당 사항을 적절하게 제거또는 수정하시면 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다