david's daily developer note

[Native] Visual Studio Visualizers (*.natvis) 본문

[Develop] Native/Native

[Native] Visual Studio Visualizers (*.natvis)

mouse-david 2018. 8. 17. 15:35
728x90

Visual Studio (*.natvis) 파일을 활용하여 Watch 표현을 입맛대로 수정할 수 있다.
Simple Example을 통하여 *.natvis를 활용방법을 간력하게 살펴보자(VS 2012).

먼저 다음의 샘플 코드를 보자

struct natvis {
int m_test;
};

class class_A {
public:
    class_A (natvis* pData) {
      m_pData = pData;
    }
    natvis* m_pData;
};

class class_B {
public:
    class_B (const natvis& data) {
      m_tData.m_test = data.m_test;
    }
   natvis  m_tData;
};

void natvis_test() {
    natvis struct_1;
    struct_1.m_test = 0;

    natvis struct_2;
    struct_1.m_test = 1;

    class_A class_a(&struct_1);
    class_B class_b(struct_2);
}

int형 멤버를 가진 natvis 구조체와
natvis구조체를 포인터멤버로 가지는 class_A와 일반 멤버로 가지는 class_B가 있다.
natvis_test 함수를 구동하고 모든 타입의 인스턴스가 만들어진 후의 Watch window를 보자.
VS의 기본 표현이다.


우리는 위의 Watch window를 여러가지 이유로 수정할 필요가 있다.
많은 멤버중에 가장 검토 가능성이 높은 변수만을 표현한다거나, Array Size를 보고싶거나, Unicode문자를 "su"입력없이 보고 싶다던지, 다양한 이유가 있을 것이다.
*.natvis 파일은 XML형태로 되어 있는데, 이를 활용하여 Watch Window표현을 수정할 수 있다.
더불어, 디버깅과 관련된 창들을 수정할 수도 있다. *.natvis 파일은 다음의 경로에 있다.
VS 2012 ...\Microsoft Visual Studio 11.0\Common7\Packages\Debugger\Visualizers\
VS 2017 ...\Microsoft Visual Studio\2017\Professional\Common7\Packages\Debugger\Visualizers\

natvis확장자를 가진 파일을 하나 만들고 다음의 Sample XML 코드를 넣어보았다.

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="natvis">
    <DisplayString Condition="m_test == 0">값없음</DisplayString>
    <DisplayString>{{구조체 변수값 : {m_test}}}</DisplayString>
    <Expand>
      <ExpandedItem>m_test</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="class_A">
    <DisplayString>{{클래스 멤버(*) : {m_pData-&gt;m_test}}}</DisplayString>
  </Type>
  <Type Name="class_B">
    <DisplayString>{{클래스 멤버(.) : {m_tData.m_test}}}</DisplayString>
  </Type>
</AutoVisualizer>

구동 결과이다. (Visual Studio를 다시시작 할 필요는 없다. 편집후에 다시 디버깅을 시작하면 적용이 된다.)



natvis 구조체에는 조건을 주어서 멤버 변수가 0인경우 "값없음"을 찍도록 해보았다.
0이 아닌경우에는 임의 문자열 "구조체 변수값 : " 을 추가하였고, 변수값을 보이도록 하였다.

class_B는 일반 멤버를 출력함으로 구조체 출력과 비슷하게 하였고, 첨자를 붙여 멤버의 멤버를 명시하였다. 
class_A도 비슷한데, 구조체를 포인터 타입으로 가지고 있기 때문에, '-' 표현뒤에 '>'를 나타내는 &gt를 붙여주고, ';'로 구분하였다. 만약 템플릿 객체를 표현하고 싶은 경우에는 '<'를 나타내는 &lt를 조합하여 Class<*>를 표현할 수 있다.


https://msdn.microsoft.com/ko-kr/library/jj620914.aspx


 


728x90

'[Develop] Native > Native' 카테고리의 다른 글

[Native] Useful Native Information Web Links  (0) 2018.12.20
[Native] Visual Studio Code Snippet (*.Snippet)  (0) 2018.09.28
[Native] APC (Asynchronous Procedure Call)  (0) 2018.08.14
[Native] LNK2005 해결  (0) 2012.05.18
[Native] CFONT  (0) 2012.04.12