대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 비주얼 스튜디오 2015 활용 가이드 : 비주얼 C++와 함께하는 코드 생산성 향상 팁 ②
등록일 조회수 6139
첨부파일  

비주얼 스튜디오 2015 활용 가이드

비주얼 C++와 함께하는 코드 생산성 향상 팁 ②



디버깅을 할 때 통합개발환경(IDE)이 제공하는 가장 기본적인 기능은 코드 실행 중 메모리상에 있는 데이터값을 알려주는 것이다. 비주얼 스튜디오는 브레이크 포인트, 조사식(Watch Window), 지역(Local Window), 데이터 팁 창(Data Tips Window) 등을 통해 이러한 값을 개발자가 읽을 수 있는 형식으로 변환해 보여준다. 최근 출시된 비주얼 스튜디오 2015에서는 이러한 디버깅 시각화(Debugging Visualization) 기능이 강화됐을 뿐 아니라 안드로이드용 프로젝트 관련 기능들도 보강됐다. 비주얼 스튜디오 2015를 활용한 비주얼 C++ 코드 생산성 향상의 두 번째 시간에는 디버깅 시각화를 돕는 Natvis 프레임워크가 무엇인지, 프로젝트에 적용하는 법을 소개한다.



비주얼 C++의 디버거는 autoexp.dat를 이용해 디버깅 중 메모리 값을 개발자가 이해가 쉬운 형식으로 변환해 보여준다. 그러나 많은 규칙들이 혼재된 형태의 파일 구조와 표현의 한계로 인해 널리 쓰이지는 않았다. 마이크로소프트(이하 MS)의 비주얼 스튜디오 2012부터는 autoexp.bat 방식 대신 Natvis 프레임워크(Native Visualization Framework)가 탑재됐다. 디버깅이 더 편리해졌을 뿐 아니라 확장이 용이해졌고 버전관리도 가능해졌다. Natvis는 차기 비주얼 스튜디오가 릴리즈될 때마다 기능이 보강돼 왔다. 비주얼 스튜디오 2015에 이르러서는 실무 프로젝트 전반에 적용할 수 있을 만큼 기능과 편의성이 향상됐다.




Natvis 프레임워크는 텍스트 형태의 디버거 시각화 설정을 XML 형식으로 만들 수 있다. 이에 대해서는 자세히 다루지 않지만 Natvis 파일과 VSPackage(Visual Studio Package), EEAddIn (Expression Evaluator AddIn)을 연계해 사용하면 복잡한 계산이나 화려한 형태의 디버깅 시작화도 가능하다.





Natvis 파일의 기본 정보

비주얼 스튜디오 2015의 비주얼 C++가 사용하는 Natvis 파일에 대한 스키마(schema)는 다음 경로에서 확인할 수 있다.

%PROGRAMFILES(X86)%Microsoft Visual Studio 14.0XmlSchemas1033 atvis.xsd

비주얼 C++나 비주얼 스튜디오를 설치하면 MFC, Concur rency Runtime의 프로그래밍 모델인 PPL(Parallel Pattern Library)과 AAL(Asynchronous Agents Library), C++ REST SDK, C++ 표준 라이브러리, Windows, WinRT 등과 관련된 객체 타입을 지원하는 디버깅 시각화 정보가 Natvis 파일에 포함돼 설치된다. 이 파일은 별다른 매뉴얼이 없는 Natvis 프레임워크의 문법 구조를 파악하는 데 유용한데, 다음 경로에서 찾을 수 있다. %PROGRAMFILES(X86)%Microsoft Visual Studio 14.0Common7PackagesDebuggerVisualizers

Natvis 파일을 작성하다 보면 Natvis 파일이 제대로 적용된 것인지, 오류는 없는지, 동일한 타입의 디버깅 시각화 정보를 설정한 경우 어떤 설정 정보의 Natvis 파일에 반영됐는지 등을 알고 싶을 때가 있다. 비주얼 스튜디오 2015는 Natvis 파일에 대한 디버깅 정보를 출력창(Output)에 표시할 수 있다. 메뉴에서 [Tools] → [Options] → [Debugging] → [Output Window] 항목의 Natvis diagnostic messages 값을 Verbose로 변경하면 Natvis 파일 적용이나 문제점 등이 출력창에 로그 메시지로 나타난다. 기본값은 Off인 만큼 Natvis 파일을 작성하기 전에 반드시 옵션값을 변경하자.



