3. Visualizer 的作用是在debug 时能根据用户的特殊需求来展示自定义数据,这个扩展和WATCH1查看变量的功能很类似。
例如,可以将下面这个类型的数据,以特点的方式展示给用户,易于用户理解(20xx/xx/xx)
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
EEAddIn Sample: Debugging Expression Evaluator Add-In 可以从这个链接中看到频屏和源代码。
其中,在custview.h头文件的声明是不能更改的。
typedef struct tagDEBUGHELPER
{
DWORD dwVersion;
BOOL (WINAPI *ReadDebuggeeMemory)( struct tagDEBUGHELPER *pThis, DWORD dwAddr, DWORD nWant, VOID* pWhere, DWORD *nGot );
// from here only when dwVersion >= 0x20000
DWORDLONG (WINAPI *GetRealAddress)( struct tagDEBUGHELPER *pThis );
BOOL (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 );
谁来调用AddIn_SystemTime这个函数呢,答案是NatDbgEE.dll!7198d8e8() 如下图所示:
如何才能在AddIn_SystemTime函数中下断点呢?
1. 分别用VS打开eeaddin solution 和Debugging Evaluator solution.
2. 编译eeaddin solution 并将其DLL和pdb 放到D:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE中
3. 修改autoexp.dat如
[AutoExpand]
_SYSTEMTIME=$ADDIN(eeaddin.dll,AddIn_SystemTime)
4.编译运行Debugging Evaluator solution. 显示正确。
5. 将eeaddin solution attach到 Debugging Evaluator solution VS IDE上,然后再运行Debugging Evaluator solution.将在AddIn_SystemTime中下断点。 当mouse move over SYSTEMTIME 变量时,断点就被激活。