鍙互灝嗕互鍥懼艦褰㈠紡鏌ョ湅搴旂敤紼嬪簭鐨勮皟鐢ㄨ繃紼嬬湅浣滄槸涓涓涔犵粡鍘嗐傝繖鏍峰仛鍙互甯姪鎮ㄧ悊瑙e簲鐢ㄧ▼搴忕殑鍐呴儴琛屼負錛屽茍鑾峰緱鏈夊叧紼嬪簭浼樺寲鏂歸潰鐨勪俊鎭備緥濡傦紝閫氳繃瀵歸偅浜涚粡甯歌皟鐢ㄧ殑鍑芥暟榪涜浼樺寲錛屾偍灝卞彲浠ョ敤鏈灝戠殑鍔姏鏉ヨ幏寰楁渶浣崇殑鎬ц兘銆傚彟澶栵紝璋冪敤璺熻釜榪樺彲浠ュ垽鏂敤鎴峰嚱鏁扮殑鏈澶ц皟鐢ㄦ繁搴︼紝榪欏彲浠ョ敤鏉ュ璋冪敤鏍堜嬌鐢ㄧ殑鍐呭瓨榪涜鏈夋晥闄愬埗錛堝湪宓屽叆寮忕郴緇熶腑錛岃繖鏄潪甯擱噸瑕佺殑涓涓冭檻鍥犵礌錛夈?/p>
涓轟簡鎹曡幏騫舵樉紺鴻皟鐢ㄥ浘錛屾偍闇瑕?4 涓厓绱狅細GNU 緙栬瘧鍣ㄥ伐鍏烽摼銆丄ddr2line 宸ュ叿銆佸畾鍒剁殑涓棿浠g爜鍜屼竴涓悕涓?Graphviz 鐨勪唬鐮併侫ddr2line 宸ュ叿鍙互璇嗗埆鍑芥暟銆佺粰瀹氬湴鍧鐨勬簮浠g爜琛屾暟鍜屽彲鎵ц鏄犲儚銆傚畾鍒剁殑涓棿浠g爜鏄竴涓潪甯哥畝鍗曠殑宸ュ叿錛屽畠鍙互鍑忓皯瀵瑰浘褰㈣鑼冪殑鍦板潃璺熻釜銆侴raphviz 宸ュ叿鍙互鐢熸垚鍥懼艦鏄犲儚銆傛暣涓繃紼嬪鍥?1 鎵紺恒?/p>
鍥?1. 鎼滈泦銆佺畝鍖栧拰鍙鍖栬窡韙礬寰勭殑榪囩▼
瑕佹敹闆嗕竴涓嚱鏁拌皟鐢ㄧ殑韙抗錛屾偍闇瑕佺‘瀹氭瘡涓嚱鏁板湪搴旂敤紼嬪簭涓皟鐢ㄧ殑鏃墮棿銆傚湪榪囧幓錛岄兘鏄氳繃鍦ㄥ嚱鏁扮殑鍏ュ彛澶勫拰閫鍑哄鎻掑叆涓涓儫涓鐨勭鍙鋒潵鎵嬪伐媯嫻嬫瘡涓嚱鏁扮殑銆傝繖涓繃紼嬮潪甯哥箒鐞愶紝鑰屼笖寰堝鏄撳嚭閿欙紝閫氬父闇瑕佸婧愪唬鐮佽繘琛屽ぇ閲忕殑淇敼銆?/p>
騫歌繍鐨勬槸錛孏NU 緙栬瘧鍣ㄥ伐鍏烽摼錛堜篃縐頒負 gcc錛夋彁渚涗簡涓縐嶈嚜鍔ㄦ嫻嬪簲鐢ㄧ▼搴忎腑鐨勫悇涓嚱鏁扮殑鏂規硶銆傚湪鎵ц搴旂敤紼嬪簭鏃訛紝灝卞彲浠ユ敹闆嗙浉鍏崇殑鍒嗘瀽鏁版嵁銆傛偍鍙渶瑕佹彁渚涗袱涓壒孌婄殑鍒嗘瀽鍑芥暟鍗沖彲銆傚叾涓竴涓嚱鏁板湪姣忔鎵ц鎯寵璺熻釜鐨勫嚱鏁版椂閮戒細璋冪敤錛涜屽彟澶栦竴涓嚱鏁板垯鍦ㄦ瘡嬈¢鍑烘兂瑕佽窡韙殑鍑芥暟鏃惰皟鐢紙鍙傝娓呭崟 1錛夈傝繖涓や釜鍑芥暟閮芥槸鐗瑰埆鎸囧畾鐨勶紝鍥犳錛岀紪璇戝櫒鍙互璇嗗埆瀹冧滑銆?/p>
娓呭崟 1. GNU 鐨勫叆鍙e拰鍑哄彛閰嶇疆鍑芥暟
void __cyg_profile_func_enter( void *func_address, void *call_site ) __attribute__ ((no_instrument_function)); void __cyg_profile_func_exit ( void *func_address, void *call_site ) __attribute__ ((no_instrument_function)); |
閬垮厤浣跨敤鐗規畩鐨勬嫻嬪嚱鏁?/h2>鎮ㄦ垨璁鎬細浜х敓鐤戞儜錛屽鏋?gcc 灝辨槸鎴戜滑闇瑕佺殑媯嫻嬪嚱鏁幫紝閭d箞涓轟粈涔堝畠涓嶆嫻?code style="font-size: small !important; ">__cyg_* 鍒嗘瀽鍑芥暟鍛紵gcc 鐨勫紑鍙戣呮浘鎬濊冭繃榪欎釜闂錛屼粬浠彁渚涗簡涓涓悕涓?code style="font-size: small !important; ">no_instrument_function 鐨勫嚱鏁板睘鎬э紝榪欎釜鍑芥暟灞炴у彲浠ュ簲鐢ㄤ簬鍑芥暟鍘熷瀷錛岀姝㈠瀹冧滑榪涜媯嫻嬨備笉瑕佸皢榪欎釜鍑芥暟灞炴у簲鐢ㄥ埌鍒嗘瀽鍑芥暟涓婏紝榪欐牱浼氬鑷存棤闄愰掑綊鍒嗘瀽寰幆鍜屽ぇ閲忕殑鏃犵敤鏁版嵁銆?/p>
鎮ㄦ垨璁鎬細浜х敓鐤戞儜錛屽鏋?gcc 灝辨槸鎴戜滑闇瑕佺殑媯嫻嬪嚱鏁幫紝閭d箞涓轟粈涔堝畠涓嶆嫻?code style="font-size: small !important; ">__cyg_* 鍒嗘瀽鍑芥暟鍛紵gcc 鐨勫紑鍙戣呮浘鎬濊冭繃榪欎釜闂錛屼粬浠彁渚涗簡涓涓悕涓?code style="font-size: small !important; ">no_instrument_function 鐨勫嚱鏁板睘鎬э紝榪欎釜鍑芥暟灞炴у彲浠ュ簲鐢ㄤ簬鍑芥暟鍘熷瀷錛岀姝㈠瀹冧滑榪涜媯嫻嬨備笉瑕佸皢榪欎釜鍑芥暟灞炴у簲鐢ㄥ埌鍒嗘瀽鍑芥暟涓婏紝榪欐牱浼氬鑷存棤闄愰掑綊鍒嗘瀽寰幆鍜屽ぇ閲忕殑鏃犵敤鏁版嵁銆?/p>
鍦ㄨ皟鐢ㄤ竴涓嫻嬪嚱鏁版椂錛?code style="font-size: small !important; ">__cyg_profile_func_enter 鍚屾椂涔熶細琚皟鐢紝騫朵互 func_address 褰㈠紡浼犻掕皟鐢ㄧ殑鍑芥暟鍦板潃錛屼互鍙婁粠涓皟鐢ㄨ鍑芥暟鐨?nbsp;call_site 褰㈠紡鐨勫湴鍧銆傚弽涔嬶紝褰撲竴涓嚱鏁伴鍑烘椂錛屼篃浼氳皟鐢?code style="font-size: small !important; ">__cyg_profile_func_exit 鍑芥暟錛屽茍浼犻?nbsp;func_address 褰㈠紡鐨勫嚱鏁板湴鍧錛屼互鍙婂嚱鏁頒粠涓鍑虹殑鐪熷疄鍦板潃錛岃鍦板潃鐨勮〃紺哄艦寮忎負 call_site銆?/p>
鍦ㄨ繖浜涘垎鏋愬嚱鏁頒腑錛屾偍鍙互璁板綍涓嬪湴鍧瀵癸紝浠ヤ緵浠ュ悗鍐嶈繘琛屽垎鏋愪嬌鐢ㄣ傝璇鋒眰 gcc 鎵鏈夌殑媯嫻嬪嚱鏁幫紝姣忎釜鏂囦歡閮藉繀欏諱嬌鐢?nbsp;-finstrument-functions 鍜?nbsp;-g閫夐」榪涜緙栬瘧錛岃繖鏍峰彲浠ヤ繚鐣欒皟璇曠鍙楓?/p>
鍥犳錛岀幇鍦ㄦ偍灝卞彲浠ヤ負 gcc 鎻愪緵涓浜涘垎鏋愬嚱鏁頒簡錛岃繖浜涘嚱鏁板彲浠ラ忔槑鍦版彃鍏ュ簲鐢ㄧ▼搴忎腑鐨勫嚱鏁板叆鍙g偣鍜屽嚱鏁伴鍑虹偣銆備絾鍦ㄨ皟鐢ㄥ垎鏋愬嚱鏁版椂錛屽張搴旇鎬庢牱澶勭悊鎵鎻愪緵鐨勫湴鍧鍛紵鎮ㄦ湁寰堝閫夋嫨錛屼絾鏄負浜嗙畝渚胯搗瑙侊紝鍙互灝嗚繖涓湴鍧綆鍗曞湴鍐欏叆涓涓枃浠訛紝瑕佹敞鎰忓摢涓湴鍧鏄嚱鏁扮殑鍏ュ彛鍦板潃錛屽摢涓湴鍧鏄嚱鏁扮殑鍑哄彛鍦板潃錛堝弬瑙佹竻鍗?2錛夈?/p>
娉ㄦ剰錛?/strong>鍦ㄦ竻鍗?2 涓茍娌℃湁浣跨敤璋冪敤 Callsite 淇℃伅錛屽洜涓鴻繖浜涗俊鎭浜庡垎鏋愮▼搴忔潵璇存槸涓嶅繀瑕佺殑銆?/p> 鐜板湪鎮ㄥ彲浠ユ悳闆嗗垎鏋愭暟鎹簡錛屼絾鏄偍搴旇鍦ㄤ粈涔堝湴鏂規墦寮鎴栧叧闂偍鐨勮窡韙緭鍑烘枃浠跺憿錛熷埌鐜板湪涓烘錛岃繕涓嶉渶瑕佷負浜嗚繘琛屽垎鏋愯屽婧愮▼搴忚繘琛屼換浣曚慨鏀廣傚洜姝わ紝鎮ㄨ濡備綍媯嫻嬫暣涓簲鐢ㄧ▼搴忥紙鍖呮嫭 瑕佸垱寤?constructor 鍜?destructor 鍑芥暟錛屽垯闇瑕佸0鏄庝袱涓嚱鏁幫紝鐒跺悗瀵硅繖涓や釜鍑芥暟搴旂敤 濡傛灉緙栬瘧鍒嗘瀽鍑芥暟錛堝湪 instrument.c錛夊茍灝嗗畠浠笌鐩爣搴旂敤紼嬪簭閾炬帴鍦ㄤ竴璧鳳紝鐒跺悗鍐嶆墽琛岀洰鏍囧簲鐢ㄧ▼搴忥紝緇撴灉浼氱敓鎴愪竴涓簲鐢ㄧ▼搴忕殑璋冪敤榪借釜錛岃拷韙褰曡鍐欏叆 trace.txt 鏂囦歡銆傝窡韙枃浠朵笌璋冪敤鐨勫簲鐢ㄧ▼搴忓浜庣浉鍚岀殑鐩綍涓傛渶緇堢粨鏋滄槸錛屾偍鍙兘浼氬緱鍒頒竴涓叾涓弧鏄湴鍧鐨勯潪甯稿ぇ鐨勬枃浠躲備負浜嗚兘澶熻榪欎簺鏁版嵁鏇存湁鎰忎箟錛屾偍鍙互浣跨敤涓涓笉澶嚭鍚嶇殑鍙仛 Addr2line 鐨?GNU 宸ュ叿銆?/p> 浣跨敤 Addr2line 灝嗗嚱鏁板湴鍧瑙f瀽涓哄嚱鏁板悕 Addr2line 宸ュ叿錛堝畠鏄爣鍑嗙殑 GNU Binutils 涓殑涓閮ㄥ垎錛夋槸涓涓彲浠ュ皢鎸囦護鐨勫湴鍧鍜屽彲鎵ц鏄犲儚杞崲鎴愭枃浠跺悕銆佸嚱鏁板悕鍜屾簮浠g爜琛屾暟鐨勫伐鍏楓傝繖縐嶅姛鑳藉浜庡皢璺熻釜鍦板潃杞崲鎴愭洿鏈夋剰涔夌殑鍐呭鏉ヨ綆鐩存槸澶浜嗐?/p> 瑕佷簡瑙h繖涓繃紼嬫槸鎬庢牱宸ヤ綔鐨勶紝鎴戜滑鍙互璇曢獙涓涓畝鍗曠殑浜や簰寮忕殑渚嬪瓙銆傦紙鎴戠洿鎺ヤ粠 shell 涓繘琛屾搷浣滐紝鍥犱負榪欐槸鏈綆鍗曞湴灞曠ず榪欎釜榪囩▼鐨勬柟娉曪紝濡傛竻鍗?4 鎵紺恒傦級榪欎釜紺轟緥 C 鏂囦歡錛坱est.c錛夋槸閫氳繃 鍦ㄨ皟鐢?Addr2line 宸ュ叿鏃訛紝瑕佷嬌鐢?nbsp; Addr2line 宸ュ叿鎻愪緵浜嗗熀鏈殑絎﹀彿璋冭瘯淇℃伅錛屼笉榪?GNU Debugger 錛圙DB錛変嬌鐢ㄧ殑鏄叾浠栦竴浜涘唴閮ㄦ柟娉曘?/p> 鐜板湪鎮ㄦ湁浜嗕竴涓彲浠ユ悳闆嗗嚱鏁板嚱鏁板湴鍧鐨勮拷韙暟鎹殑鏂規硶錛岃繕鍙互浣跨敤 Addr2line 宸ュ叿灝嗗湴鍧杞崲涓哄嚱鏁板悕銆傜劧鑰岋紝浠庡簲鐢ㄧ▼搴忎腑浜х敓澶ч噺鐨勮窡韙暟鎹箣鍚庯紝濡備綍瀵硅繖浜涙暟鎹繘琛岀簿綆錛屼粠鑰屼嬌鍏舵洿鏈夋剰涔夊憿錛熻繖灝辨槸浣跨敤涓浜涘畾鍒剁殑涓棿浠g爜鍦ㄥ紑婧愬伐鍏蜂箣闂村緩绔嬭仈緋葷殑鍦版柟銆傛湰鏂囨彁渚涗簡榪欎釜宸ュ叿錛圥vtrace錛夌殑甯︽湁娉ㄩ噴鐨勫畬鏁翠唬鐮侊紝鍖呮嫭濡備綍緙栬瘧鍜屼嬌鐢ㄨ宸ュ叿鐨勪竴浜涜鏄庛傦紙鏈夊叧鐨勬洿澶氫俊鎭紝璇峰弬闃?nbsp;涓嬭澆 涓鑺傘傦級 鍥炴兂涓涓嬪浘 1 涓殑鍐呭錛屽湪鎵ц璁劇疆浜嗘嫻嬪嚱鏁扮殑搴旂敤紼嬪簭鏃訛紝浼氬垱寤轟竴涓悕涓?nbsp;trace.txt 鐨勬枃鏈枃浠躲傝繖涓漢浠彲浠ヨ鍙栫殑鏂囦歡涓寘鍚簡涓緋誨垪鍦板潃淇℃伅 —— 姣忚涓涓湴鍧錛屾瘡琛岄兘鏈変竴涓墠緙瀛楃銆傚鏋滃墠緙鏄?nbsp;E錛岄偅涔堣繖涓湴鍧灝辨槸涓涓嚱鏁扮殑鍏ュ彛鍦板潃錛堜篃灝辨槸璇達紝鎮ㄦ鍦ㄨ皟鐢ㄨ繖涓嚱鏁幫級銆傚鏋滃墠緙鏄竴涓?nbsp;X 瀛楃錛岄偅涔堣繖涓湴鍧灝辨槸涓涓嚭鍙e湴鍧錛堜篃灝辨槸璇達紝鎮ㄦ鍦ㄤ粠榪欎釜鍑芥暟涓鍑猴級銆?/p> 鍥犳錛屽鏋滃湪璺熻釜鏂囦歡涓湁涓涓叆鍙e湴鍧錛圓錛夌揣璺熺潃鍙﹀涓涓叆鍙e湴鍧錛圔錛夛紝閭d箞鎮ㄥ氨鍙互鎺ㄦ柇鏄?A 璋冪敤浜?B銆傚鏋滀竴涓叆鍙e湴鍧錛圓錛夊悗闈㈣窡鐫涓涓嚭鍙e湴鍧錛圓錛夛紝閭d箞灝辮鏄庤繖涓嚱鏁幫紙A錛夎璋冪敤鍚庡氨鐩存帴榪斿洖浜嗐傚綋娑夊強澶ч噺鐨勮皟鐢ㄩ摼鏃訛紝灝卞緢闅懼垎鏋愮┒绔熸槸璋佽皟鐢ㄤ簡璋侊紝鍥犳錛屼竴縐嶇畝鍗曠殑瑙e喅鏂規鏄淮鎶や竴涓暣涓湴鍧鐨勫爢鏍堛傛瘡嬈″湪璺熻釜鏂囦歡涓鍒頒竴涓叆鍙e湴鍧鏃訛紝灝卞皢鍏跺帇鍏ュ爢鏍堛傛爤欏剁殑鍦板潃灝變唬琛ㄦ渶鍚庝竴嬈¤璋冪敤鐨勫嚱鏁幫紙涔熷氨鏄綋鍓嶇殑媧誨姩鍑芥暟錛夈傚鏋滃悗闈㈢揣鎺ョ潃鏄彟澶栦竴涓叆鍙e湴鍧錛岃繖璇存槑鍫嗘爤涓殑鍦板潃璋冪敤浜嗚繖涓垰浠庤窡韙枃浠跺璇誨嚭鐨勫湴鍧銆傚湪紕板埌閫鍑哄嚱鏁版椂錛屽綋鍓嶇殑媧誨姩鍑芥暟灝變細榪斿洖錛屽茍閲婃斁鏍堥《鍏冪礌銆傝繖浼氬皢涓婁笅鏂囪繑鍒板洖鍓嶄竴涓嚱鏁幫紝鐢辨錛屽氨鍙互浜х敓姝g‘鐨勮皟鐢ㄩ摼榪囩▼銆?/p> 鍥?2 浠嬬粛浜嗚繖涓蹇碉紝浠ュ強綺劇畝鏁版嵁鐨勬柟娉曘傚湪鍒嗘瀽璺熻釜鏂囦歡涓殑璋冪敤閾炬椂錛屼細鏋勫緩涓涓繛閫氱煩闃碉紝鐢ㄦ潵琛ㄧず鍝釜鍑芥暟璋冪敤浜嗗叾浠栧摢浜涘嚱鏁般傝繖涓煩闃電殑琛岃〃紺鴻皟鐢ㄥ嚱鏁扮殑鍦板潃錛屽垪琛ㄧず琚皟鐢ㄧ殑鍦板潃銆傚浜庢瘡涓皟鐢ㄥ鏉ヨ錛岃涓庡垪鐨勪氦鍙夌偣涓嶆柇榪涜绱姞錛堣皟鐢ㄦ鏁幫級銆傚綋澶勭悊瀹屾暣涓窡韙枃浠舵椂錛屽叾緇撴灉鏄搴旂敤紼嬪簭鐨勬暣涓皟鐢ㄥ巻鍙茬殑涓涓潪甯哥畝鍗曠殑琛ㄧず錛屽叾涓寘鍚簡璋冪敤鐨勬鏁般?/p> 鍦ㄤ笅杞藉茍瑙e帇 Pvtrace 宸ュ叿涔嬪悗錛屽彧闇鍦ㄥ瓙鐩綍涓緭鍏?nbsp; $ unzip pvtrace.zip -d pvtrace $ cd pvtrace $ make $ make install 鐜板湪鎴戜滑宸茬粡鏋勫緩浜嗙畝鍖栫殑鍑芥暟榪為氭х煩闃碉紝鎺ヤ笅鏉ュ簲璇ユ瀯寤哄浘褰㈢殑琛ㄧず浜嗐傝鎴戜滑娣卞叆鐮旂┒ Graphviz錛屼簡渚跨悊瑙e浣曚粠榪為氱煩闃電敓鎴愪竴涓皟鐢ㄥ浘銆?/p> Graphviz 鎴?Graph Visualization 鏄敱 AT&T 寮鍙戠殑涓涓紑婧愮殑鍥懼艦鍙鍖栧伐鍏楓傚畠鎻愪緵浜嗗縐嶇敾鍥捐兘鍔涳紝浣嗘槸鎴戜滑閲嶇偣鍏蟲敞鐨勬槸瀹冧嬌鐢?Dot 璇█鐩磋繛鍥劇殑鑳藉姏銆傚湪鏈枃涓紝鎴戜滑灝嗙畝鍗曚粙緇嶅浣曚嬌鐢?Dot 鏉ュ垱寤轟竴涓浘褰紝騫跺睍紺哄浣曞皢鍒嗘瀽鏁版嵁杞崲鎴?Graphviz 鍙互浣跨敤鐨勮鑼冦傦紙璇峰弬闃?nbsp;鍙傝冭祫鏂?/a> 涓鑺傦紝浠ヨ幏寰楁湁鍏充笅杞借繖涓紑婧愯蔣浠剁殑淇℃伅銆傦級 浣跨敤 Dot 璇█錛屾偍鍙互鎸囧畾涓夌瀵硅薄錛氬浘銆佽妭鐐瑰拰杈廣備負浜嗚鎮ㄧ悊瑙h繖浜涘璞$殑鍚箟錛屾垜浠皢鏋勫緩涓涓緥瀛愭潵灞曠ず榪欎簺鍏冪礌鐨勭敤娉曘?/p> 娓呭崟 5 緇欏嚭浜嗕竴涓畝鍗曠殑瀹氬悜鍥撅紙directed graph錛夛紝鍏朵腑鍖呭惈 3 涓妭鐐廣傜涓琛屽0鏄庤繖涓浘涓?nbsp;G錛屽茍涓斿0鏄庝簡璇ュ浘鐨勭被鍨嬶紙digraph錛夈傛帴涓嬫潵鐨勪笁琛屼唬鐮佺敤浜庡垱寤鴻鍥劇殑鑺傜偣錛岃繖浜涜妭鐐瑰垎鍒悕涓?nbsp;node1銆?em>node2 鍜?nbsp;node3銆傝妭鐐規槸鍦ㄥ畠浠殑鍚嶅瓧鍑虹幇鍦ㄥ浘瑙勮寖涓椂鍒涘緩鐨勩傝竟鏄湪鍦ㄤ袱涓妭鐐逛嬌鐢ㄨ竟鎿嶄綔錛?code style="font-size: small !important; ">->錛夎繛鎺ュ湪涓璧鋒椂鍒涘緩鐨勶紝濡傜 6 琛屽埌絎?8 琛屾墍紺恒傛垜榪樺杈逛嬌鐢ㄤ簡涓涓彲閫夌殑灞炴?nbsp; 瑕佸皢榪欎釜 .dot 鏂囦歡杞崲鎴愪竴涓浘褰㈡槧鍍忥紝鍒欓渶瑕佷嬌鐢?Dot 宸ュ叿錛岃繖涓伐鍏鋒槸鍦?Graphviz 鍖呬腑鎻愪緵鐨勩傛竻鍗?6 浠嬬粛浜嗚繖縐嶈漿鎹€?/p> 鍦ㄨ繖孌典唬鐮佷腑錛屾垜鍛婅瘔 Dot 浣跨敤 test.dot 鍥懼艦瑙勮寖錛屽茍鐢熸垚涓涓?JPG 鍥懼儚錛屽皢鍏朵繚瀛樺湪鏂囦歡 test.jpg 涓傛墍鐢熸垚鐨勫浘鍍忓鍥?3 鎵紺恒傚湪姝ゅ錛屾垜浣跨敤浜?JPG 鏍煎紡錛屼絾鏄?Dot 宸ュ叿涔熷彲浠ユ敮鎸佸叾浠栨牸寮忥紝鍏朵腑鍖呮嫭 GIF銆丳NG 鍜?postscript銆?/p> Dot 璇█榪樺彲浠ユ敮鎸佸叾浠栦竴浜涢夐」錛屽寘鎷褰€侀鑹插拰寰堝灞炴с備絾鏄氨鎴戜滑鎯寵瀹炵幇鐨勫姛鑳借岃█錛岃繖涓夐」灝辮凍澶熶簡銆?/p> 鐜板湪鎴戜滑宸茬粡鐪嬪埌浜嗘暣涓繃紼嬬殑鍚勪釜闃舵浜嗭紝涓嬮潰鍙互閲囩敤涓涓緥瀛愭潵灞曠ず濡備綍灝嗚繖浜涢樁孌靛悎騫跺湪涓璧蜂簡銆傜幇鍦紝鎮ㄥ簲璇ュ凡緇忓睍寮騫跺畨瑁呬簡 Pvtrace 宸ュ叿錛岀劧鍚庤繕闇瑕佸皢 instrument.c 鏂囦歡澶嶅埗鍒板伐浣滄簮浠g爜鐩綍涓?/p> 鍦ㄨ繖涓緥瀛愪腑錛屾垜浣跨敤浜嗕竴涓簮鏂囦歡 test.c 榪涜媯嫻嬨傛竻鍗?7 緇欏嚭浜嗘暣涓繃紼嬨傚湪絎?3 琛屼腑錛屾垜浣跨敤媯嫻嬫簮錛坕nstrument.c錛夋潵鏋勫緩錛堢紪璇戝茍榪炴帴錛夊簲鐢ㄧ▼搴忋傜劧鍚庡湪絎?4 琛屾墽琛?code style="font-size: small !important; ">test錛屽啀浣跨敤 榪欎釜榪囩▼鐨勭ず渚嬭緭鍑哄鍥?4 鎵紺恒傝繖涓ず渚嬪浘鏄粠浣跨敤 Q 瀛︿範鐨勪竴涓畝鍗曞寮哄紡瀛︿範搴旂敤紼嬪簭涓緱鍒扮殑銆?/p> 鎮ㄤ篃鍙互浣跨敤榪欑鏂規硶瀵規洿澶х殑搴旂敤紼嬪簭榪涜鍒嗘瀽銆傛垜瑕佸睍紺虹殑鏈鍚庝竴涓緥瀛愭槸 Gzip 宸ュ叿銆傛垜綆鍗曞湴灝?instrument.c 鍔犲叆 Gzip 鐨?Makefile 涓紝浣滀負鍏朵緷璧栫殑涓涓簮鏂囦歡錛岀劧鍚庣紪璇?Gzip錛屽茍浣跨敤瀹冪敓鎴愪竴涓窡韙枃浠躲傝繖涓浘褰㈠お澶т簡錛屼笉澶鏄撹繘琛屾洿璇︾粏鐨勫垎鏋愶紝浣嗘槸涓嬪浘琛ㄧず浜?Gzip 瀵逛竴涓皬鏂囦歡榪涜鍘嬬緝鏃剁殑澶勭悊榪囩▼銆?/p> 浣跨敤寮婧愯蔣浠跺拰灝戦噺鐨勪腑闂翠唬鐮侊紝鍙渶瑕佽姳寰堝皯鐨勬椂闂村氨鍙互寮鍙戝嚭闈炲父鏈夌敤鐨勯」鐩傞氳繃浣跨敤瀵瑰簲鐢ㄧ▼搴忚繘琛屽垎鏋愮殑鍑犱釜 GNU 緙栬瘧鍣ㄦ墿灞曪紝鍙互浣跨敤 Addr2line 宸ュ叿榪涜鍦板潃杞崲錛屽茍瀵?Graphviz 搴旂敤紼嬪簭榪涜鍥懼艦鍙鍖栵紝鐒跺悗鎮ㄥ氨鍙互寰楀埌涓涓▼搴忥紝璇ョ▼搴忓彲浠ュ搴旂敤紼嬪簭榪涜鍒嗘瀽錛屽茍灞曠ず涓涓鏄庤皟鐢ㄩ摼鐨勫畾鍚戝浘銆傞氳繃鍥懼艦鏉ユ煡鐪嬩竴涓簲鐢ㄧ▼搴忕殑璋冪敤閾懼浜庣悊瑙e簲鐢ㄧ▼搴忕殑鍐呴儴琛屼負鏉ヨ闈炲父閲嶈銆傚湪姝g‘浜嗚В璋冪敤閾懼強鍏跺悇鑷殑棰戠巼涔嬪悗錛岃繖浜涚煡璇嗗彲鑳藉璋冭瘯鍜屼紭鍖栧簲鐢ㄧ▼搴忛潪甯告湁鐢ㄣ?/p> 涓嬭澆
娓呭崟 2. 鍒嗘瀽鍑芥暟 void __cyg_profile_func_enter( void *this, void *callsite ) { /* Function Entry Address */ fprintf(fp, "E%p\n", (int *)this); } void __cyg_profile_func_exit( void *this, void *callsite ) { /* Function Exit Address */ fprintf(fp, "X%p\n", (int *)this); } main 鍑芥暟錛夎屼笉鐢ㄥ鍒嗘瀽鏁版嵁鐨勮緭鍑虹粨鏋滆繘琛屽垵濮嬪寲鍛紵gcc 鐨勫紑鍙戣呬篃鑰冭檻榪囪繖涓棶棰橈紝瀹冧滑涓?nbsp;main 鍑芥暟鐨?constructor 鍑芥暟鍜?destructor 鍑芥暟鎻愪緵浜嗕竴浜涚宸ц兘澶熸弧瓚寵繖涓姹備竴浜涙柟娉曘?code style="font-size: small !important; ">constructor 鍑芥暟鏄湪璋冪敤 main 鍑芥暟涔嬪墠璋冪敤鐨勶紝鑰?nbsp;destructor 鍑芥暟鍒欐槸鍦ㄥ簲鐢ㄧ▼搴忛鍑烘椂璋冪敤鐨勩?/p>constructor 鍜?nbsp;destructor 鍑芥暟灞炴с傚湪 constructor 鍑芥暟涓紝浼氭墦寮涓涓柊鐨勮窡韙枃浠訛紝鍒嗘瀽鏁版嵁鐨勫湴鍧璺熻釜灝辨槸鍐欏叆榪欎釜鏂囦歡鐨勶紱鍦?nbsp;destructor 鍑芥暟涓紝浼氬叧闂繖涓窡韙枃浠訛紙鍙傝娓呭崟 3錛夈?/p>
娓呭崟 3. 鍒嗘瀽 constructor 鍜?destructor 鍑芥暟 /* Constructor and Destructor Prototypes */ void main_constructor( void ) __attribute__ ((no_instrument_function, constructor)); void main_destructor( void ) __attribute__ ((no_instrument_function, destructor)); /* Output trace file pointer */ static FILE *fp; void main_constructor( void ) { fp = fopen( "trace.txt", "w" ); if (fp == NULL) exit(-1); } void main_deconstructor( void ) { fclose( fp ); } cat 涓涓畝鍗曠殑搴旂敤紼嬪簭瀹炵幇鐨勶紙涔熷氨鏄錛屽皢鏍囧噯杈撳嚭鐨勬枃鏈噸瀹氬悜鍒頒竴涓枃浠朵腑錛夈傜劧鍚庝嬌鐢?gcc 鏉ョ紪璇戣繖涓枃浠訛紝瀹冧細浼犻掍竴浜涚壒孌婄殑閫夐」銆傞鍏堬紝瑕侊紙浣跨敤 -Wl閫夐」錛夐氱煡閾炬帴鍣ㄧ敓鎴愪竴涓槧鍍忔枃浠訛紝騫訛紙浣跨敤 -g 閫夐」錛夐氱煡緙栬瘧鍣ㄧ敓鎴愯皟璇曠鍙楓傛渶緇堢敓鎴愬彲鎵ц鏂囦歡 test銆傚緱鍒版柊鐨勫彲鎵ц搴旂敤紼嬪簭涔嬪悗錛屾偍灝卞彲浠ヤ嬌鐢?nbsp;grep 宸ュ叿鍦ㄦ槧鍍忔枃浠朵腑鏌ユ壘 main 鏉ュ鎵懼畠鐨勫湴鍧浜嗐備嬌鐢ㄨ繖涓湴鍧鍜?Addr2line 宸ュ叿錛屽氨鍙互鍒ゆ柇鍑哄嚱鏁板悕錛?code style="font-size: small !important; ">main錛夈佹簮鏂囦歡錛?home/mtj/test/test.c錛変互鍙婂畠鍦ㄦ簮鏂囦歡涓殑琛屽彿錛?錛夈?/p>-e 閫夐」鏉ユ寚瀹氬彲鎵ц鏄犲儚鏄?nbsp;test銆傞氳繃浣跨敤 -f 閫夐」錛屽彲浠ュ憡璇夊伐鍏瘋緭鍑哄嚱鏁板悕銆?/p>
娓呭崟 4. addr2line 鐨勪竴涓氦浜掑紡渚嬪瓙 $ cat >> test.c #include <stdio.h> int main() { printf("Hello World\n"); return 0; } <ctld-d> $ gcc -Wl,-Map=test.map -g -o test test.c $ grep main test.map 0x08048258 __libc_start_main@@GLIBC_2.0 0x08048258 main $ addr2line 0x08048258 -e test -f main /home/mtj/test/test.c:4 $ Addr2line 鍜岃皟璇曞櫒
鍥?2. 瀵硅窡韙暟鎹繘琛屽鐞嗗拰綺劇畝錛屽茍鐢熸垚鐭╅樀鏍煎紡
緙栬瘧騫跺畨瑁呭伐鍏?/h2>
make 鍛戒護錛屽氨鍙互緙栬瘧 Pvtrace 宸ュ叿浜嗐備篃鍙互浣跨敤涓嬮潰鐨勪唬鐮佸皢榪欎釜宸ュ叿瀹夎鍒?/usr/local/bin 鐩綍涓細label錛岀敤瀹冩潵琛ㄧず杈瑰湪鍥句腑鐨勫悕縐般傛渶鍚庯紝鍦ㄧ 9 琛屽畬鎴愬璇ュ浘瑙勮寖鐨勫畾涔夈?/p>
娓呭崟 5. 浣跨敤 Dot 絎﹀彿琛ㄧず鐨勭ず渚嬪浘錛坱est.dot錛?/strong> 1: digraph G { 2: node1; 3: node2; 4: node3; 5: 6: node1 -> node2 [label="edge_1_2"]; 7: node1 -> node3 [label="edge_1_3"]; 8: node2 -> node3 [label="edge_2_3"]; 9: }
娓呭崟 6. 浣跨敤 Dot 鏉ュ垱寤?JPG 鏄犲儚 $ dot -Tjpg test.dot -o test.jpg $
鍥?3. Dot 鍒涘緩鐨勭ず渚嬪浘
ls 鍛戒護楠岃瘉宸茬粡鐢熸垚浜?trace.txt 鏂囦歡銆傚湪絎?8 琛岋紝鎴戣皟鐢ㄤ簡 Pvtrace 宸ュ叿錛屽茍鎻愪緵榪欎釜鏄犲儚鏂囦歡浣滀負瀹冩儫涓鐨勫弬鏁般傛槧鍍忓悕鏄繀闇鐨勶紝榪欐牱 Addr2line錛堝湪 Pvtrace 涓皟鐢級灝卞彲浠ヨ闂繖涓槧鍍忎腑鐨勮皟璇曚俊鎭傚湪絎?9 琛屼腑錛屾垜鍙堟墽琛屼簡涓嬈?nbsp;ls 鍛戒護錛屼互紜繚 Pvtrace 鐢熸垚浜?graph.dot 鏂囦歡銆傛渶鍚庯紝鍦ㄧ 12 琛岋紝浣跨敤 Dot 灝嗚繖涓浘褰㈣鑼冭漿鎹㈡垚涓涓?JPG 鍥懼艦鏄犲儚銆?/p>
娓呭崟 7. 鍒涘緩璋冪敤璺熻釜鍥劇殑鏁翠釜榪囩▼ 1: $ ls 2: instrument.c test.c 3: $ $ gcc -g -finstrument-functions test.c instrument.c -o test 4: $ ./test 5: $ ls 6: instrument.c test.c 7: test trace.txt 8: $ pvtrace test 9: $ ls 10: graph.dot test trace.txt 11: instrument.c test.c 12: $ dot -Tjpg graph.dot -o graph.jpg 13: $ ls 14: graph.dot instrument.c test.c 15: graph.jpg test trace.txt 16: $
鍥?4. 紺轟緥搴旂敤紼嬪簭鐨勮窡韙粨鏋?/strong>
鍥?5. Gzip 璺熻釜緇撴灉
鎻忚堪 鍚嶅瓧 澶у皬 涓嬭澆鏂規硶 Instrumentation source and Pvtrace source pvtrace.zip 4 KB HTTP