Verbose 옵션으로 인해 로그에 불필요한 내용이 많은 경우 어떻게 해야 할까. 이 경우 옵션을 Error나 Warning로 바꾸면 잘못된 양식이나 문제가 있는 문법 등의 일부 메시지만 필터링해 볼 수 있다.





Natvis 파일의 기본 문법

Natvis 파일의 기본 구조는 루트 노드인 AutoVisualizer과 예하 노드인 Type 노드로 구성돼 있다. Type 노드는 비주얼 C++의 디버거가 시작화해야 할 시각화 엔트리(Visualization Entry)와 매칭된다. 소스 코드상에서 변수 선언 시 타입을 지정해야 하는데, 이 타입에 대한 시각화 엔트리가 Type 노드의 Name 속성에 기술된다.



<리스트 1> 기본 시각화 구조의 예 < ?xml version="1.0" encoding="utf-8"?> < AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> < Type Name="[타입 이름]"> < DisplayString Condition="[Boolean 표현식]">[보여지는 값]< /DisplayString> < Expand> ... < /Expand> < /Type> < /AutoVisualizer>



Type 노드에는 Inheritable라는 속성이 있다. 이 속성 값을 명시적으로 지정하지 않으면 기본적으로 true로 활성화된다. 이 경우 Name 속성에 지정된 클래스만을 기반 클래스로 가정하며, 기반 클래스에만 시각화가 적용된다. 그러므로 해당 타입을 상속받은 클래스에 대해서는 별도의 시각화 엔트리를 작성해야 한다.



<리스트 2> 상속된 클래스에도 동일한 시각화를 적용하려면 Inheritable 속성을 사용해야 한다 < Type Name="Namespace::BaseClass" Inheritable=“false”> < DisplayString>{{Count = {m_nSize}}}< /DisplayString> < /Type>



Type 노트의 마지막 속성은 Priority다. 이 속성값으로는 High, MediumHigh, Medium, MidiumLow, Low가 있다. 기본값은 Medium이다. Type 노드의 Name 속성이 같을 경우 Priority가 높은 순서대로 Natvis가 적용된다. 만약 적용에 문제가 있으면 다음 우선순위의 Priority에 적용을 시도한다. Priority 속성은 내부 멤버에 대한 리펙토링이 발생했을 때 타입의 버전에 따라 하위 호환성이 유지된다. 또 Natvis 파일을 관리할 수 있는 방법도 제공한다.



<리스트 3> 먼저 비주얼 C++ 2015의 타입 적용을 시도하고, 만약 타입 형식 인식에 문제가 발생하면 비주얼 C++ 2013에 대한 타입이 적용되는 예 < !-- VC 2013 --> < Type Name="std::reference_wrapper<*>" Priority="MediumLow"> < DisplayString>{_Callee}< /DisplayString> < Expand> < ExpandedItem>_Callee< /ExpandedItem> < /Expand> < /Type> < !-- VC 2015 --> < Type Name="std::reference_wrapper<*>"> < DisplayString>{*_Ptr}< /DisplayString> < Expand> < Item Name="[ptr]">_Ptr< /Item> < /Expand> < /Type>



소스 코드에 여러 개의 동일한 클래스가 사용된 경우 데이터 시각화를 일관되게 적용할 수 없다. 동일한 기능을 하는 MyClass 클래스가 있더라도 내부 멤버로 _M_exceptionHolder 변수를 가지고 있거나 없는 클래스가 있을 수 있기 때문이다. Natvis 프레임워크는 타입명으로 디버깅 엔트리들을 구분한다. 그러므로 소스 코드상에서 사용한 MyClass의 멤버로 _M_exceptionHolder가 있는지 유무에 따라 Natvis파일을 별도로 관리해야 한다. Natvis 파일은 Type 요소의 Name 속성값이 일치하는 타입이거나 처리하고자 하는 멤버 명칭이 정확하지 않으면 디버깅 시각화를 진행하지 않고 에러를 출력하기 때문이다. 마지막으로 Optional 속성을 사용하면 노드에 문제가 있을 경우 해당 노드를 제외한 나머지만 시각화한다.



