程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ profile應用技巧分析

C++ profile應用技巧分析

編輯:C++入門知識

想必用過C++編程語言的開發人員會發現,這一應用廣泛的計算機應用語言確實比較復雜,要想完全弄清其中的功能特點,是一個非常艱巨的任務。在這篇文章中我們先來了解一下C++ profiler的簡單用法。

  • C++統計對象個數方法詳解
  • C++ makefile寫法標准格式簡介
  • C++獲取文件具體方法詳解
  • C++單件模式實現代碼詳解
  • C++標准擴展應用技巧分享

自從VC6以後,C++ profile功能便從Team Server Editions以外的版本中去掉了,如果沒有此版本的VC,只能自己動手了。這是另一種使用Profile的方法,根據MSDN關於/callcap 的說明,編譯WinCE應用程序時可以使用這個開關,試過後在Win32平台上也可以。這裡需要注意的是在_CAP函數中,最好不修改寄存器,那樣可能導致被調用的函數產生錯誤。

另外,如果直接把函數實現和調試的程序放在一個項目中編譯,將會使CAP函數產生遞歸調用而導致堆棧溢出,處理方法是在一個靜態庫中不使用/callcap編譯,然後再聯接到調試的程序中。這種方式調試函數仍然不太方便,只能知道一個函數指針,無法知道函數名稱。

  1. extern "C" {  
  2. //void __stdcall _CAP_Profiling(void* func);  
  3. //void __stdcall _CAP_Start_Profiling(void* func, void* called);  
  4. //void __stdcall _CAP_End_Profiling(void* func);  
  5. void __stdcall _CAP_Enter_Function(void* func);  
  6. void __stdcall _CAP_Exit_Function(void* func);  
  7. }  
  8. void __stdcall _CAP_Enter_Function(void* func)  
  9. {  
  10. __asm  
  11. {  
  12. pushad //堆棧中按順序壓入寄存器: EAX,ECX,EDX,EBX,ESP,EBP,ESI和EDI  
  13. pushfd  
  14. }  
  15. //這裡添加代碼  
  16. __asm   
  17. {  
  18. popfd  
  19. popad  
  20. }  
  21. }  
  22. void __stdcall _CAP_Exit_Function(void* func)  
  23. {  
  24. __asm   
  25. {  
  26. pushad  
  27. pushfd  
  28. }  
  29. __asm   
  30. {  
  31. popfd  
  32. popad  
  33. }  

以上就是對C++ profile的相關介紹。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved