Visual C++ 10에서 디버깅하기

Visual C++ 10 2012.04.25 00:28 Posted by 흥배

예전에 Visual C++ 10과 관련된 책을 집필할 계획이 있어서 그때 작성한 글인데 책 출간 계획이 사라졌으므로(한참 전에)

그냥 공개합니다. 글은 초보자를 타겟으로 하고 있으며 Visula C++ 10의 디버깅 기능을 설명하고 있습니다.


도움이 되었으면 좋겠습니다^^



6장 디버깅.pdf


문서를 동의 없이 수정하지 않고, 출처만 남겨 주신다면 문서는 마음대로 배포하셔도 괜찮습니다^^


저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

인텔리 트레이스를 보면, 상황에 따라 정말 편리하게 사용할 수 있게 잘 만들어져 있습니다. 그런데, 다양한 이벤트를 로그에 남길수 있도록 지원하고 있지만 목록에 없는 이벤트를 어떻게 잡아야 할까요? 예를 들어서 우리 팀이나 내가 자주 사용하는 메서드를 이벤트 로그에 기록을 자동으로 남기고 싶을 때 말이죠.

예를 들어서, 다음과 같은 클래스 라이브러리 프로젝트가 있습니다. 이 메서드가 우리 팀에서 자주 사용하는 메서드이며, 이벤트 로그에 자동으로 남도록 하고 싶다고 가정해보겠습니다.

namespace BoramLib
{
    public class Logger
    {
        public static void Herehere(string msg)
        {
        }
    }
}

즉, 위와 같은 메서드가 실행 될때 마다 자동으로 인텔리 트레이스에 이벤트 기록으로 남기려고 합니다. 그런데, 인텔리 트레이스는 이벤트 셋을 수정할 수 있는 공식적인 방법은 제공하지 않습니다. 그래서 약간의 설정 작업을 통해서 이벤트를 추가해야 하는데요. 지금부터 한번 살펴보시죠.

'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools\ko'폴더를 찾아가시면, 인텔리 트레이스의 모든 설정이 담긴 CollectionPlan.xml이라는 파일이 있습니다. 이 파일을 Visual Studio에서 엽니다. 그리고 'TracePointProvider'항목 안에 'Categories'항목을 찾습니다. 그리고 그 항목 안에 다음과 같이 커스텀 이벤트 카테고리를 추가합니다.

<Category Id="BoramLib.Logger" _locID="category.BoramLib.Logger">Logger</Category>

설정 파일을 저장한 후에, Visual Studio를 재 시작해서, 인텔리 트레이스의 옵션으로 가보면,


위와 같이 Logger라는 이름으로 카테고리가 추가되었습니다. 이제, 실제로 이 카테고리에서 어떤 모듈에 대해서, 어떤 메서드의 이벤트를 잡으며, 어떻게 출력할 것인지를 설정하도록 하겠습니다.

CollectionPlan.xml에서 'ModuleSpecifications'항목 안에 다음과 같이 dll이름을 명시해줍니다.

<ModuleSpecification Id="BoramLib.Logger">BoramLib.dll</ModuleSpecification>

그리고 BoramLib.dll을 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools'에 복사해 넣습니다.


그리고 CollectionPlan.xml에서 'DiagnosticEventSpecifications'항목을 찾아서 다음과 같은 항목을 추가합니다.

<DiagnosticEventSpecification>
  <CategoryId>BoramLib.Logger</CategoryId>
  <SettingsName _locID="settingsName.BoramLib.Logger.Herehere">Herehere!!</SettingsName>
  <SettingsDescription _locID="settingsDescription.BoramLib.Logger.Herehere">
      여기서 Herehere 메서드가 실행되었습니다.</SettingsDescription>
  <Bindings>
    <Binding>
      <ModuleSpecificationId>BoramLib.Logger</ModuleSpecificationId>
      <TypeName>BoramLib.Logger</TypeName>
      <MethodName>Herehere</MethodName>
      <MethodId>BoramLib.Logger.Herehere():System.Void</MethodId>
      <ShortDescription _locID="shortDescription.BoramLib.Logger">
           Herehere "{0}"</ShortDescription>
      <LongDescription _locID="longDescription.BoramLib.Logger">
           여기서 Herehere 메서드가 실행되었습니다. "{0}"</LongDescription>
      <DataQueries>
        <DataQuery index="0" maxSize="4096" type="String" name="로그 메세지" 
            _locID="dataquery.BoramLib.Logger.Msg" _locAttrData="name" query=""></DataQuery>            
      </DataQueries>
    </Binding>
  </Bindings>