<리스트 4> Optional 속성을 통해 유연한 Natvis 파일을 만들 수 있다 < Type Name="MyNamespace::MyClass"> < Expand> < Item Name="[State]">_M_State< /Item> < Item Name="[Exception]" Optional="true">_M_exceptionHolder< /Item> < /Expand> < /Type>



DisplayString은 Condition 속성을 가질 수 있다. Condition의 참, 거짓에 따라 DisplayString 요소의 값이 보여진다.



<리스트 5> queue의 시각화 엔트리 예 < Type Name="std::queue<*>"> < AlternativeType Name="std::stack<*>" /> < DisplayString>{c}< /DisplayString> < Expand> < Item Name="c">c< /Item> < /Expand> < /Type>



중괄호를 통해 특정 변수의 값을 보여줄 수도 있는데, 이 경우 중괄호로 묶인 특정 변수에 해당하는 멤버의 값을 보여준다.



<리스트 6> 중괄호 하나는 변수값을 출력, 중괄호 2개는 중괄호 자체를 출력한다 < Type Name="CPoint"> < DisplayString>{{x={x} y={y}}}< /DisplayString> < /Type>



DisplayString 노드를 디버깅 시각화할 때 중괄호 자체를 출력하고 싶다면 중괄호 2개를 입력하면 된다(<리스트 6> 참조).



XML 안의 특정 문자들은 파서(Parser)가 잘못 인식될 수도 있다. 예컨대 <와 >는 XML 요소를 구분하는 문자이기에 이스케이프 시퀀스를 엔티티 코드(Entity code)로 치환해 XML을 기술한다. 대표적인 이스케이프 시퀀스로는 &, <, >, “, ” 등이 있다. 이들은 각각 &, &it;, >, ". '로 치환해 Natvis 파일이 작성된다. Type의 요소가 템플릿 클래스인 경우 이를 제네릭한 템플릿 인자로 지정하기 위해서는 *를 사용해야 한다. ATL:: CAtlArray의 경우 대괄호를 각각의 엔티티 코드로, 템플릿 인자 T를 ‘*’로 치환해 ATL::CAtlArray<*>와 같이 표현한다.



<리스트 7> 엔티티 코드와 *를 이용한 템플릿 클래스의 예 < Type Name="ATL::CAtlArray<*>"> < DisplayString>{{Count = {m_nSize}}}< /DisplayString> < /Type>



타입명을 디버깅 시각화의 값에 출력할 수도 있다. $(Type)은 해당 Type 노드가 시각화될 때 타입명으로 대체돼 보여주는 매크로다.



<리스트 8> $(Type)을 이용하면 타입 자체를 표시할 수 있다 < ?xml version="1.0" encoding="utf-8"?> < AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> < Type Name="Room"> < DisplayString>{m_squareFeet}-square foot $(Type)< /DisplayString> < /Type> < /AutoVisualizer>



템플릿 인자 또한 값으로 사용할 수 있다. 템플릿 인자의 순서에 따라 $T1, $T2와 같이 쓸 수 있는 매크로가 제공된다.



AlternativeType 노드는 디버거 시각화를 구성하는 멤버에 동일한 타입을 지정하는 등의 Type 노드 중복으로 인해 Natvis 파일이 비대해지는 낭비를 줄여준다. 예컨대 STL의 stack는 queue와 디버깅 시각화를 동일하게 표현할 수 있다. 그러므로 Alternative Type 노드를 이용해 2개의 디버깅 엔트리를 하나로 줄일 수 있다(<리스트 9> 참조).



<리스트 9> stack은 queue와 내부 디버거 시각화 부분이 같다 < Type Name="std::__1::queue<*>"> < AlternativeType Name="std::__1::stack<*>" /> < DisplayString>{c}< /DisplayString> < Expand> < Item Name="c">c< /Item> < /Expand> < /Type>



Expand 노드 관련 문법

Expand 노드는 디버깅 환경에서 시각화된 형식의 확장을 지원한다. Expand 노드를 사용하면 멤버를 나열하거나 연속된 메모리상의 변수를 배열처럼 연결해 한번에 열람할 수 있다.



