다음을 통해 공유


EEAddIn 샘플: 디버깅 식 계산기 추가 기능

EEAddin 샘플은 식 계산기 추가 기능 API를 사용하여 네이티브 디버거 식 계산기를 확장하는 방법을 보여 줍니다.

보안 정보보안 정보

이 샘플 코드는 개념을 설명하기 위한 것으로 개념과 관련된 코드만을 보여 줍니다. 특정 환경에 대한 보안 요구 사항을 충족하지 못 할 수 있고 표시된 그대로 사용하면 안됩니다. 안전하고 강력한 프로젝트를 만들려면 보안 및 오류 처리 코드를 추가하는 것이 좋습니다. Microsoft에서는 어떠한 보증도 없이 “있는 그대로” 이 샘플 코드를 제공합니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

Visual Studio에서 샘플에 액세스하려면

  • 도움말 메뉴에서 샘플을 클릭합니다.

    기본적으로 샘플은 drive:\Program Files\Microsoft Visual Studio 10.0\Samples\에 설치되어 있습니다.

  • 이 샘플의 최신 버전과 다른 샘플의 목록을 보려면 MSDN 웹 사이트에서 Visual Studio 샘플을 참조하십시오.

EE 추가 기능 API

식 계산기는 식을 해석(계산)하는 디버거의 일부입니다. 식에 중단점을 설정하거나 디버거 창에서 식을 입력하면 식 계산기가 입력된 내용을 해석합니다. 자세한 내용은 디버거에서 사용하는 식을 참조하십시오. 식 계산기 추가 기능 API를 사용하면 식 계산기를 확장하여 새 형식을 처리할 수 있습니다.

새 형식에 맞게 식 계산기를 확장하려면 autoexp.dat와 동일한 디렉터리에 있는 Win32 DLL의 일부로 함수를 기록하고 이름별로 내보냅니다. 또한 사용자 정의 데이터 형식의 요소 표시 파일에 한 줄을 추가해야 합니다. DLL에서 여러 함수를 내보내면 둘 이상의 형식에 대해 식 계산기를 확장할 수 있습니다.

샘플 빌드 및 실행

이 샘플을 빌드 및 실행하는 데 필요한 단계는 다음과 같이 세 부분으로 나뉘어집니다.

이 샘플을 빌드하고 실행하려면

  1. 식 계산기 추가 기능 DLL(eeaddin.dll)을 빌드합니다.

  2. 식 계산기 추가 기능 DLL을 사용하도록 autoexp.dat를 편집합니다.

  3. autoexp.dat에 의해 평가되는 사용자 지정 데이터 형식을 사용하는 프로젝트를 만들어 추가 기능을 테스트합니다.

다음 절차는 이러한 단계를 자세하게 설명합니다.

식 계산기 추가 기능 DLL을 빌드하려면

  1. Visual Studio에서 eeaddin.sln 솔루션을 엽니다.

  2. 빌드 메뉴에서 빌드를 클릭합니다.

  3. 결과로 나온 eeaddin.dll을 common7\ide 디렉터리(devenv.exe가 들어 있는 디렉터리)에 복사합니다.

  4. 파일 메뉴에서 솔루션 닫기를 클릭합니다.

autoexp.dat를 편집하려면

  1. 파일 메뉴에서 열기를 선택한 다음 파일을 클릭합니다.

  2. 파일 열기 대화 상자에서 common7\packages\debugger 디렉터리에 있는 autoexp.dat 파일을 찾은 다음 열기를 클릭합니다.

  3. autoexp.dat를 편집하여 다음 줄을 추가합니다.

    _SYSTEMTIME=$ADDIN(eeaddin.dll,AddIn_SystemTime@28)
    _FILETIME=$ADDIN(eeaddin.dll,AddIn_FileTime@28)
    

    autoexp.dat를 저장합니다.

사용자 지정 데이터 형식을 사용하는 프로젝트를 만들려면

  1. 파일 메뉴에서 New를 가리킨 다음 프로젝트를 클릭합니다.

  2. 새 프로젝트 대화 상자에서 Visual C++ 프로젝트를 선택하고 MFC 응용 프로그램을 클릭한 다음 프로젝트 이름을 입력하고 확인을 클릭합니다.

  3. MFC 응용 프로그램 마법사에서 마침을 클릭합니다. 다음 단계에서 MFC 함수를 추가하기 때문에 이 프로젝트는 MFC 응용 프로그램이어야 합니다.

  4. MFC 응용 프로그램에서 SYSTEMTIME 또는 FILETIME 프로젝트를 추가합니다.

    SYSTEMTIME *s = new SYSTEMTIME();
    FILETIME *f = new FILETIME();
    GetSystemTime(s);
    SystemTimeToFileTime(s,f);
    
  5. 빌드 메뉴에서 빌드를 클릭합니다.

  6. 디버깅을 시작하고 조사식 창에서 SYSTEMTIME 또는 FILETIME 개체를 검사합니다.