</DiagnosticEventSpecification>

인텔리 트레이스 세부 항목 이름(SettingName)과 타입 이름, 메서드 이름, 인텔리 트레이스 이벤트 제목(ShortDescription), 이벤트 상세 내용(LongDescription)등을 기록합니다. 그리고 메서드의 리턴 타입이나 매개변수등을 DataQuery항목에서 잡아서, 메세지에 출력하도록 할 수 있습니다. DataQeury의 속성 중에 중요한 것에 대해서 좀 더 자세한 설명을 드리면요~,

- index : 필수 속성이며, -1이면 리턴 값을 나타내며, 인스턴스 메서드의 경우는 0이 인스턴스를 가리키며, 1부터 차례대로 매개변수를 가리킨다. static 메서드의 경우는 0부터 차례대로 매개변수를 나타낸다. 즉, 위 Herehere메서드는 static메서드 이므로 0번은 msg 매개변수를 가리킨다.

- type : 인덱스에 해당하는 값의 타입을 명시하며, Boolean ,Char ,Double ,Single (float) ,Int16 ,UInt16 ,Int32 ,UInt32 ,Int64 ,UInt64 ,String타입이 명시 가능하다. 이 값에 포함되지 않는 타입은 IProgammableDataQuery를 구현하는 다른 방법을 사용해야 한다. 

이런 설정을 통해서 메세지에 포함할 값을 명시할 수 있는 것이죠. 설정을 저장한 후에, Visual Studio를 재시작 합니다. 이제 커스템 이벤트를 잡을 준비는 마쳤으므로, 실제로 커스텀 이벤트를 잡는 코드를 작성해보겠습니다. 간단한 콘솔 어플리케이션을 생성한 다음에, BoramLib.dll을 참조추가합니다.

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            BoramLib.Logger.Herehere("프로그램 시작");

            BoramLib.Logger.Herehere("프로그램 끗");
        }
    }
}

위와 같이 Herehere메서드를 두번 사용하고 나서,


옵션에서 Logger의 Herehere!!항목이 선택되어 있는지 확인합니다. 그리고 Main메서드의 닫는 중괄호(})에 중단점을 놓고 디버깅을 시작합니다.


그러면 위와 같이 인텔리 트레이스의 이벤트 로그에 Herehere메서드가 잡힌 것을 볼 수 있습니다. 이렇게 여러분이 직접 필요한 메서드에 대한 이벤트를 잡도록 설정해서 로그를 활용할 수 있습니다.


- 참고자료

1. http://blog.qetza.net/en/2010/03/08/vs-2010-personnalisation-des-vnements-de-lintellitrace/
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

VC++ 10 C++0x나 병렬 프로그래밍 라이브러리 이외에도 툴적인 측면에서도 여러 좋은 기능들이 추가 되었습니다. 알고 있으면 작업할 때 편리한데 시간이 부족하여 제가 아직 자세하게 찾아보지 못해서 소개하지 못한 것이 많이 아쉽습니다. 그래서 짥은 것이라도 틈틈이 시간나면 소개하려고 합니다.

 

 

VC++ 10에서는 디버깅 모드에서도 역어셈블리 코드를 볼 수 있습니다.

 

메뉴에서 “Debug” -> “Windows” -> “Disassembly”를 선택합니다.



아래와 같이 역어셈블리 코드 창이 나타납니다.



그러나 위 화면을 보면 코드 바이트는 표시되지 않고 있습니다.

코드 바이트를 보고 싶다면 위 화면 왼쪽 상단의 “Viewing Option”을 클릭합니다.



위와 같이 옵션을 선택할 수 있습니다. 이 중 “Show code bytes”를 선택합니다.

그러면 아래와 같이 코드 바이트가 표시됩니다.



 

 

 

참고

http://d.hatena.ne.jp/kkamegawa/20100130/p1

 

저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License


 

티스토리 툴바