<리스트 10> Type 노드 하위로 Expand 노드가 사용된 CRect의 예 < Type Name="CRect"> < DisplayString>{{top={top} bottom={bottom} left={left} right={right}}}< /DisplayString> < Expand> < Item Name="Width">right - left< /Item> < Item Name="Height">bottom - top< /Item> < /Expand> < /Type>



Expand 노드를 지정하면 Expand 노드의 하위 노드에 다양한 형태의 노드를 둘 수 있게 된다. 이 경우 디버거는 기본적으로 [Raw View] 아이템을 추가해 비주얼 스튜디오가 기본적으로 보여주는 시각화 정보를 추가한다. Expand 노드의 하위 노드로는 Item, ArrayItems, Index ListItems, LinkedListItems, CustomListItems, TreeItems, ExpandedItem, Synthetic 등이 있다. 해당 노드들에 대한 자세한 정보는 MSDN에서 확인할 수 있다.



복잡한 수식이나 프로그래밍 처리가 필요한 시각화 방법

XML 파일에서는 간단한 사칙연산 정도의 처리할 수 있으며, 이를 통해 디버깅 시각화 내용을 만들어낸다. 그러나 경우에 따라서는 복잡한 수식 처리가 필요하다. 때론 시각화 내용을 구성하는 데 프로그래밍적인 요소들도 필요하다. Natvis 파일은 별도의 DLL파일을 호출해 DLL 파일에서 시각화 내용을 구성하고 결과를 디버거에서 표시해 주는 기능을 수행한다. EEAddIn을 이용해 시각화를 구현하면 이러한 기능을 만들 수 있다. 먼저 시각화 내용을 구성할 DLL 파일이 필요한데, DLL 파일은 EEAddIn에서 미리 약속된 형태로 함수를 노출해야 한다.



<리스트 11> EEAddIn이 노출해야 하는 함수의 형식 typedef struct tagDEBUGHELPER { DWORD dwVersion; HRESULT(WINAPI *ReadDebuggeeMemory) (struct tagDEBUGHELPER *pThis, DWORD dwAddr , DWORD nWant, VOID* pWhere, DWORD *nGot); DWORDLONG(WINAPI *GetRealAddress)(struct tagDEBUGHELPER *pThis); HRESULT(WINAPI *ReadDebuggeeMemoryEx) (struct tagDEBUGHELPER *pThis, DWORDLONG qwAddr , DWORD nWant, VOID* pWhere, DWORD *nGot); int (WINAPI *GetProcessorType)(struct tagDEBUGHELPER *pThis); } DEBUGHELPER; typedef HRESULT(WINAPI *CUSTOMVIEWER)(DWORD dwAddress, DEBUGHELPER *pHelper, int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved);



함수 인자인 pResult에 문자열을 대입하면 해당 문자열이 디버거의 시각화된 값으로 보여진다. 만들어진 DLL 파일은 Natvis 파일에서 LagacyAddin 속성에 기술된다(<리스트 12> 참조).



<리스트 12> EEAddIn DLL을 사용한 Natvis 파일의 예 < ?xml version="1.0" encoding="utf-8"?> < AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> < Type Name="_WIN32_FIND_DATAW"> < DisplayString LegacyAddin="NatvisAddIn.dll" Export="OS_WIN32_FIND_DATA">< /DisplayString> < /Type> < /AutoVisualizer>



Natvis 파일에서 LagacyAddin과 Export를 설정하고 해당 DLL파일에서 디버거와 연계된 버퍼에 문자열을 기록하면, XML 파일에서 단순한 수식으로는 표현할 수 없는 값도 쉽게 디버거에서 시각화할 수 있다.





비주얼 스튜디오 2015의 업데이트

그간 Natvis 파일은 비주얼 스튜디오의 실행과 함께 로드되는 전역적인 방법으로만 적용할 수 있었다. 전역적인 방법으로는 윈도우 계정에 종속적인 방법과 계정에 관계없이 적용하는 방법, 에드인을 설치해 포함하는 방법 크게 세 가지가 있다. 결국 Natvis 파일을 프로젝트에 포함하기 위해서는 개발 툴이 설치된 개발머신마다 Natvis 파일을 적용하는 인스톨 과정이 필요했다.

