Visual Studio 2005 의 막강한 Visualizer
윈도우 프로그래밍을 처음 시작할 때였던 97년, 프로그램을 짜면서 비트맵을 디버깅해야 할 경우가 있었다. 그러나 마땅한 방법이 없으므로 BitBlt으로 공허한 영역에 계속해서 비트맵을 찍어줘야만 했다. 그 때부터 디버거가 직접 비트맵 핸들을 가시화해주면 어떨까라는 생각을 했었다.

오래 기다렸다. Visual Studio 2005의 새로운 디버깅 기능 중, Visualizer라는 것이 내가 원했던 것을 이제 해주고 있다. 아쉽게도 C/C++은 아직 이 기능을 사용하지 못한다.

어쨌든 C#에서 지원되는 기능을 보자. 다음 그림을 보라. 놀랍지 않은가!! [1]
단순히 문자로 가시화하기 힘든 복잡한 데이터를 저렇게 사용자가 직접 가시화할 수 있다는 것은 정말로 편한 기능이 아닐 수 없다.

대략 비주얼라이저를 요약하면 사용자가 디버깅 중 임의의 타입에 대한 가시화를 코드를 통해 짤 수 있다는 것이다. 다시한번 아쉽게도 C/C++은 아직 이런 수준까지는 할 수 없다.



그러나 아쉬워하기에는 이르다. 이미 VC++ 사용자에게 익숙한 autoexp.dat에 C# 수준은 아니지만 그래도 강력한 Visualizer가 이제 지원된다. 올 여름즈음에 디버깅을 하다가 특정 타입에 대한 출력 형태를 바꾸고 싶어서 오랜만에 autoexp.dat 파일을 찾아보았다. 그런데 생소한 [Visualizer] 섹션이 있었고, 나는 경악하지 않을 수 없었다. [2]

;------------------------------------------------------------------------------
;  std::map
;------------------------------------------------------------------------------
std::map<*>{
 children
 (
  #tree
  (
   head : $c._Myhead->_Parent,
      skip : $c._Myhead,
      size : $c._Mysize,
      left : _Left,
      right : _Right
  ) : $e._Myval
 )
      
 preview
 (
  #(
   "[",
   $e._Mysize,
   "](",

   #tree
   (
    head : $c._Myhead->_Parent,
    skip : $c._Myhead,
    size : $c._Mysize,
    left : _Left,
    right : _Right
   ) : $e._Myval,

   ")"
  )
 )      
}

이 코드가 어떤 일을 하는지 바로 그림을 통해 알아보자.
놀랍지 않은가!! STL의 map 자료구조에 있는 원소들을 일목요연하게 보여주고 있는 것이다. STL의 map은 Red-Black 트리로 구현이 되어있다. 따라서 주어진 key에 대해 원소들이 정렬이 되어있고, 이것을 그대로 확인할 수 있다. VS 2003 까지는 STL 자료구조를 디버깅 중에 Watch 창을 통해 원소들의 내용을 알아내기란 정말로 힘든 일이었다. 이렇게 말이다.
아직 C/C++ Visualizer에 대한 자료는 많지 않다. MSDN에도 Visualizer에 사용된 문법에 대한 문서는 아직 없고, 많은 자료도 찾을 수 없었다. 그러나 이미 autoexp.dat에는 풍부한 예가 있다. 그럼 코드를 잠깐 살펴보자.

먼저, 사용자가 오버라이딩하고 싶은 클래스 프로토타입을 쓰고 (std::map<*>), 크게 children 부분과 preview 부분을 작성한다. Preview 부분은 마우스 툴팁에 뜰 내용이고, children 부분은 +로 내용을 확장할 경우를 담당한다.

Preview 섹션에서는 먼저 전체 원소의 개수를 보여준다. [$e._MySize] 그리고 #tree라는 반복 구문을 통해 트리 원소들을 순회하고 있다.

