/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . google . idea . perf Ċ Ċ import Ġcom . google . idea . perf . agent . Agent Main Ċ import Ġcom . intellij . execution . process . OS Process Util Ċ import Ġcom . intellij . ide . plugins . PluginManager Core Ċ import Ġcom . intellij . notification . Notification Ċ import Ġcom . intellij . notification . Notification Type Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . extensions . Plugin Id Ċ import Ġcom . sun . tools . attach . VirtualMachine Ċ import Ġjava . io . File Ċ import Ġjava . lang . instrument . Instrumentation Ċ Ċ // ĠThings Ġto Ġimprove : Ċ // Ġ- ĠFail Ġgrace fully Ġupon ĠSO E Ġcaused Ġby Ġinstrument ing Ġcode Ġused Ġby ĠTr acer Method Listener . Ċ Ċ /** ĠLoads Ġand Ġinitializes Ġthe Ġinstrument ation Ġagent . Ġ*/ Ċ object ĠAgent Loader Ġ{ ĊĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLogger . getInstance ( Agent Loader :: class . java ) ĊĊĠĠĠ Ġval Ġinstrument ation : ĠInstrument ation ? Ġby Ġlazy Ġ{ Ġtry Load Agent () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Load Agent (): ĠInstrument ation ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġagent Loaded At Startup Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUnt il Ġthe Ġagent Ġis Ġloaded , Ġwe Ġcannot Ġtrigger Ġsymbol Ġresolution Ġfor Ġits ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclasses --- otherwise ĠNo Class Def Found Error Ġis Ġim min ent . ĠSo Ġwe Ġuse Ġreflection . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClass . forName (" com . google . idea . perf . agent . Agent Main ", Ġfalse , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinstrument ation : ĠInstrument ation ĊĠĠĠĠĠĠĠ Ġif Ġ( agent Loaded At Startup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument ation Ġ= ĠcheckNotNull ( Agent Main . saved Instrumentation Instance ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Agent Ġwas Ġloaded Ġat Ġstartup ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Load Agent After Startup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstrument ation Ġ= ĠcheckNotNull ( Agent Main . saved Instrumentation Instance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Agent Ġwas Ġloaded Ġon Ġdemand ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ[ Tracer ] ĠFailed Ġto Ġattach Ġthe Ġinstrument ation Ġagent Ġafter Ġstartup . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOn ĠJDK Ġ 9 +, Ġmake Ġsure Ġj dk . attach . allow Attach Self Ġis Ġset Ġto Ġtrue . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlternatively , Ġyou Ġcan Ġattach Ġthe Ġagent Ġat Ġstartup Ġvia Ġthe Ġ- java agent Ġflag . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification (" Tracer ", Ġ"", Ġmsg , ĠNotification Type . ERROR ). notify ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDisable Ġtracing Ġentirely Ġif Ġclass Ġre transformation Ġis Ġnot Ġsupported . ĊĠĠĠĠĠĠĠ Ġif Ġ(! instrumentation . is Re transform Classes Supported ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"[ Tracer ] ĠThe Ġcurrent ĠJVM Ġconfiguration Ġdoes Ġnot Ġallow Ġclass Ġre transformation " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification (" Tracer ", Ġ"", Ġmsg , ĠNotification Type . ERROR ). notify ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinstrument ation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġmethod Ġcan Ġthrow Ġa Ġvariety Ġof Ġexceptions . ĊĠĠĠ Ġprivate Ġfun Ġtry Load Agent After Startup () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplugin Ġ= ĠPlugin Manager Core . get Plugin ( Plugin Id . getId (" com . google . ide - perf ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Failed Ġto Ġfind Ġour Ġown Ġplugin ") ĊĊĠĠĠĠĠĠĠ Ġval Ġagent Jar Ġ= ĠFile ( plugin . path , Ġ" agent . jar ") ĊĠĠĠĠĠĠĠ Ġcheck ( agent Jar . isFile ) Ġ{ Ġ" Could Ġnot Ġfind Ġagent . jar Ġat Ġ${ agent Jar . path }" Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvm Ġ= ĠVirtual Machine . attach ( OS Process Util . getApplication Pid ()) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvm . load Agent ( agent Jar . absolute Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvm . detach () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