샘플 작동 방식

사용자 지정 데이터 형식에 맞게 식 계산기를 확장하려면 식 계산기 추가 기능 DLL에 사용자 지정 뷰어 함수를 기록합니다. 이 함수는 확장하려는 식 계산기의 메모리 공간이 아니라 디버깅되는 프로그램의 메모리 공간에 있는 개체에 대한 포인터를 사용합니다. 이 포인터와 함께 일반 캐스트는 사용할 수 없으며, 콜백 함수를 사용하여 이 포인터와 포인터가 가리키는 데이터를 읽어야 합니다. DEBUGHELPER* 형식의 콜백 포인터는 다양한 메서드를 가진 개체를 가리킵니다.

구문은 다음과 같습니다.

HRESULT WINAPI CustomViewer(
   DWORD dwAddress,       // low 32-bits of address
   DEBUGHELPER *pHelper,  // callback pointer to access helper functions
   int nBase,             // decimal or hex
   BOOL bIgnore,          // not used
   char *pResult,         // where the result needs to go
   size_t max,            // how large the above buffer is
   DWORD dwReserved       // always pass zero
)

이 샘플의 timeaddin.cpp에는 이러한 형식의 함수로 구현된 AddIn_SystemTime 및 AddIn_FileTime이 포함되어 있습니다. custview.h에 정의된 DEBUGHELPER 구조체는 확장을 작성하는 데 도움이 되는 함수 포인터로 구성됩니다. 이 포인터는 CustomViewer 함수에 전달되고 이 포인터를 사용하여 도우미 함수를 호출할 수 있습니다.

pHelper->GetProcessorType을 사용하여 프로세서 유형을 확인할 수 있습니다. 메모리를 읽기 위한 메서드에는 pHelper->ReadDebuggeeMemory 및 pHelper->ReadDebuggeeMemoryEx 두 가지가 있습니다. ReadDebuggeeMemoryEx는 64비트 주소를 처리하고 Visual Studio .NET 디버거에 의해 지원됩니다. ReadDebuggeeMemory는 64비트 주소를 처리하지 않으며 Visual Studio .NET 및 Visual C++ 6.0 디버거에 의해 지원됩니다. 추가 기능이 Visual Studio .NET 디버거 전용으로 디자인된 경우 ReadDebuggeeMemoryEx를 사용할 수 있습니다. 추가 기능이 Visual C++ 6.0에서도 작동해야 한다면 dwVersion 필드를 검사하고 Visual C++ 6.0에 대해 ReadDebuggeeMemoryEx를 호출하지 말아야 합니다.

다음은 두 디버거에서 모두 작동하고 디버깅되는 프로그램에서 형식이 MyType인 localobject의 내용을 읽는 코드입니다.

DWORDLONG qwRealAddress;
DWORD dwGot;
MyType localobject;
if (pHelper->dwVersion<0x20000)
{
   // Visual C++ 6.0 version
   qwRealAddress = dwAddress;
   pHelper->ReadDebuggeeMemory( pHelper, dwAddress, 
      sizeof(localobject), &localobject, &dwGot );
}
else
{
   qwRealAddress = pHelper->GetRealAddress(pHelper);
   pHelper->ReadDebuggeeMemoryEx( pHelper, qwRealAddress, 
      sizeof(localobject), &localobject, &dwGot );
}
// TODO: display localobject here

autoexp.dat 편집

autoexp.dat의 [AutoExpand] 섹션에 추가하는 줄에는 다음 구문이 포함되어야 합니다.

type=$ADDIN(dllname.dll,exportname)

예를 들면 다음과 같습니다.

_SYSTEMTIME=$ADDIN(eeaddin.dll,AddIn_SystemTime)

또는

_FILETIME=$ADDIN(eeaddin.dll,AddIn_FileTime)

DLL이 devenv.exe가 포함된 디렉터리나 PATH에 없을 경우 DLL의 전체 경로 이름을 사용해야 합니다. exportname 인수는 대/소문자를 구분하며 DLL에서 dumpbin –exports를 실행하여 얻은 내보낸 이름과 정확하게 일치해야 합니다.

새 추가 기능으로 디버거를 테스트하려면 우선 새 DLL을 설치할 때 수행하던 프로그램 디버깅을 중단하고 새 디버거 세션을 시작합니다.

참고 디버거 내에서 실행되므로 코드가 손상된 경우 IDE가 손상되므로 주의해야 합니다.

참고 항목

기타 리소스

일반 샘플