일반적인 트리의 자료구조는 root, left, right, parent 정도가 가능하다. 이들에 대응되는 포인터 값을 써주고 있다. 그리고 skip이라는 필드도 보인다. 잠깐 부연 설명을 하면 이렇다. Red-Black 트리의 구현은 알고리즘 책 중 가장 유명한 CLRS의 구현을 따른다. 이 책의 구현에 따르면 null 체크를 간단히 하기 위해 sentinel nil node라는 것을 두고 있다. 즉, null에 대응되는 더미 노드를 만드는 것이다. 루트는 부모 노드가 없으므로 이 경우는 특별히 skip 하라는 명령을 줘야할 것이다. 그래서 skip 필드가 있는 것이다. (어디까지 나의 추측)



이제 응용을 해보자. 나는 ATL Collection Library를 애용한다. 그 중에서도 Red-Black 트리에 기초한 CRBMap을 많이 쓴다. STL의 map과 같은 Red-Black 트리이므로 그대로 코드를 가져오면 될 것이다. 그러나 약간의 상이함이 있었다. skip/head 필드를 약간 손 봐야했다. (CRBTree 클래스는 CLRS의 Red-Black 트리 구현을 완벽히 따르고 있다.)
;--------------------------------------------------------------------------­---- 
;  CRBTree
;--------------------------------------------------------------------------­----
ATL::CRBTree<*>{
 children
 (
  #tree
  (
   head : $c.m_pRoot,
      skip : $c.m_pRoot->m_pParent,
      size : $c.m_nCount,
      left : m_pLeft,
      right : m_pRight
  ) : $e.m_value
 )
      
 preview
 (
  #(
   "[",
   $e.m_nCount,
   "](",

   #tree
   (
    head : $c.m_pRoot,
    skip : $c.m_pRoot->m_pParent,
    size : $c.m_nCount,
    left : m_pLeft,
       right : m_pRight
   ) : $e.m_Value,
   ")"
  )
 )      
}

그 외, std::vector 소스를 기반으로 CArrayCAtlArray도 만들어보자. 다음과 같다.
아쉽게도 CMap 이나 CAtlMap 같은 hash-table은 일반적인 for와 같은 순환 문법이 없어서 제대로 보여줄 수가 없었다. 다음 버전에는 추가되리라 믿는다.

내가 Visual Studio를 너무나도 사랑하는 이유는 강력한 디버깅 기능에 있다. 디버깅은 단순히 버그 잡는 것 뿐만 아니라 프로그램이 어떻게 흘러가는가를 이해하는데 가장 좋은 도구이다. 이번에 추가된 visualizer 기능으로 VS의 디버깅 기능은 한층 더 강화되었다. 아직 써보지 않았다면 당장 써볼 것을 강력추천한다.


[1] http://www.codeproject.com/csharp/ImageVisualizer.asp
[2] C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger\autoexp.dat
by object | 2006/10/22 16:10 | 컴퓨터 | 트랙백(2) | 핑백(3) | 덧글(10)
트랙백 주소 : http://minjang.egloos.com/tb/468834
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from 내안의 5마리 악마를 .. at 2006/10/23 00:43

제목 : Visual Studio 2005 의 막강한 Vis..
Visual Studio 2005 의 막강한 Visualizer 기회가 되면 써보자. ^^...more

Tracked from snowflower의 .. at 2006/10/23 15:53

제목 : Visual Studio 2005 의 막강한 Vis..
object님의 블로그에서 퍼온 글입니다. Visual Studio 2005 의 막강한 Visualizer ----- 확실히 2005에서 디버깅이 편해진듯.. stl 쪽의 vector나 list같은데서 내용물을 다 볼 수 있으니까 진짜 좋아요. ...more

Linked at 염장똥꾸 : web devel.. at 2007/08/22 09:07

... 웹 개발 관련 도구 요즘은 개발시 파이어 폭스만 사용해서. FireBug 와 Yslow4 만 사용한다.. ... more

Linked at Developer Utopia.. at 2008/10/13 11:05

... 을 만들어서 따로 관리하시면 됩니다.Linkshttp://www.storeroom.info/cdm/http://minjang.egloos.com/1339645http://minjang.egloos.com/468834http://www.rememberthemilk.com/ ... more

Linked at Named Boost Tupl.. at 2009/05/01 01:39