비주얼 스튜디오 2015의 경우 프로젝트 파일에 Natvis 파일을 포함할 수 있게 개선됐다. 설치 마법사를 통해 프로젝트에 Natvis 파일의 테플릿을 불러와 손쉽게 생성할 수 있을 뿐 아니라 Natvis 파일 포함이 간편해졌다. 또 깃(git)이나 SVN 등의 형상관리를 통해 프로젝트별로 관리할 수도 있게 됐다.



메뉴에서 [Project] → [Add Existing Item]을 선택하면 프로젝트에 Natvis 파일을 포함시킬 수 있다. Natvis 파일은 일반적인 텍스트 파일이기 때문에 형상관리가 용이하다. [Project] → [Add New Item]을 통해서는 새로운 Natvis 파일을 추가할 수 있다. 그러면 마법사는 새 파일을 프로젝트에 포함시키고, 다음 경로의 파일 내용을 기본으로 Natvis 파일을 생성한다. 참고로 natvis.natvis 파일 내용을 수정하면 기본 템플릿을 변경할 수 있다.

%PROGRAMFILES(X86)%Microsoft Visual Studio 14.0VCvcprojectitemsUtility atvis.natvis

프로젝트에 Natvis 파일이 포함되면서 비주얼 스튜디오에서도 Natvis 파일로 제공되는 기능이 확대됐다. 그 중 가장 돋보이는 것은 비주얼 스튜디오의 인스턴스를 다시 실행하지 않아도 Natvis 파일의 평가가 프로젝트에 바로 적용되는 것과 디버깅 중 Natvis 파일을 수정하면 바로 디버거에 반영되는 점이다.



<리스트 13> 기본적인 natvis.natvis 파일의 예 < ?xml version="1.0" encoding="utf-8"?> < AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> < /AutoVisualizer>



전역적으로만 적용 가능하던 Natvis 파일이 프로젝트에 포함되면서 우선순위에 모호함이 있을 수 있다. 동일하게 적용된 Natvis 문법의 경우 일반적인 윈도우 툴처럼 프로젝트 내 Natvis 파일인 지역적 개념이 적용된다.



실전! Natvis 활용

지금부터는 비주얼 스튜디오 2015에서 Natvis 파일을 실습해보자. 실행시키고자 하는 프로그램은 부스트 라이브러리(Boost Library)를 썼다. 부스트는 C++ 개발자에게 익숙한 라이브러리다. 소스 코드 내부 구현사항의 경우 캡슐화가 잘 돼 있지만 개발자 편의성, 성능을 중시하다보니 내부 데이터가 복잡해지곤 한다. 이런 경우에는 비주얼 스튜디오가 디버깅 시 객체를 표시하기 어려워져 디버거 시각화가 무의해질 수 있다.

먼저 [File] → [New] → [Project]를 통해 Win32 Console Application 프로젝트를 생성한다. 다음 [Project] → [Manage NuGet Packages]를 클릭해 NuGet Package Manager 창을 열자. Package source의 기본값이 nuget.org인지 꼭 확인하자. 맞다면 Search에서 boost를 입력해 부스트 관련 패키지를 검색한다.





검색된 NuGet 패키지 중 boost와 boost-vc140을 설치하자. boost 패키지는 부스트 라이브러리의 헤더 파일이고, boost-vc140 패키지에는 빌드된 라이브러리 바이너리가 설치된다. NuGet을 이용해 패키지를 설치하면 오픈소스 라이브러리 소스 코드를 빌드하고 프로젝트에 적용하는 모든 작업을 패키지 매니저가 도맡아 클릭마으로 쉽게 오픈소스를 프로젝트에 적용할 수 있다. 프로젝트에 부스트 라이브러리를 적용했다면 <리스트 14>의 테스트 코드를 입력하자.



<리스트 14> 테스트 코드 1: #include < string> 2: #include < iostream> 3: #include "boost/date_time.hpp" 4: using namespace std; 5: using namespace boost::gregorian; 6: int main() 7: { 8: string s("2015-01-02"); 9: date d(from_simple_string(s)); 10: cout < < d.month() < < ", " < < d.day() < < "일" < < endl; 11: return 0; 12: }



다음 <리스트 14>의 10번 라인에 브레이크 포인트를 설정하고 디버깅하자.



