http://www.google.com/codesearch?hl=zh-CN&q=/callcap+show:XEUTuTjJJm4:ODErFHofTDk:XEUTuTjJJm4&sa=N&cd=1&ct=rc&cs_p=http://google-gears.googlecode.com/svn&cs_f=gears/base/common/trace_buffers_win32/trace_buffers_win32.cc#l91
另外,如果直接把函数实现和调试的程序放在一个项目中编译,将会使CAP函数产生递归调用而导致堆栈溢出,处理方法是在一个静态库中不使用/callcap编译,然后再联接到调试的程序中。这种方式调试函数仍然不太方便,只能知道一个函数指针,无法知道函数名称。
extern "C" {
//void __stdcall _CAP_Profiling(void* func);
//void __stdcall _CAP_Start_Profiling(void* func, void* called);
//void __stdcall _CAP_End_Profiling(void* func);
void __stdcall _CAP_Enter_Function(void* func);
void __stdcall _CAP_Exit_Function(void* func);
}
void __stdcall _CAP_Enter_Function(void* func)
{
__asm
{
pushad //堆栈中按顺序压入寄存器: EAX,ECX,EDX,EBX,ESP,EBP,ESI和EDI
pushfd
}
//这里添加代码
__asm
{
popfd
popad
}
}
void __stdcall _CAP_Exit_Function(void* func)
{
__asm
{
pushad
pushfd
}
__asm
{
popfd
popad
}
}
//void __stdcall _CAP_Profiling(void* func);
//void __stdcall _CAP_Start_Profiling(void* func, void* called);
//void __stdcall _CAP_End_Profiling(void* func);
void __stdcall _CAP_Enter_Function(void* func);
void __stdcall _CAP_Exit_Function(void* func);
}
void __stdcall _CAP_Enter_Function(void* func)
{
__asm
{
pushad //堆栈中按顺序压入寄存器: EAX,ECX,EDX,EBX,ESP,EBP,ESI和EDI
pushfd
}
//这里添加代码
__asm
{
popfd
popad
}
}
void __stdcall _CAP_Exit_Function(void* func)
{
__asm
{
pushad
pushfd
}
__asm
{
popfd
popad
}
}