... 쉽고 직렬화하기도 편한 객체처럼 보일 것 같은데&#8230; (여전히 디버거에서는 보기가 귀찮지만.. autoexp.dat 를 잘 고치면 해결할 수 있지 않을까나~) Related posts:boost tuple ba ... more

Commented by 머스타드 at 2006/10/23 12:15
언젠가부터 Java만 쓰기 시작한 이후로 eclipse의 막강함에 감탄을 금치 못했는데, 그 사이에 VS도 발전을 거듭하고 있었군요. 코드가 복잡해 질수록 Watch 창에 명령어를 일일이 쳐넣는 것이 귀찮아지고 있는데, eclipse에도 저런 기능이 있다면 좋겠어요. 누가 만들어 놓은게 없을라나.. ^-^
Commented by object at 2006/10/23 15:09
이클립스 좋은 툴이라고 칭찬이 많네요. 저는 자바를 쓰지 않아서 그 위력은 잘 모르겠습니다. 리눅스에서 개발하는 것이 저는 참 고역인데요. 이클립스 정도되는 툴만 C/C++에 있었으면 좋겠네요. 소스 코드 편집이야 그렇다쳐도 정말 디버깅은 죽음입니다. gdb로 한계를 느껴 DDD, Insight, KDeveloper와 같은 GUI frontend를 써봐도 굼뜨는 느린 속도에 소스 브라우징이 또 제한적이다보니 참 힘드네요.

C/C++ 프로그래머가 사용하는 VS의 기능은 1/10도 안될 것입니다. C# 개발자라면 VS는 정말 엄청난 툴입니다. 이클립스보다 수준이 뛰어넘을거라 감히 확신합니다 -_- .NET 프레임웍이 첨부터 IDE를 고려해서 만들어놓은 커스터마이저블한 클래스가 상당히 많습니다.
Commented by object at 2006/10/23 15:13
예를 들어 특정 컨트롤을 만들 때, 이것의 디자인타임 행동을 설정할 수 있습니다. 즉, IDE 폼 디자이너에서 이 해당 컨트롤을 편집할 때의 행동을 정의할 수 있죠. 또, 속성 중에서도 타입 디스크립터를 통해 속성을 나열해주는 프로퍼티 그리드에 별도의 UI를 추가할 수도 있습니다. 첨엔 이거 보고 참 많은 감동을 받았죠. (제가 이런 툴을 만드는 일을 해서 그럴지도 모르겠지만)
Commented by snowflower at 2006/10/23 15:51
트랙백좀 해가겠습니다~ 참으로 유용한 정보같네요
Commented by object at 2006/10/23 16:37
글 쓰다가 마우스 백버튼 잘 못 눌러 다 날리고;; 그럼에도 불구하고 좋은 정보라고 생각되어 힘내서 다시 썼습니다. 유용하다고 생각하시니 저도 기쁩니다.
Commented by Sikuru at 2006/10/24 11:45
블로그에 덧글 감사합니다. =) 링크신고드리구요~
이제 C/C++ 에 발들여서 삽질하는 입장으론 많이 배울만한 블로그 같습니다.
Commented by kpro1999 at 2008/11/09 19:56
정말 유용한 자료감사드립니다~ http://cafe.naver.com/agds 에 글을 링크 시켜놓았습니다,
Commented at 2009/09/09 18:44
비공개 덧글입니다.
Commented by object at 2009/09/09 23:17
네 아무런 문제 없습니다. 맘껏 가져가세요~
Commented by 박PD at 2009/09/12 14:14
감사합니다. :)

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04
저도 아들 돌잔치때 돌잡이 ..
by 박상욱 at 01/18
미국 대학원 원서 작성중에 p..
by 태클사이야 at 01/13
TO: 박PD 로그인 하지 않아..
by 박응용 at 01/10
http://gigglehd.com/zbx..
by dhunter at 12/28
우와.. 좋네요. 태반이 ..
by 윤광배 at 12/17
항상 좋은 글 잘 보고 있습니..
by y2k at 11/23
글이 좋아서 제 블로그에 담..
by 쏭섭 at 11/23
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스