값을 조회할 수 있는 Autos 창을 살펴보자. 변수 s는 변수의 값을 쉽게 읽을 수 있는 반면 변수 d의 경우 부스트 템플릿 클래스 내부 구조가 복잡해 알아보기가 쉽지 않다. 이처럼 알아보기 힘든 타입의 디버깅 엔트리를 작성하기 위해서는 [Project] → [Add New Item]을 선택해 프로젝트에 <리스트 15>의 Natvis 파일을 추가한다. <리스트 15>는 boost:gregoran:date 타입에 대한 내부 변수 days_값을 이용해 적절하게 값을 산출해 보여준다.



<리스트 15> 부스트의 date 클래스에 형식을 지정하기 위한 Natvis 파일의 예 < ?xml version="1.0" encoding="utf-8"?> < AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> < Type Name="boost::gregorian::date"> < DisplayString>날짜 : {100*((4*(days_+32044)+3)/146097)+((4*(days_+32044- ((146097*((4*(days_+32044)+3)/146097))/4))+3)/1461) -4800+(((5*(days_+32044-((146097*((4*(days_+32044)+3)/146097))/4)-(1461*((4*(days_+32044- ((146097*((4*(days_+32044)+3)/146097))/4))+3)/1461))/4)+2)/153)/10)}년{((5*(days_+32044- ((146097*((4*(days_+32044)+3)/146097))/4)-(1461*((4*(days_+32044- ((146097*((4*(days_+32044)+3)/146097))/4))+3)/1461))/4)+2)/153)+3-12*(((5*(days_+32044- ((146097*((4*(days_+32044)+3)/146097))/4)-(1461*((4*(days_+32044-((146097*((4*(days_+32044)+3) /146097))/4))+3)/1461))/4)+2)/153)/10)}월{(days_+32044-((146097*((4*(days_+32044)+3)/146097))/4) -(1461*((4*(days_+32044- ((146097*((4*(days_+32044)+3)/146097))/4))+3)/1461))/4)-((153*((5*(days_+32044- ((146097*((4*(days_+32044)+3)/146097))/4)-(1461*((4*(days_+32044-((146097* ((4*(days_+32044)+3)/146097))/4))+3)/1461))/4)+2)/153)+2)/5)+1}일< /DisplayString> < /Type> < /AutoVisualizer>



다시 디버깅을 하면 Natvis 파일이 적용돼 디버그 창에 개발자가 쉽게 알아볼 수 있는 형식의 값이 표시될 것이다. 만일 브레이크 포인트가 걸려 있는 디버깅 중 Natvis 파일을 수정해야 하는 경우 디버깅을 중단하지 않고 Natvis 파일을 수정, 저장하면 바로 디버거에 반영된다. Natvis 파일의 표현식을 만들 때 매우 유용한 특성이므로 꼭 기억해두자.



비주얼 스튜디오 2015부터는 안드로이드와 같은 다른 벤더들의 플랫폼 애플리케이션 개발, 파이썬과 같은 언어를 활용한 개발 등을 공식 지원한다. 비주얼 C++로 개발하고 디버깅할 수 있는 플랫폼의 애플리케이션이라면 Natvis를 적용할 수 있는 것이다. 다음 경로에 위치한 Microsoft.Android.natvis 파일은 안드로이드 플랫폼 앱을 디버깅할 때 적용되는 Natvis 파일이다.

%PROGRAMFILES(X86)%Microsoft Visual Studio 14.0Common7IDECommonExtensionsMicrosoftMDDDebuggerMicrosoft.Android.natvis



<리스트 16> GNU STL을 지원하는 Natvis 파일인 Microsoft.Android.natvis의 일부 < ?xml version="1.0" encoding="utf-8"?> < AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> // ...중략... < !-- gnu stl --> < Type Name="std::vector<*>"> < DisplayString>{{size={_M_impl._M_finish - _M_impl._M_start}}}< /DisplayString> < Expand> // ...중략.. < /Expand> < /Type> // ...중략... < /AutoVisualizer>



Microsoft.Android.natvis에는 GNU STL 중 개발자들이 자주 쓰는 수많은 타입들에 대한 내용들로 채워져 있다. 비주얼 C++를 이용해 안드로이드 플래폼 앱을 개발하면 디버거가 이를 기본 Natvis 파일로 사용한다.



출처 : 마이크로소프트웨어 10월호

제공 : 데이터 전문가 지식포털 DBguide.net