鏇夸唬緋葷粺鑷甫鐨刴alloc/new鍘熷洜鏃犻潪涓や釜錛?nbsp;
reason 1. 鍋氬唴瀛榩rofile鎴栨煡鎵鵑棶棰?
reason 2. 鑷畾涔夌殑鍒嗛厤鏂規鎻愰珮鎬ц兘
涓嶈繃鏂囩珷[1]涓鏄庝簡錛屾浛浠e叏灞new涓嶆槸涓涓ソ鍋氭硶. 鍏跺疄瑕佽揪鍒頒互涓婁袱鐐圭洰鐨勶紝絎旇呰涓虹敤valgrind宸ュ叿閾懼氨鍙互浜嗐?/span>
瑙e喅鏂規錛?/strong>
1. 鐢╲algrind鍜宮assif
valgrind鐨刴emcheck鍋氬唴瀛樻硠闇插拰bug鐨勬煡鎵? 閲岄潰鐨刴assif宸ュ叿鍖呭仛鍐呭瓨鎬ц兘profile, 瓚崇煟銆傛瘮鑷繁灞卞鐨勪竴涓猵rofiler瑕佸ソ銆?/span>
娉ㄦ剰錛歵cmalloc鐩墠榪樹笉鑳藉緢濂芥敮鎸乿algrind, 瀹炴祴涓璲emalloc鍙互
2. linux涓婥鐨勭▼搴忓彲浠ョ敤wrap鐨勬柟寮?鐩稿綋浜巔ython鐨刣ecorator)
緙栬瘧鍔犱笂閫夐」錛歡cc -Wl,-wrap,malloc
鍙互鍋氬埌瀵筸alloc榪欎釜鍑芥暟錛宭inker浼氳皟鐢╛_wrap_malloc浠f浛涔? 鑻ヨ璋冪敤鍘熸潵鐨刴alloc鍑芥暟__real_malloc
緙虹偣錛氫緷璧栦簬緙栬瘧鍣ㄦ敮鎸侊紱 瀵筩++鐨刵ew涓嶈搗浣滅敤 --> 涓嶅疄鐢?/span>
鍚ず錛氳繖涓柟娉曚綔涓篺unction瑁呴グ鍣紝瀵逛簬璋冭瘯鍒殑闂鍊掓湁甯姪銆傦紙渚嬪涓嶆敼鍙樺嚱鏁扮殑鎯呭喌涓嬶紝wrap涓灞傦紝杈撳嚭浜涜皟璇曚俊鎭?
3. 鐢╛_malloc_hook
#include <malloc.h>
void *(*__malloc_hook)(size_t size, const void *caller);
緙虹偣錛氫緷璧朑NU緙栬瘧宸ュ叿閾? 瀹規槗姝誨驚鐜?鎯沖埄鐢ㄥ師鏈塵alloc錛岃鍙傝冧緥瀛愪腑錛屾妸鍘焈_malloc_hook鍙橀噺淇濆瓨璧鋒潵浣跨敤錛屽茍鎭㈠鐜板満)
4. LD_PRELOAD娉ㄥ叆.so 錛屾浛浠e師
鐜鍙橀噺LD_PRELOAD鎸囧畾紼嬪簭榪愯鏃朵紭鍏堝姞杞界殑鍔ㄦ佽繛鎺ュ簱錛岃繖涓姩鎬侀摼鎺ュ簱涓殑絎﹀彿浼樺厛綰ф槸鏈楂樼殑銆傛爣鍑?/span>C鐨勫悇縐嶅嚱鏁伴兘鏄瓨鏀懼湪libc.so.6鐨勬枃浠朵腑錛屽湪紼嬪簭榪愯鏃惰嚜鍔ㄩ摼鎺ャ備嬌鐢?/span>LD_PRELOAD鍚庯紝鑷繁緙栧啓鐨?/span>malloc鐨勫姞杞介『搴忛珮浜?/span>glibc涓殑malloc錛岃繖鏍峰氨瀹炵幇浜嗘浛鎹€傜敤娉?/span> LD_PRELOAD=" ./mymalloc.so"
緙虹偣錛氬湪鐢熶駭鐜涓嶇幇瀹炪傚洜涓篖D_PRELOAD鐩稿綋浜庡簱娉ㄥ叆錛屾湁瀹夊叏鎬ч棶棰橈紝鏄繀欏葷姝㈢殑銆?鐢熶駭鐜寰堝鏃跺欑敤-static榪炴帴)
5. 鐢ㄥ畯鎴栧彟澶栫殑鍑芥暟鏇夸唬new/malloc
姣斿瀹氫箟涓涓畯鎴栬呮寚瀹氱殑鍑芥暟錛岃瀹氭墍鏈夌殑鍒嗛厤閲婃斁閮借皟鐢ㄤ粬銆傝繖鏍風浉褰撲簬緇欓」鐩紩鍏ヤ簡棰濆鐨勪唬鐮佽鍒?鑰屼笖鏄竴绔嬮」灝辮閬靛驚榪欎釜瑙勫垯錛屽惁鍒欒鏂規硶鏃犳晥錛夛紝涓嶈兘寰堣嚜鐒剁殑new/delete, 濡傛灉鍒嗛厤鍜岄噴鏀捐皟鐢ㄥ緱涓嶄竴鑷達紝浼氫駭鐢熼棶棰樼殑銆傛煇浜у搧緇勫氨鏄敤瀹忥紝鐒跺悗鍔犱笂__FILE__, __LINE__涔嬬被鐨勪俊鎭?br />
鏈夋椂鍊檝algrind鐨勬晥鐜囨槸涓棶棰?灝ゅ叾鐢熶駭鐜)錛岃繖縐嶆柟妗堟湁鍏朵環鍊兼墍鍦? 灝辨槸浠g爜鐪嬩笂鍘繪瘮杈僽gly緗簡
鐢ㄥ畯鐨勪緥瀛愶細
#define _New(Type, Catergory) (Type*)MyMemController::New((new Type), #Type, 1, sizeof(Type), Catergory, __FILE__, __LINE__, false)
#define _NewArray(Type, N, Catergory) (Type*)MyMemController::New((new Type[N]), #Type, N, sizeof(Type)*(N), Catergory, __FILE__, __LINE__, true)
MALLOC鐨勬浛浠e搧錛?/strong>
鑷繁鍐欎竴涓猰alloc鍏跺疄寰堝鏉傦紝瑕佽冭檻綰跨▼瀹夊叏絳夊悇縐嶉棶棰橈紝鎬ц兘鍒板ご鏉ュ彲鑳芥洿宸俫oogle 鐨則cmalloc, facebook浣跨敤鐨刯emalloc. 澶氱嚎紼嬩笅鎬ц兘杈冨ソ錛屽彲浠ヨ冭檻浣跨敤銆?br />
緙虹偣錛氱瑪鑰呭皾璇曡繃銆倀cmalloc涓嶈兘姝g‘鐢╲algrind,鍙兘鐢ㄨ嚜甯perftools錛堣繍琛屼腑浼歝ore)
jemalloc鍙互浣跨敤valgrind錛屼笉榪囪繕娌″畬鍏ㄩ獙璇佹槸鍚﹂兘鍑嗙‘銆?/span>
tcmalloc鐩稿叧:
鍦?4浣嶇郴緇熶笂瑕佽libunwind, 瀵箈86-64鏋舵瀯浣跨敤榪樻湁浜涢棶棰?br />
婧愮爜鍖呯殑INSTALL鏂囨。閲岄潰涔熸彁鍒頒簡榪欎釜闂銆?br /> CAUTION: if you install libunwind from the url above, be aware that
you may have trouble if you try to statically link your binary with
perftools: that is, if you link with 'gcc -static -lgcc_eh ...'.
This is because both libunwind and libgcc implement the same C++
exception handling APIs, but they implement them differently on
some platforms. This is not likely to be a problem on ia64, but
may be on x86-64.
涓昏鏄?4浣嶆満frame-pointer鐨勫獎鍝? 浠栫殑profile宸ュ叿閲岀殑backtrace鐢╨ibunwind榪欎釜搴擄紝榪欎釜搴撳張鏈夌増鏈棶棰橈紝鍚勭鍥у晩....
絎旇呰瘯榪囩郴緇焫86-64, freebsd錛岀敤闈欐侀摼鎺ャ傚疄闄呯敤浜嗕竴涓嬶紝闂寰堝寰堟姌鑵撅紝絳変粬fix浜嗗啀璇村惂.
windows涓嬪彲浠ュ弬鑰冿細
jemalloc鏆傛椂鏈彂鐜版湁浠涔堝吋瀹規ч棶棰橈紝榪愯寰楁尯濂界殑銆?/span>