|
The .NET Profiling API and the DNProfiler Tool
http://msdn.microsoft.com/msdnmag/issues/01/12/hood/default.aspx
΢ÈíµÄ.NET Common Language Runtime(CLR)ÄÚ²¿ÌṩÁ˺ܶà»úÖÆÀ´´´½¨¸üÈÝÒ×ʹÓᢸüÃæÏò¶ÔÏóµÄƽ̨¡£°üÀ¨À¬»ø»ØÊÕ¡¢±ê×¼µÄ¿çÓïÑÔÒì³£´¦Àí¡¢¹ã·ºµÄÀà¿â¡¢ÔªÊý¾Ý¡¢ºÍÒÑ´ænative´úÂëµÄ»¥²Ù×÷ÐÔ¡¢Ô¶³Ì´¦Àí¡£Ò²°üÀ¨¿çcpuÖ¸Áî¸ñʽ£¨ÖмäÓïÑÔ£¬IL£©ºÍ½«IL±àÒë³ÉÄܹ»ÔÚÄ¿±êcpuÉÏÔËÐеĴúÂëµÄ¼´Ê±±àÒëÆ÷¡£
Ëæ×ÅϵͳµÄ·¢Õ¹±äµÃÔ½À´Ô½¸´ÔÓ£¬Äܹ»Àí½âϵͳµÄÄÚ²¿¹¤×÷»úÖÆ±äµÃÔ½À´Ô½ÓмÛÖµ¡£ÔÚWindows®£¬µ÷²é¿ÉÖ´ÐгÌÐò×°ÔØÆ÷¡¢ÄÚ´æ¹ÜÀíÆ÷µÄ²Ù×÷»úÖÆ½«Õ¹Ê¾ºÜ¶à²»Í¬µÄ¼¼ÇÉ¡£ÁíÍ⣬ÓÐЩ¼¼ÇÉÔÚwindow 9X ƽ̨ÏÂÄܹ»Õý³£¹¤×÷£¬µ«ÊÇÔÚWindows NT® ºÍWindows 2000²»Äܹ¤×÷£¬·´Ö®ÒàÈ»¡£ÔÚWin32®Ï£¬²é¿´½ø³ÌµÄÄÚ²¿²Ù×÷µÄ×îºÃ·½Ê½ÊÇʹÓõ÷ÊÔAPI£¬µ«ÊÇËüÒ²Ö»ÄÜÊǰüº¬ºÜÉÙµÄÒ»²¿·Ö¡£
ÔÚ.NETϾÍÍêÈ«²»Í¬ÁË¡£ÒòΪCLRÔËÐÐʱÊÇÈκÎ.NET³ÌÐòµÄÖÐÐÄ£¬ËüÌṩÁËÒ»¸öÂ߼λÖÃÀ´²åÈë¹³×ÓÒÔ±ã¹Û²ì.NETµÄÄÚ²¿¡£Ô¤¼Æµ½¹¤¾ß¿ª·¢Õß¡¢ÏµÍ³¼¶³ÌÐòÔ±µÄÐèÒª£¬MicrosoftʹÓÃ.NETÀ´ÌṩÁËÒ»¸ö·Ç³£ÏêϸµÄ¡¢Ò»Öµķ½Ê½È¥¹Û²ì½ø³ÌµÄÄÚ²¿²Ù×÷¡£±¾Ô£¬ÎÒÒªÃèÊöÕâÖÖ»úÖÆ¡¢²¢Ìṩһ¸ö³ÌÐò£¨DNProfile£©À´¼Ç¼.NETÔËÐÐʱµÄ²Ù×÷¡£
The .NET Profiling API
¹Û²ì.NETÔËÐÐʱ¶¯×÷µÄÒ»ÖÖ·½Ê½Ê±Ê¹ÓÃÆÊÎöAPI¡£ÆÊÎöAPIµÄÃüÃû²»ºÃ£¬ÒòΪËü¶ÔºÜ¶àÖÖÊÂÇé¶¼ºÜÓÐÓ㬶ø²»½ö½öÊÇÆÊÎö¡£¿¼ÂÇ¿ÉÒÔ±»ÆÊÎöAPI¹Û²ìµÄ.NET¶¯×÷ÁÐ±í£¬ÈçÏ£º
Figure 1 Functions of the Profiling API
CLR startup and shutdown
Application domain creation/shutdown
Assembly loads/unloads
Module loads/unloads
Class loads/unloads
COM interop VTable creation/destruction
JIT-compiles, code pitching, and pre-JITed method searches
Thread creation/destruction/suspends
Remoting activity
Exception handling
Managed/unmanaged code transitions
Garbage collection and managed heap objects
Method entry/exit
ÕýÈçKeanu Reeves»á˵Whoooa! Ïà¶ÔÓÚ¾¹ýÁ˶àÄêµÄ¼è¿à̽Ë÷ÕÒµ½µÄÈçºÎ¸øWINDOWS°²×°¹³×ÓÀ´½²£¬Microsoftʹ¹Û²ìCLRµÄÐÐΪ±äµÃ·Ç³£ÈÝÒ×ÁË¡£ÁбíÖеÄÿһ¸ö¶¯×÷¿ÉÒÔ¿´×÷Ò»¸öÍêÈ«²»Í¬µÄCALLBACK¡£ÀíÂÛÉϽ²£¬½ö½öÔÚCALLBACKº¯ÊýÖÐдÐèÒªµÄ´úÂë¾Í¿ÉÒÔÁË¡£
ÏÖÔÚ£¬×îºÃµÄÆÊÎöAPIÎĵµÊÇ.NET SDKϵÄProfiling.doc£¬ÔÚTool Developers Guide\docsĿ¼Ï¡£¶ÔÓÚBeta2 À´½²£¬Õâ¸öÎĵµºÍʵÏÖÉÔ΢ÓÐЩ²»Í¬²½¡£ÔÚ±¾ÆÚ¿¯ÖУ¬ÎÒ²»»á¹ã·ºµÄÌÖÂÛÆÊÎöAPIµÄÿһ¸ö·½Ã棬¶øÊÇÖØµãÌÖÂÛÆÊÎöAPIÄÜ×öµÄ´óµÄ·½Ãæ¡£
.NETµÄÒ»¸ö´óµÄÂôµãÊÇËü²»ÔÙʹÓÃCOM¡£Õâ²»ÊÇÕæµÄ£¬ÊÂʵÉÏ£¬ÆÊÎöAPI¾ÍÊÇ»ùÓÚCOMµÄ¡£Ê¹ÓÃÆÊÎöAPI°üÀ¨´´½¨Ò»¸ö½ø³ÌÄÚ·þÎñÆ÷£¬ËüʵÏÖÁ˵¥Ò»µÄ½Ó¿Ú¡£Ã¿Ò»¸ö½Ó¿Ú·½·¨´ú±íÁËFigure 1ÖеÄÒ»¸öʼþ¡£ÔÚCALLBACK·½·¨ÄÚ²¿£¬´úÂë¿ÉÒÔʹÓÃÁíÍâµÄCOM½Ó¿Ú£¨ÓÉCLRÌṩ£©À´µÃµ½¹Û²ìʼþµÄÐÅÏ¢¡£
¸öÈËÀ´½²£¬ÎÒϲ»¶¸ü¼òµ¥µÄAPIÀ´¶ÔËù¸ÐÐËȤµÄÿһ¸öʼþ½øÐÐ×¢²á¡£½«APIʵÏÖ×÷Ϊһ¸öCOM¶ÔÏóÇ¿ÆÈÄãд¼¸ºõͬÑùµÄ´úÂëÒÔ±ãʹÓÃCOM¶ÔÏó¡£¼ÈÈ»ÆÊÎöAPIÊÇ»ùÓÚCOMµÄ£¬ÆÊÎöAPIµÄÓû§ºÜ¿ÉÄÜʹÓÃC++¡£
¾¡¹ÜʹÓõäÐ͵ÄCOM¶ø²»ÊÇʹÓÃÍйÜ.NET´úÂëÆð³õ¿´ÆðÀ´ÓÐÐ©Ææ¹Ö£¬×Ðϸ¿¼ÂÇÖ®ºó¾Í»áÃ÷°×¡£Èç¹ûÓÃÍйܴúÂëʵÏÖ½Ó¿Ú£¬Ëü½«¶Ô¼àÊÓµÄËùÓÐʼþµÄ²úÉú¸ºÃæÓ°Ïì¡£ÀýÈ磬Èç¹ûʵÏÖ½Ó¿ÚµÄÍйܴúÂë´¥·¢ÁËÒì³£Ôõô°ì£¿ÔÚAPIûÓ줻îµÄÇé¿öÏ£¬Ò쳣ʼþÒ²²»»á·¢Éú¡£
Ò»µ©ÄãÓÐÒ»¸öʵÏÖÁËProfiling½Ó¿ÚµÄCOM·þÎñÆ÷£¬ÏÂÒ»²½ÊÇÇ¿ÆÈCLR×°ÔØCOM·þÎñÆ÷¡¢µ÷ÓÃËüµÄ·½·¨¡£¼¼ÇÉÊÇÉèÖû·¾³±äÁ¿¡£¸ú×¢²á±í¡¢XMLÎļþ±È½ÏÆðÀ´£¬»·¾³±äÁ¿ÊÇͦ¹ÅÀϵġ£
Ϊʲô²»ÓÃ×¢²á±í£¨ÅäÖÃÎļþ£©¸æËßCLRÓ¦¸Ãµ÷ÓÃProfiling API£¿ÎÒ´ÓMicrosoft¿ª·¢ÕßÄÇÀïÌý˵µÄÒ»¸öÔÒòÊÇÄÇÒªÇó.NET³ÌÐòÔÚÆô¶¯Ê±¼ì²é×¢²á±í½«»áÓÐÐÔÄÜÓ°Ïì¡£¿¼Âǵ½.NETÆô¶¯Ê±ÓкܶàÊÂÇéÒª×ö£¬ÕâÑùµÄÔÒò¿¼ÂǵÄÒ²ÊǺÜÉ÷ÖØµÄ¡£ËäÈ»Èç´Ë£¬Ê¹Óû·¾³±äÁ¿¿ÉÒÔ¶ÔËùÓгÌÐòÆð×÷Óã¨Èç¹ûÔÚϵͳ»·¾³±äÁ¿£©»òµ¥¶ÀµÄ½ø³Ì¡£ÔÚºóÕßÇé¿öÏ£¬µ÷ÊÔÆ÷¡¢ÆÊÎöÆ÷µÈ¹¤¾ß¿ÉÒÔÔÚÆô¶¯³ÌÐòʱָ¶¨»·¾³±äÁ¿¡£ÉÔºóÎÒ½«ÌÖÂÛËùÐèÒªµÄ»·¾³±äÁ¿¡£
The .NET Profiling API Interfaces
ÎÒ¼ì²éµÄÖ÷ÒªµÄ½Ó¿ÚÊÇICorProfilerCallback£¬ÔÚ.NET Framework SDKµÄIncludeĿ¼ÏµÄCorProf.IDLÎļþÖж¨Òå¡£½Ó¿ÚµÄʵÏÖÐèҪʹÓÃÆÊÎöAPI¡£ÄãµÄ¹¤×÷ÊÇÌṩʵÏÖ¡£¾¡¹ÜÓкܶàµÄ·½·¨£¬²»ÒªÅ£¬¶ÔÓÚËûÃÇÖеĴó¶à˵£¬¿ÉÒÔ¼òµ¥µÄ·µ»ØS_OK»òE_NOIMPL¡£¶ÔÓÚÃ÷È·µÄʼþµÄ¶¯×÷£¬ÔÚºÏÊʵÄCALLBACK·½·¨ÖÐдºÏÊʵĴúÂë¡£
¼ì²éCALLBACK·½·¨£¬Äã»á·¢Ïִ󲿷ֽÓÊÕÓйØÓÚÄǸöʼþµÄÁíÍâÐÅÏ¢µÄ²ÎÊý¡£ÀýÈç,JITCompilationStarted·½·¨½ÓÊÕÁËÒ»¸öÃûΪfunctionIdµÄUINTÀàÐ͵IJÎÊý¡£Äã¿ÉÒÔ¶ÔËü×öʲô£¿´ð°¸ÔÚÓÚ½Ó¿ÚICorProfilerInfo¡£
ICorProfilerInfo¿ÉÒÔÌṩÈÎºÎÆÊÎöÐÅÏ¢¡£¿¼ÂǸղÅÌá¼°µÄfunctionId£¬Äã¿ÉÒÔµ÷ÓÃICorProfilerInfo::GetTokenAndMetaDataFromFunction£¬Ëü·µ»Ø¸øÄãÔªÊý¾Ý½Ó¿Ú¡¢º¯ÊýµÄÔªÊý¾Ýtoken¡£Ê¹ÓÃÔªÊý¾Ý½Ó¿ÚºÍtoken£¬Äã¿ÉÒÔ²éѯº¯ÊýÃû¡¢ËüËùÔÚµÄÀà¡¢¼°ÄãËùÖªµÀµÄÈκÎÐÅÏ¢¡£
¼òµ¥µÄ½²£¬ÆÊÎöAPI°üº¬ÁËÁ½¸öCOM½Ó¿Ú¡£ÒýÈë½Ó¿Ú£¬ÓÉÄãÀ´ÊµÏÖ£¬ÊÇICorProfilerCallback¡£µ±CLRʼþ·¢Éúʱ£¬CLR»áµ÷ÓýӿÚÖеÄijһ¸ö·½·¨¡£Òý³ö½Ó¿Ú£¬ÊÇICorProfilerInfo£¬ÓÉCLRÌṩ¸øÄ㣬ÈÃÄãÔÚCALLBACKÄÚ²¿Ê¹Óá£
ʹÓÃICorProfilerCallback²ÎÊýµÄÆÕ±éµÄģʽÊǹ㷺µÄʹÓÃIDÀ´´ú±íº¯Êý¡¢Àࡢģ¿é¡¢³ÌÐò¼¯£¬µÈ¡£IDÊDz»Í¸Ã÷µÄ¾ä±ú¡£¹ØÓÚËüµÄÓÐÒâÒåµÄÐÅÏ¢´ÓICorProfilerInfo½Ó¿ÚÀ´»ñµÃ¡£³ÌÐòÖ´Ðйý³ÌÖÐÈç¹ûº¯ÊýµÄ´úÂë±»Ð¶ÔØ£¬È»ºóÓÖ±»×°ÔØ¡¢²¢±àÒë£¬ÌØ¶¨µÄIDÖµ£¨ÈçfunctionId£©¿ÉÄÜ»á¸Ä±ä¡£µ«ÊÇÓÐCALLBACKÈÃÄãÖªµÀÕâ¸ö·¢ÉúÁË¡£
ICorProfilerCallback·½·¨¿ÉÒÔ·Ö³ÉÂß¼µÄ¼¸×é¡£´ó²¿·ÖÇé¿öÏ£¬Ê¼þ¶¼ÓÐStarted¡¢Finished·½·¨£¬²¢ÇҳɶԵĵ÷Óá£ÈÃÎÒÃǽøÐÐÉîÈëÑо¿Ëü£¬¸üºÃµÄÁ˽âÎÒÃÇ¿ÉÒÔͨ¹ýCLR¹Û²ìµ½Ê²Ã´¡£³ý·ÇÓÐÌØÊâ˵Ã÷£¬ÏÂÃæÁгöµÄËùÓз½·¨¶¼ÊôÓÚICorProfilerCallback½Ó¿Ú¡£
Initialize/Shutdown Methods
ÔÚʹÓÃÆÊÎöAPIµÄ½ø³ÌÖУ¬InitializeÊǵÚÒ»¸ö±»µ÷Óõķ½·¨¡£ÄãµÄ´úÂë´ÓÕâ¸ö·½·¨µÃµ½ICorProfilerInfoÖ¸Õ롣ΨһµÄ²ÎÊýÊÇLPUNKNOWN£¬¶ÔËüµ÷ÓÃQueryInterface·½·¨µÃµ½ICorProfilerInfoÖ¸Õë¡£InitializeÊÇÄã¸æË߯ÊÎöAPIÄã¶ÔÄÄЩʼþ¸ÐÐËȤµÄµØ·½¡£
ΪÁËÖ¸³öÄã¸ÐÐËȤµÄʼþ£¬µ÷ÓÃICorProfilerInfo::SetEventMask·½·¨£¬´«µÝÒ»¸öÉèÖÃÁ˺ÏÊʵÄbitµÄDWORDÀàÐ͵IJÎÊý¡£ÕâЩ±êÖ¾À´×ÔÓÚCorProf.hÎļþÖеÄCOR_PROF_MONITORö¾Ù±äÁ¿¡£µÍλֵ±êÖ¾±»ÃüÃûΪCOR_PRF_MONITOR_XXX£¬¸æËßCLRµ÷ÓÃICorProfilerCallbackµÄÄÄЩ·½·¨¡£ÀýÈ磬Èç¹ûÄãÏëÈÃClassLoadStarted·½·¨±»µ÷Óã¬Äã±ØÐëÉèÖÃCOR_PRF_MONITOR_CLASS_LOADS±êÖ¾¡£
ICorProfilerInfo::SetEventMask·½·¨µÄ²ÎÊýµÄÁíÍâһЩ±êÖ¾ÒÔÒ»ÖÖ·½Ê½¡¢»òÕßÁíÒ»ÖÖ·½Ê½¸Ä±äCLRµÄÐÐΪ.ÀýÈ磬Èç¹ûÄãÏëÔÚÖ´ÐÐʱ¼àÊÓ¶ÔÏóµÄ·ÖÅ䣬±ØÐëÉèÖÃCOR_PRF_ENABLE_OBJECT_ALLOCATED±êÖ¾¡£ÏàËÆµÄ£¬COR_PRF_DISABLE_INLINING¸æËßCLR²»ÒªÄÚÁªÈκκ¯Êý¡£Èç¹ûÒ»¸ö·½·¨ÄÚÁªÁË£¬Ä㽫µÃ²»µ½ENTER¡¢LEAVE֪ͨ¡£
Äã¿ÉÒÔÔÚÒÔºóµÄij¸öʱ¿Ìµ÷ÓÃICorProfilerInfo::SetEventMaskÀ´ÐÞ¸ÄÄãËù¸ÐÐËȤµÄʼþ¡£È»¶ø£¬Ä³Ð©Ê¼þÊDz»¿ÉÒԸıäµÄ£¬Òâζ×ÅÄãÒ»µ©ÔÚInitializeÉèÖÃÁË£¬ËûÃǽ«²»Äܱ»Ð޸ġ£
µ±CLRÖÕÖ¹½ø³Ìʱ£¬Shutdown·½·¨±»µ÷Óá£ÔÚijЩÇé¿öÏ£¬Ëü²»»á±»µ÷Ó㬵«ÊǶÔÓÚÒ»¸öÕý³£ÖÕÖ¹µÄ.NET³ÌÐòÀ´½²£¬ËüÓ¦¸Ã±»µ÷Óá£
Application Domain Creation/Shutdown
Õâ¸öÖÖÀàµÄ·½·¨ÓÐAppDomainCreationStarted, AppDomainCreationFinished, AppDomainShutdownStarted, and AppDomainShutdownFinished¡£ËûÃǵÄÃû×ÖÊÇ×ÔÃèÊöµÄ¡£ÕâЩ·½·¨µÄÖ÷ÒªTokenÊÇAppDomainID¡£ÐèҪעÒâµÄÊÇÔÚAppDomainCreationStarted »Øµ÷·½·¨ÖУ¬²»ÄÜʹÓÃAppDomainID£¬ÒòΪAppDomain»¹²»´æÔÚ¡£È»¶ø£¬Ò»µ©ÊÕµ½ÁËAppDomainCreationFinished֪ͨ£¬¾Í¿ÉÒÔÒÔAppDomainIDΪ²ÎÊýµ÷ÓÃÒÔΪ²ÎÊýµ÷ÓÃICorProfilerInfo::GetAppDomainInfo À´µÃµ½ÐÂAppDomainµÄÐÅÏ¢¡£
Assembly Loads/Unloads
ÔÚ×°ÔØ¡¢Ð¶ÔسÌÐò¼¯Ê±£¬AssemblyLoadStarted, AssemblyLoadFinished, AssemblyUnloadStarted, AssemblyUnloadFinishedÕâЩ·½·¨±»µ÷Óá£Ö÷ÒªµÄTokenÊÇAssemblyID¡£ÐèҪעÒâµÄÊÇÔÚAssemblyLoadStarted·½·¨Öв»ÄÜʹÓÃToken AssemblyID£¬ÒòΪ³ÌÐò¼¯»¹²»´æÔÚ¡£È»¶ø£¬Ò»µ©ÊÕµ½AssemblyLoadFinished֪ͨ£¬¾Í¿ÉÒÔÒÔAssemblyIDΪ²ÎÊýµ÷ÓÃICorProfilerInfo::GetAssemblyInfoÀ´µÃµ½Ð³ÌÐò¼¯µÄÐÅÏ¢¡£
Module Loads/Unloads
×°ÔØÄ£¿éÏà¹ØµÄº¯ÊýÓÐModuleLoadStarted, ModuleLoadFinished, ModuleUnloadStarted, ModuleUnloadFinished, ºÍModuleAttachedToAssembly¡£Ç°Ëĸöº¯ÊýµÄÃû×ÖÊÇ×ÔÃèÊöµÄ¡£Ö÷ÒªµÄTokenÊÇModuleID¡£ºÍAssemblyLoadStartedʱµÄTokenÒ»Ñù£¬´«µÝ¸øModuleLoadStarted·½·¨µÄTokenÒ²ÊDz»¿ÉÓõġ£ÒòΪģ¿é²»´æÔÚ¡£µ«Êǵ±ÊÕµ½ModuleLoadFinished֪ͨºó£¬¾Í¿ÉÒÔÒÔModuleIDΪ²ÎÊýµ÷ÓÃICorProfilerInfo::GetModuleInfoÀ´µÃµ½ÐÂÄ£¿éµÄÐÅÏ¢¡£
µ±CLR½«Ò»¸öÄ£¿éºÍÒ»¸ö³ÌÐò¼¯Ïà¹ØÁªÆðÀ´Ê±£¬×îºóÒ»¸öº¯Êý£¬ModuleAttachedToAssembly£¬±»µ÷Ó᣾¡¹ÜÄ£¿éºÍ³ÌÐò¼¯¾³£ÊÇͬһ¸öÎļþ£¬Ò»¸ö³ÌÐò¼¯Ò²¿ÉÄÜÓжà¸öÄ£¿é¡£
Class Loads/Unloads
×°ÔØÀàÏà¹ØµÄº¯ÊýÓÐClassLoadStarted, ClassLoadFinished, ClassUnloadStarted, ºÍClassUnloadFinished¡£ÕâЩº¯ÊýµÄÃû×ÖÊÇ×ÔÃèÊöµÄ¡£´«µÝ¸øClassLoadStarted·½·¨µÄTokenÒ²ÊDz»¿ÉÓõġ£ÒòΪÀ಻´æÔÚ¡£µ«Êǵ±ÊÕµ½ClassLoadFinished֪ͨºó£¬¾Í¿ÉÒÔÒÔClassIDΪ²ÎÊýµ÷ÓÃICorProfilerInfo::GetClassIDInfoÀ´µÃµ½ÐÂÀàµÄÐÅÏ¢¡£
JIT Compilation
JIT±àÒë·½·¨£¨Èçͼ2£©Óõ½µÄÖ÷ÒªTokenÊÇFunctionID¡£
JITCompilationStarted
JITCompilationFinished
JITCachedFunctionSearchStarted
JITCachedFunctionSearchFinished
JITFunctionPitched
JITInlining
ÕâÀÊõÓﺯÊý¡¢·½·¨½»»¥µÄʹÓá£ÒÔFunctionIDΪ²ÎÊýµ÷Óà ICorProfilerInfo::GetFunctionInfoÀ´»ñµÃº¯ÊýµÄÐÅÏ¢¡£
·½·¨JITCompilationStartedÊǺÜÓÐȤµÄ£¬ÒòΪËüÔÊÐíÄãÔÚJITed֮ǰ²é¿´¡¢ÐÞ¸ÄIL¡£²é¿´ICorProfilerInfo:: GetILFunctionBodyÀ´»ñµÃϸ½Ú£¬²»ÒªÈÏΪËüºÜÈÝÒס£·½·¨JITCachedFunctionSearchStarted±íʾCLRѰÕÒÒѾ±»JITed±àÒë³Énative´úÂëµÄº¯Êý¡£Í¨¹ýÉèÖÃÊä³ö²ÎÊýpbUseCachedFunctionΪFALSE£¬Äã¿ÉÒÔÇ¿ÖÆÔËÐÐʱ²»¿¼ÂÇPre-JITdµÄ״̬£¬Ê¹ÓÃ×îеÄJITed°æ±¾¡£
·½·¨JITFunctionPitched±íʾ´ÓÄÚ´æÖÐɾ³ýÒ»¸öÒÔǰJITedµÄ·½·¨¡£Ö»ÓÐÔÚÄÚ´æºÜÉÙµÄÇé¿öÏ£¬²Å»á·¢Éú¡£×îºó·½·¨JITInlining±íʾJITerÒªÄÚÁªº¯Êý¡£Èç¹ûÄãÒª¼ÆËãÄǸö·½·¨µÄenter/leave֪ͨ¸öÊý£¬¿ÉÒÔÉèÖÃÊä³ö²ÎÊýpfShouldInlineΪFALSEÀ´½ûÖ¹ÄÚÁª¡£Ò²¿ÉÒÔͨ¹ý´«µÝ¸øICorProfilerInfo::SetEventMaskµÄÒ»¸ö±êÖ¾À´½ûÖ¹½ø³Ì·¶Î§ÄÚµÄÄÚÁª¡£
Threading
Ï̷߳½·¨Èçͼ3
ThreadCreated
ThreadDestroyed
ThreadAssignedToOSThread
RuntimeSuspendStarted
RuntimeSuspendFinished
RuntimeSuspendAborted
RuntimeResumeStarted
RuntimeResumeFinished
RuntimeThreadSuspended
RuntimeThreadResumed
ThreadCreated/Destroyed·½·¨°üº¬ÁËÏ̵߳ÄÉúÃüÖÜÆÚ¡£ÀýÈ磬¸ÅÄîÉϽ²£¬Ò»¸öCLRÏß³ÌÔÚÆäÉúÃüÖÜÆÚÖпÉÒÔÔËÐÐÔÚ¶à¸öWin32Ïß³ÌÖ®ÉÏ¡£ThreadAssignedToOSThread·½·¨Ö¸Ê¾ÁËCLRÕýÔÚÔËÐÐÔÚÄĸöWin32Ïß³ÌÖ®ÉÏ¡£
µ±CLRÖ´ÐÐʱ£¬ÓÐʱ±ØÐë¹ÒÆð²¿·Ö»òÕßËùÓеÄÏß³ÌÒÔ±ãÖ´ÐÐÀ¬»øÊÕ¼¯¡£RuntimeSuspend£¬RuntimeResumeϵÁеķ½·¨Ö¸Ê¾CLRÏ̱߳»¹ÒÆð£¨Êµ¼Ê±ÈÕâ¸ü¸´ÔÓ£¬ÎÒÔÚÕâÀﲿÉîÈëϸ½ÚÁË£©¡£´«µÝ¸øRuntimeSuspendStartedµÄÒ»¸ö²ÎÊýָʾÁËÏß³ÌΪʲô±»¹ÒÆð¡£×îºóÁ½¸öRuntimeThread·½·¨Ö¸Ê¾Ò»¸öÏß³ÌÕýÔÚ±»¹ÒÆð£¬²¢ÇÒÄÇ×ÜÔÚʼþRuntimeSuspendÄÚ·¢Éú¡£
COM Interop
µ±CLRºÍÆÕͨµÄCOM¶ÔÏ󻥲Ù×÷ʱ£¬ÐèÒª´úÀí½Ó¿Ú¡£Á½¸ö·½·¨Ö¸Ê¾´úÀí±»´´½¨¡¢Ïú»Ù¡£´«µÝµ½ÕâÁ½¸öº¯ÊýµÄ²ÎÊýÊÇ.NET ClassID£¬ÏàÓ¦µÄCOM½Ó¿ÚIID£¬Ò»¸öÖ¸Ïò´úÀíµÄÐ麯Êý±í£¬Ð麯Êý±íµÄÏîÊý¡£
Managed/Unmanaged Code Transitions
µ±ÍйܴúÂëµ÷Ó÷ÇÍйܴúÂ룬»òÕß·ÇÍйܴúÂëµ÷ÓÃÍйܴúÂëʱ£¬º¯ÊýUnmanagedToManagedTransition ¡¢ManagedToUnmanagedTransition±»µ÷Óᣴ«µÝ¸øÃ¿¸ö·½·¨FunctionIDÀ´´ú±íµ÷ÓÃÕߣ¬¿ÉÒÔÀûÓÃËüµ÷ÓÃICorProfilerInfo::GetFunctionInfoÀ´µÃµ½¸ü¶àÐ |