Visual C++ Profile的简单使用方法

上次说到C++函数计时,但是自从VC6以后,Profile功能便从Team Server Editions以外的版本中去掉了,如果没有此版本的VC,只能自己动手了。这是另一种使用Profile的方法,根据MSDN关于/callcap 的说明,编译WinCE应用程序时可以使用这个开关,试过后在Win32平台上也可以。这里需要注意的是在_CAP函数中,最好不修改寄存器,那样可能导致被调用的函数产生错误。参考:
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编译,然后再联接到调试的程序中。这种方式调试函数仍然不太方便,只能知道一个函数指针,无法知道函数名称。
 

ExpandedBlockStart.gifContractedBlock.gif extern "C" dot.gif {
InBlock.gif   
//
void __stdcall _CAP_Profiling(void* func);
InBlock.gif   
//
void __stdcall _CAP_Start_Profiling(void* func, void* called);
InBlock.gif   
//void __stdcall _CAP_End_Profiling(void* func);

InBlock.gif
    void __stdcall _CAP_Enter_Function(void* func);
InBlock.gif    
void __stdcall _CAP_Exit_Function(void*
 func);
ExpandedBlockEnd.gif}

None.gif
None.gif
void __stdcall _CAP_Enter_Function(void*  func)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif
InBlock.gif    __asm
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif
{
InBlock.gif        pushad        
//堆栈中按顺序压入寄存器: EAX,ECX,EDX,EBX,ESP,EBP,ESI和EDI

InBlock.gif
        pushfd
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif   //这里添加代码
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif    __asm 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        popfd
InBlock.gif        popad
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
void __stdcall _CAP_Exit_Function(void*  func)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
{
InBlock.gif    __asm 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif
{
InBlock.gif        pushad
InBlock.gif        pushfd
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif
InBlock.gif    __asm 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        popfd
InBlock.gif        popad
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/Tue/archive/2008/07/19/1246460.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值