鎶€琛撻牷閬�

濞撳〒宸ユキ(y猫)
鎮ㄧ従(xi脿n)鍦ㄧ殑浣嶇疆锛� 涓湅鍌冲嫊缍�(w菐ng) > 鎶€琛撻牷閬� > 鎶€琛撶櫨绉� > GDBstub鐨勫墫鏋愯垏鏀归€�

GDBstub鐨勫墫鏋愯垏鏀归€�

鏅傞枔锛�2006-04-25 10:13:00渚嗘簮锛�0

灏庤獮锛�?GDBstub鐨勫墫鏋愯垏鏀归€�
鎽樿锛� 銆€銆€鏈枃瑷庤珫浜咷DB閬犵▼瑾胯│鎶€琛撳湪瑾胯│鍏ф牳銆佸祵鍏ュ紡绯荤当(t菕ng)涓殑瀵︾従(xi脿n)锛岀啊瑕侀棥杩癎DB瀹夸富姗熷拰GDB閬犵▼涓茶鍗�(xi茅)璀�锛岃┏绱板垎鏋怗DB瑾胯│浠g悊鍦ㄥ収鏍稿堡銆佹噳鐢ㄥ堡鐨勫悇绋鐝�(xi脿n)鏂规硶銆傚苟鎻愬嚭浜嗕竴绋湪涓嶄慨鏀规搷浣滅郴绲�(t菕ng)鍏ф牳鍓嶆彁涓嬭瑭︽噳鐢ㄧ▼搴忕殑鏂规硶銆傞€欑ó鏂规硶鍙Щ妞嶆€у挤锛岃€屼笖娑堥櫎浜嗕慨鏀圭郴绲�(t菕ng)鍏ф牳鍙兘甯朵締鐨勯毐鎮o紝娓涘皯浜嗗洜淇敼鍏ф牳鑰屽付渚嗙殑宸ヤ綔閲�銆傚湪瑾胯│寰収鏍告搷浣滅郴绲�(t菕ng)鏈嶅嫏鐨勬噳鐢ㄤ腑琛ㄦ槑锛屾鏂规硶闈炲父鏈夋晥銆� 闂滈嵉瑭烇細 銆€銆€閬犵▼瑾胯│锛泂tub锛汫DBserver锛� KGDB锛涘祵鍏ュ紡绯荤当(t菕ng)瑾胯│ Abstract锛� 銆€銆€This thesis discusses the realization of GDB remote debugging technology in kernel and embedded system. Firstly it describes the GDB host and GDB Remote Serial Protocol, then it analyses in detail the realization of GDBstub on kernel layer and application layer, at last the authors give a new method for debugging application while the OS kernel doesn鈥檛 be modified. This method has strong portability, and it eliminates the hidden trouble of OS kernel modification, also it reduces the workload subject to OS kernel modification. The application in debugging OS service of micro-kernel system shows that this method is reasonably efficient. Key words锛� 銆€銆€Remote debugging; stub; GDBserver; KGDB; embedded system debugging 1銆佸紩瑷€ 銆€銆€瑾胯│鏄枊鐧�(f膩)閬庣▼涓繀涓嶅彲灏戠殑鐠�(hu谩n)绡€(ji茅)锛岀劧鑰屽収鏍�銆佸祵鍏ュ紡绯荤当(t菕ng)鐨勮瑭︿笉鍚屼簬鍌崇当(t菕ng)鐨勮瑭︾郴绲�(t菕ng)銆傞€氬父宓屽叆寮忕郴绲�(t菕ng)涓嶅叿鍌欎娇鐢ㄦ湰鍦拌瑭﹀櫒鐨勮兘鍔�锛岀敱浜庯細 銆€銆€绯荤当(t菕ng)鑷韩鐨勮硣婧愭湁闄愩€傚収瀛樺皬锛岃几鍏ヨ几鍑鸿ō鍌欎笉鑳界敤浜庤瑭︺€� 銆€銆€鍌崇当(t菕ng)鐨勮瑭︾郴绲�(t菕ng)闇€瑕佹枃浠剁郴绲�(t菕ng)锛屽祵鍏ュ紡绯荤当(t菕ng)閫氬父鐒℃枃浠剁郴绲�(t菕ng)锛屽収鏍歌瑭︽檪閭勪笉鏀寔鏂囦欢绯荤当(t菕ng)銆� 銆€銆€瑾胯│鍣ㄧ殑閬嬭鏈韩闇€瑕佹搷浣滅郴绲�(t菕ng)鐨勬敮鎸�锛屽洜姝ょ劇娉曞鐝�(xi脿n)鎿嶄綔绯荤当(t菕ng)鍏ф牳鐨勮瑭︺€� 銆€銆€鏈€鏈夋晥鐨勮В姹烘柟娉曟槸閲囩敤閬犵▼瑾胯│鎶€琛�銆傞仩绋嬭瑭︽槸鎸囪瑭﹀櫒閬嬭鐨勭挵(hu谩n)澧冿紙涓绘锛夊拰琚瑭︾殑绯荤当(t菕ng)锛堢洰妯欐锛夊湪鐗╃悊涓婃槸鍒嗛洟鐨勶紝閫氶亷涓插彛鎴栬€呯恫(w菐ng)绲¢€茶閫f帴鐨勮瑭︽妧琛�銆� 銆€銆€GNU鍏嶈不鎻愪緵鐨凣DB灏辨搧鏈夊挤澶х殑閬犵▼瑾胯│鍔熻兘锛屽畠鑳藉浣块枊鐧�(f膩)浜哄摗浠ラ仩绋嬭瑭︾殑鏂瑰紡鍠鍩�(zh铆)琛岀洰妯欏钩鑷轰笂鐨勭▼搴忎唬纰�銆佽ō缃柗榛炪€佹煡鐪嬪収瀛�锛屽苟鍚岀洰妯欏钩鑷轰氦鎻涗俊鎭€侴DB閬犵▼瑾胯│鐨勫鏅�銆佸嫊鎱�(t脿i)銆佹柟渚�銆佸厤璨荤瓑鍎�(y艒u)榛炰娇瀹冮€愭几鎴愮偤宓屽叆寮忛枊鐧�(f膩)棣栭伕鐨勮瑭︽柟妗�銆� 銆€銆€閬犵▼瑾胯│绯荤当(t菕ng)鐢变笁閮ㄥ垎绲勬垚锛氫富姗熶笂鐨勬湰鍦拌瑭﹀櫒锛岀洰妯欐涓婄殑瑾胯│浠g悊锛岄仩绋嬭瑭﹀崝(xi茅)璀�銆傚鍦�1銆傚皪鎳変簬GDB閬犵▼瑾胯│绯荤当(t菕ng)鐨勪笁閮ㄥ垎锛欸DB锛孏DBstub, GDB閬犵▼涓茶鍗�(xi茅)璀般€備笅闈㈠氨閫欎笁閮ㄥ垎閫茶鍒嗘瀽銆� 鍦�1. 閬犵▼瑾胯│绯荤当(t菕ng) 2銆丷SP鍗�(xi茅)璀� 銆€銆€GDB RSP(Remote Serial Protocol)瀹氱京浜咷DB瀹夸富姗熻垏琚瑭︾洰妯欐閫茶閫氫俊鏅傛暩(sh霉)鎿�(j霉)鍖呯殑鏍煎紡銆備俊鎭殑鏍煎紡鏄細$鏁�(sh霉)鎿�(j霉)#鏍¢纰�銆傚鏁�(sh霉)鐨勪俊鎭兘浣跨敤ASCII纰硷紝鏁�(sh霉)鎿�(j霉)鐢变竴绯诲垪鐨凙SCII纰肩祫鎴�锛屾牎椹楃⒓鏄敱鍏╁€�16閫插埗鏁�(sh霉)绲勬垚鐨勫柈瀛楃瘈(ji茅)鏍¢纰笺€傛帴鍙楁柟鎺ュ彈鏁�(sh霉)鎿�(j霉)骞舵牎椹�锛岃嫢姝g⒑鍓囧洖鎳夆€滐紜鈥�锛岄尟瑾ゅ墖鍥炴噳鈥滐紞鈥濄€傞€氫俊鐨勫収瀹瑰寘鎷畝瀵暩(sh霉)鎿�(j霉)銆佹帶鍒剁▼搴忛亱琛�銆佸牨鍛婄▼搴忕媭鎱�(t脿i)绛夊懡浠�銆俁SP鐨勫熀鏈懡浠ゅ緸閫氫俊灏嶈┍瑙掑害鍙互鍒嗙偤鍏╃ó锛� 1锛� 璜嬫眰 ?锛氳畝鐣跺墠绯荤当(t菕ng)鐙€鎱�(t脿i) g锛氳畝鎵€鏈夊瘎瀛樺櫒 G:瀵墍鏈夊瘎瀛樺櫒 m锛氳畝鍏у瓨 M锛氬鍏у瓨 c锛氱辜绾�(x霉)鍩�(zh铆)琛� s: 鍠鍩�(zh铆)琛� k锛氱祩姝㈤€茬▼ 2锛� 绛斿京 鈥溾€濓細鍛婅ùGDB涓婃璜嬫眰鍛戒护涓嶆敮鎸併€� E锛氬憡瑷碐DB鍑洪尟 OK锛氫笂娆¤珛姹傛纰� W锛氱郴绲�(t菕ng)鍦╡xit_status鐙€鎱�(t脿i)涓嬮€€鍑�銆� X锛氱郴绲�(t菕ng)鍦╯ignal淇¤櫉涓嬬祩姝€€� S锛氱郴绲�(t菕ng)鍦╯ignal淇¤櫉涓嬪仠姝�銆� O锛氬憡瑷碐DB鎺у埗鑷鸿几鍑猴紝閫欎篃鏄敮涓€鍚慓DB鐧�(f膩)鍑虹殑鍛戒护 3銆丟DB閬犵▼瑾胯│鍔熻兘 銆€銆€瑾胯│鍏ф牳鏅傞€氬父閭勬矑鏈夋枃浠剁郴绲�(t菕ng)锛岃€屼笖澶氭暩(sh霉)宓屽叆寮忕敱浜庤嚜韬硣婧愮殑闄愬埗涓嶅叿鍌欐枃浠剁郴绲�(t菕ng)锛屽洜姝ゅ皣鑸囨枃浠剁郴绲�(t菕ng)鏈夐棞鐨勬簮鏂囦欢銆佺洰妯欐枃浠跺強绗﹁櫉琛ㄩ兘瀛樻斁鍦ㄤ富姗熶笂锛岀敱涓绘涓婄殑瑾胯│鍣ㄨ檿鐞嗐€傚悓妯�锛岃瑭︾敤鐨勮几鍏ヨ几鍑鸿ō鍌欎篃鏄敱涓绘鎻愪緵銆備富姗熶笂鐨勮瑭﹀櫒鎺ュ彈鐢ㄦ埗杓稿叆鐨勮瑭﹀懡浠ゅ苟閫茶闋愯檿鐞�锛屽皪浜庢湁浜涘懡浠わ紙濡俠reakpoint锛夌殑铏曠悊灏卞湪涓绘GDB涓婂鐝�(xi脿n)锛屼笉闇€瑕佸悓鐩姗熼€茶閫氫俊銆傜暥鐒讹紝鏇村鐨勬寚浠ら渶瑕佸湪鐩姗熶笂瑾胯│浠g悊涓婂鐝�(xi脿n)鐨�銆備富姗熷皣闋愯檿鐞嗗畬涔嬪悗鐨勫懡浠ゆ牴鎿�(j霉)RSP閫茶灏佽锛岀櫦(f膩)閫佺郸鐩姗熶笂鐨勮瑭︿唬鐞�锛岃瑭︿唬鐞嗘帴鍙楀懡浠ゅ悗浣滅浉鎳夌殑铏曠悊锛屽苟杩斿洖淇℃伅绲︿富姗熶笂鐨勮瑭﹀櫒銆� 4銆佺洰妯欐涓妔tub鐨勫鐝�(xi脿n) 銆€銆€鐩姗熶笂stub鐨勫熀鏈姛鑳芥槸鑸囦富姗烥DB閫茶閫氫俊锛屽鐝�(xi脿n)璁€瀵収瀛�銆佸瘎瀛樺櫒锛宻top锛宑ontinue銆備富姗烥DB鍚岀洰妯欐涓妔tub閫茶閫氫俊鐨勯€氱敤妯″瀷濡傚湒2锛� 鍦�2. GDB鍚岀洰妯欐涓妔tub閫氫俊鐨勯€氱敤妯″瀷 銆€銆€鐩姗熻垏涓绘閫氶亷纭欢閫f帴锛岃瑾胯│閮ㄥ垎鎻掑叆stub锛孏DB鑸囪瑾胯│閮ㄥ垎閫氶亷RSP閫茶閫氫俊銆傛牴鎿�(j霉)stub鎵€铏曞堡鐨勪笉鍚屼締瀵︾従(xi脿n)涓嶅悓灞ょ殑瑾胯│锛屽寘鎷収鏍稿堡銆佹噳鐢ㄥ堡鐨勮瑭�銆� 4.1 鍏ф牳灞よ瑭︽ā鍨� 鍦�3. 浣跨敤stub灏嶅収鏍搁€茶瑾胯│ 銆€銆€濡傚湒3锛屽皣stub鎻掑叆鍒板収鏍搁噷灏卞彲浠ュ鐝�(xi脿n)鍏ф牳鐨勮瑭︿簡銆侺inux鍏ф牳瑾胯│姗熷埗KGDB灏辨槸浣跨敤閫欑ó妯″紡銆侹GDB鍙互鍒嗙偤鍒濆鍖栨ā濉婂拰鎺у埗妯″銆� 4.1.1鍒濆鍖栨ā濉� 銆€銆€淇敼鐣板父铏曠悊鍑芥暩(sh霉)锛屼娇寰楀湪鐣板父鐧�(f膩)鐢熸檪閮介€插叆鍑芥暩(sh霉)handle_exception()锛岄€欐ǎGDB灏辫兘澶犳崟鐛查€欎簺鐣板父銆傚垵濮嬪寲涔嬪悗浣跨敤breakpoint()鍑芥暩(sh霉)灏囩郴绲�(t菕ng)鎺у埗娆婄洿鎺ヤ氦绲DB銆侹GDB灏嶇暟甯歌檿鐞嗗嚱鏁�(sh霉)鐨勪慨鏀瑰熀鏈笂鍙互鍒嗙偤浜岀ó銆� 瀹氱京瀹廋HK_REMOTE_DEBUG #define CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after) { if (linux_debug_hook != (gdb_debug_hook *) NULL && !user_mode(regs)) { (*linux_debug_hook)(trapnr, signr, error_code, regs) ; after; } }  鏀硅畩绋嬪簭鐨勬祦绋�锛屼互int3鐨勮檿鐞嗗嚱鏁�(sh霉)鐐轰緥 #define DO_VM86_ERROR(trapnr, signr, str, name) asmlinkage void do_##name(struct pt_regs * regs, long error_code) { CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,goto skip_trap) do_trap(trapnr, signr, str, 1, regs, error_code, NULL); skip_trap: return; } 灞曢枊DO_VM86_ERROR (3,SIGTRAP,"int3",int3) asmlinkage void do_int3(struct pt_regs *regs, long error_code) { if (linux_debug_hook 锛�= ( gdb_debug_hook *)NULL&&! user_mode(regs)) { (*linux_debug_hook)(3, SIGTRAP, errorcode, regs); goto skip_trap; } do_trap(3, SIGTRAP, "int3", 1, regs, error_code, NULL); skip_trap: return; } 寰炰互涓婁唬纰煎彲瑕�锛岄€插叆鍏ф牳瑾胯│鐙€鎱�(t脿i)涔嬪悗锛岀暟甯歌檿鐞嗗嚱鏁�(sh霉)灏辨槸handle_exception()锛岀▼搴忔祦绋嬭烦閬庝簡闈炶瑭︾媭鎱�(t脿i)鏅傜殑铏曠悊鍑芥暩(sh霉)do_trap銆� 涓嶆敼璁婄▼搴忕殑娴佺▼锛屼互鐣板父divide_error 鐨勮檿鐞嗗嚱鏁�(sh霉)鐐轰緥 #define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) asmlinkage void do_##name(struct pt_regs * regs, long error_code) { 鈥︹€� do_trap(trapnr, signr, str, 1, regs, error_code, &info); } 灞曢枊DO_VM86_ERROR_INFO( 0, SIGFPE, "divide error", divide_error, FPE_INTDIV, regs->eip) asmlinkage void do_divide_error (struct pt_regs *regs, long error_code) { if (linux_debug_hook 锛�= ( gdb_debug_hook *)NULL&&! user_mode(regs)) { (*linux_debug_hook)(3, SIGTRAP, errorcode, regs); } do_trap(0, SIGTRAP, "divide erro", 1, regs, error_code, &info); } 寰炰互涓婁唬纰间腑鐪嬩笉鍑鸿瑭︾媭鎱�(t脿i)璺熼潪瑾胯│鐙€鎱�(t脿i)鐨勫崁(q奴)鍒�锛岀劧鑰屾垜鍊戠湅涓€涓媎o_trap鍑芥暩(sh霉)涓彲鑳芥渻瑾跨敤鐨勫嚱鏁�(sh霉)die()銆� void die(const char * str, struct pt_regs * regs, long err) { CHK_REMOTE_DEBUG(1,SIGTRAP,err,regs,) do_exit(SIGSEGV); } 銆€銆€鐢辨鍙锛岃瑭︾媭鎱�(t脿i)涓嬬殑鐣板父铏曠悊鍑芥暩(sh霉)閭勬槸閫插叆浜唄andle_exception鍑芥暩(sh霉)銆備笉閬庤垏涓婇潰涓€绋暟甯镐笉鍚屼箣铏曞湪浜庯細鐣板父铏曠悊鍑芥暩(sh霉)鍦ㄨ瑭﹁垏闈炶瑭︾媭鎱�(t脿i)涓嬬殑绋嬪簭娴佺▼鏄浉鍚岀殑锛宧andle_exception鍙彁渚涚嵅鍙栫郴绲�(t菕ng)鐣舵檪鐨勭媭鎱�(t脿i)锛岀辜绾�(x霉)閬嬭鐨勭祼鏋滈倓鏄痙o_exit銆� 銆€銆€闆栫劧涓嶆槸鎵€鏈夌暟甯稿嚱鏁�(sh霉)閮芥槸鎸変笂杩板叐绋柟娉曞畾缇╃殑锛屼絾鏈唱涓婇兘鍙互姝稿妰鐐哄叾涓€锛岄’鐒剁禃澶у鏁�(sh霉)铏曠悊鍑芥暩(sh霉)鐨勪慨鏀瑰爆浜庣浜岀ó锛屽洜鐐虹涓€绋暟甯稿氨鏄偤瑾胯│婧栧倷鐨�銆傚洜姝ゅ湪鐩姗熷叿鏈夎瑭︾敤鐨勮几鍑鸿ō鍌欑殑鎯呮硜涓�锛屽畬鍏ㄥ彲浠ヤ笉淇敼绗簩绋暟甯歌檿鐞嗗嚱鏁�(sh霉)锛屽洜鐐簂inux鍏ф牳鍦ㄩ潪瑾胯│鐙€鎱�(t脿i)涓嬬殑鐣板父铏曠悊鍑芥暩(sh霉)宸茬稉(j墨ng)杓稿嚭蹇呰鐨勭媭鎱�(t脿i)淇℃伅銆佸嚭閷俊鎭�銆� 4.1.2鎺у埗妯″ 銆€銆€鍦ㄦ帶鍒舵ā濉婂畬鎴愯垏涓绘GDB鐨勯€氫俊锛屽叿楂旀祦绋嬪鍦�4锛宧andle_exception鍑芥暩(sh霉)棣栧厛鍒ゆ柗CPU鏄惁铏曚簬VM86妯″紡鎴栫敤鎴舵厠(t脿i)锛岃嫢鏄墖杩斿洖锛屽彲瑕婯GDB鍙瑭﹀収鏍告厠(t脿i)绋嬪簭銆傜劧鍚庢帴鍙桮DB鐧�(f膩)渚嗙殑淇℃伅锛屾牴鎿�(j霉)鎺ュ彈鐨勪俊鎭綔鍑虹浉鎳夌殑鎿嶄綔鍜屽洖寰�銆傛祦绋嬪湒鐨勮櫅绶氭鍏ф槸鎵€鏈塆DBstub涓環andle_exception鍑芥暩(sh霉)鐨勯€氱敤娴佺▼銆� 4.2 鎳夌敤绋嬪簭瑾胯│妯″瀷 銆€銆€鍦ㄥ祵鍏ュ紡Linux闁嬬櫦(f膩)闋樺煙閲岃瑭︽噳鐢ㄧ▼搴忓父鐢ㄨ瑭︿唬鐞嗗伐鍏稧DBserver锛屽叾宸ヤ綔鍘熺悊骞朵笉鏄皣stub绶ㄨ鍦ㄨ瑾胯│鎳夌敤绋嬪簭鍏э紝鑰屾槸鎶婅瑾胯│绋嬪簭浣滅偤GDBserver鐨勫瓙閫茬▼锛岄€欐ǎGDBserver灏卞彲浠ュ埄鐢ㄥ収鏍告彁渚涚殑浠g⒓璺熻工姗熷埗(ptrace)鐩�(ji膩n)鎺ц瑾胯│閫茬▼鐨勯亱琛岋紝寰炶€屼締瀹屾垚瑾胯│浠诲嫏銆傛宸ヤ綔鍘熺悊鍚孏DB鏈湴瑾胯│鐩镐技銆傚叾瑾胯│妯″瀷濡傚湒5銆侴DBserver鐨勫伐浣滄祦绋嬫槸锛欸DBserver鍓�(chu脿ng)寤哄瓙閫茬▼锛�>缍佸畾璺熻工ptrace(ptrace_traceme,,)锛�>寰炰富姗熷偝渚嗙殑鍚勭ó瑾胯│鍛戒护閫氶亷GDBserver杞夊寲鐐哄悇绋搷浣滈渶姹傜殑ptrace銆傞’鐒讹紝濡傛灉瑕佺敤GDBserver渚嗛€茶閬犵▼瑾胯│鐨勮┍锛屽氨闇€瑕佸収鏍告搷浣滅郴绲�(t菕ng)鐨勬敮鎸�锛屽寘鎷瓙閫茬▼銆佷唬纰艰窡韫ゆ鍒�锛岄€欐ǎ灏嶄簬鍏朵粬宓屽叆寮忕郴绲�(t菕ng)鍏ф牳宸ヤ綔閲忔渻姣旇純澶�銆傝€屼笖ptrace涔熸湁鍏跺眬闄愭€�锛屾瘮濡傚彧鑳借窡韫ゅ畠鐨勫瓙閫茬▼锛屽湪瑾胯│閫茬▼鍜岃瑾胯│閫茬▼涔嬮枔鍌抽€佷竴鍊嬮暦瀛楃殑鏁�(sh霉)鎿�(j霉)銆備娇鐢ㄩ€氱敤鐨勮瑭︽ā寮忓伐浣滈噺鏈冩洿灏忋€傚鍦�6锛屽皣stub绶ㄨ鍦ㄦ噳鐢ㄧ▼搴忎腑锛屽苟鍦ㄦ噳鐢ㄧ▼搴忓叆鍙h檿灏辨彃鍏ユ柗榛烇紝绋嬪簭闁嬪灏变笂鎺у埗娆婁氦绲DB锛屼箣鍚庣殑娴佺▼璺熷収鏍稿堡瑾胯│椤炰技銆� 鍦�4. GDBKGDB涓環andle_exception鍑芥暩(sh霉)娴佺▼ 鍦�5. 浣跨敤GDBserver灏嶆噳鐢ㄧ▼搴忛€茶瑾胯│ 鍦�6. 浣跨敤stub灏嶆噳鐢ㄧ▼搴忛€茶瑾胯│ 5. 涓嶄慨鏀瑰収鏍稿墠鎻愪笅瑾胯│鎳夌敤绋嬪簭 銆€銆€GDB瀵︾従(xi脿n)瑷疆鏂烽粸鐨勬柟寮忔槸浣跨敤鍏у瓨鐨勮畝瀵紝鍗冲皣鍘熸寚浠ょ敤涓€鍊媡rap鎸囦护浠f浛锛屼娇寰楃▼搴忓煼(zh铆)琛屽埌瑭叉寚浠ゆ檪鐢�(ch菐n)鐢熷柈姝ヨ瑭︿腑鏂�锛岀劧鍚庡氨閫插叆鐣板父铏曠悊鍑芥暩(sh霉)锛岄嚌灏嶈瑭﹀櫒鐨勫悇绋搷浣滆檿鐞嗗嚱鏁�(sh霉)闇€瑕佷綔鍑虹浉鎳夌殑鎿嶄綔銆備笉鍚岀殑绯荤当(t菕ng)鎻愪緵涓嶅悓鐨勮瑭︾暟甯告寚浠�锛屽int3锛宼rap2绛�锛岄’鐒跺皪浜庝娇鐢ㄩ€欎簺纭欢骞宠嚭鎻愪緵鐨勬柗榛炴寚浠ょ偤浜嗗鐝�(xi脿n)GDBstub瑾胯│鍔熻兘闇€瑕佹敼瀵€欎簺鎸囦护鐣板父铏曠悊鍑芥暩(sh霉)銆傚洜姝や竴鑸殑瑾胯│绯荤当(t菕ng)鍣ㄦ垨瑾胯│浠g悊閮介渶瑕佹秹鍙婂柈姝ヨ瑭︽寚浠ょ殑铏曠悊鍑芥暩(sh霉)锛岄渶瑕佺郴绲�(t菕ng)鍏ф牳鐨勬敮鎸�銆備笂闈㈡彁鍒扮殑KGDB淇敼浜嗙暟甯歌檿鐞嗗嚱鏁�(sh霉)锛孏DBserver闇€瑕佺郴绲�(t菕ng)鍏ф牳鎻愪緵ptrace鍑芥暩(sh霉)銆傞€欑ó鏂规硶瀛樺湪涓€浜涗笉瓒充箣铏曪細淇敼鍏ф牳宸ヤ綔閲忓ぇ锛岀Щ妞嶆€у樊銆傞嚌灏嶉€欎簺鎯呮硜鎴戝€戝彲浠ラ噰鐢ㄥ彟涓€绋柗榛炲鐝�(xi脿n)鏂规锛氬湪stub涓畾缇╀竴鍊嬭ō缃柗榛炲嚱鏁�(sh霉)銆� 銆€銆€鏂烽粸鍑芥暩(sh霉)妯℃摤瑾胯│鐣板父鎸囦护锛屽鐝�(xi脿n)淇濊鐝�(xi脿n)鍫淬€佽鐢ㄧ暟甯歌檿鐞嗗嚱鏁�(sh霉)銆佹仮寰╃従(xi脿n)鍫村苟灏囨帶鍒舵瑠浜ょ郸琚瑭︾▼搴�銆傛柗榛炲嚱鏁�(sh霉)鐨勫熀鏈祦绋嬪涓�銆� #define BREAKPOINT __asm__ __volatile__(" bl ent_exception\n) void debug_trap() { __asm__ __volatile__( " ent_exception: \n" 淇濆瓨鐝�(xi脿n)鍫� " bl handle_exception \n" " out_exception: \n" 鎭㈠京鐝�(xi脿n)鍫� ); } handle_exception()鍑芥暩(sh霉)娴佺▼椤炰技鍦�4涓殑铏涚窔妗嗛儴鍒�銆傚叾涓湁涓€榛烇紝涔熸槸閫欑ó鏂规硶瀵︾従(xi脿n)鐨勯棞閸甸儴鍒嗘槸锛氭柗榛炴寚浠ょ殑鏇挎彌銆傛柗榛炶ō缃檪寰濭DB鍌抽亷渚嗙殑纭欢骞宠嚭鎻愪緵鐨勬柗榛炵暟甯告寚浠ょ殑浜岄€插埗纰硷紝蹇呴爤灏囨浜岄€插埗纰兼浛鎻涙垚鍦╯tub涓柊瀹氱京鐨凚REAKPOINT浜岄€插埗纰�锛岄€欐ǎ鎵嶈兘閫插叆瑾胯│鐣板父铏曠悊鍑芥暩(sh霉)銆傚洜姝ゅ湪handle_exception()鍑芥暩(sh霉)涓�锛屽鏋滄敹鍒扮殑璜嬫眰鏄€淢鈥�锛屽墖闇€瑕佷綔浜涜檿鐞�锛屾祦绋卞鍦�7锛� 鍦�7. 鏇挎彌鎸囦护 銆€銆€閫欑ó鏂规硶鐞嗚珫涓婂湪鍏ф牳瑾胯│鍜屾噳鐢ㄧ▼搴忚瑭︿腑閮藉彲浠ヤ娇鐢紝浣嗗湪鎳夌敤绋嬪簭鐨勮瑭︿腑鍏跺劒(y艒u)榛炴洿鏄庨’銆傞€欑ó鏂规硶鍦ㄥstub鏅傚€欎笉娑夊強鍏ф牳锛屽湪瑾胯│鎳夌敤绋嬪簭鏅備笉闇€瑕佸垏鎻涘埌鍏ф牳妯″紡涓嬶紝鐩存帴鍦ㄧ敤鎴舵ā寮忎腑灏卞彲浠ュ畬鎴�銆傞€欑ó鏂规硶涔熷瓨鍦ㄤ簺涓嶈冻涔嬭檿銆傜偤浜嗗鐝�(xi脿n)鐝�(xi脿n)鍫翠繚璀�锛岃姹傜敤鎴朵簡瑙g郴绲�(t菕ng)鍏х殑瀵勫瓨鍣ㄣ€傞毃钁梥tub鏈韩寰╅洔搴︾殑澧炲姞锛屽畠鐨勬纰烘€ч渶瑕佹洿澶氱殑妾㈤銆� 6銆佺祼鏉熻獮 鍔爏tub鐨勯仩绋嬭瑭︽柟娉曟柟渚胯€屾湁鏁�锛岃€屼笖鍙互闄嶄綆闋呯洰鎴愭湰锛屽湪瀵﹂殯宸ヤ綔涓緱鍒板唬娉涚殑鐮旂┒鍜屾噳鐢ㄣ€傛湰鏂囨彁鍒板湪涓嶄慨鏀瑰収鏍稿墠鎻愪笅瑾胯│鎳夌敤绋嬪簭鐨勬柟娉曞凡鎴愬姛鎳夌敤浜庢垜鍊戣嚜宸遍枊鐧�(f膩)鐨勫井鍏ф牳绲愭鐨勬搷浣滅郴绲�(t菕ng)閲�锛岀偤瑭茬郴绲�(t菕ng)鐨勯枊鐧�(f膩)鎳夌敤鎻愪緵鑹ソ鐨勮瑭︽墜娈点€傜暥鐒跺姞stub鐨勯仩绋嬭瑭︽柟娉曚篃瀛樺湪涓€浜涗笉瓒�銆傞’鐒秙tub鐨勬噳鐢ㄦ槸鍦ㄤ覆鍙i€氫俊鐨勫熀绀庝笂锛屽洜姝や覆鍙h檿鐞嗗嚱鏁�(sh霉)浠ュ強stub鑷韩铏曠悊鍑芥暩(sh霉)鐨勬纰烘€ф槸纰轰繚stub瀹夊叏瑾胯│鐨勫墠鎻�銆� 鍙冭€冩枃鐛� [1].鏉庣磪琛�(w猫i)鏉庣繝钀嶏紝kgdb瑾胯│Linux鍏ф牳鑲嬪墫鏋愯垏鏀归€�锛屽井鍨嬫鑸囨噳鐢�锛�2004骞寸10鏈� [2].閮嫕瓒咃紝GDB閬犵▼瑾胯│鍙婂叾鍦ㄥ祵鍏ュ紡Linux绯荤当(t菕ng)涓殑鎳夌敤,瑷堢畻姗熷伐绋嬭垏鎳夌敤,2004骞寸26鍗风10鏈�. [3].褰€插睍锛孏RDBS:涓€绋嚌灏嶅祵鍏ュ紡绯荤当(t菕ng)鐨勯€氱敤閬犵▼瑾胯│绯荤当(t菕ng),瑷堢畻姗熷伐绋�锛�2003骞�2鏈堢29鍗风2鏈�. [4] .Gatliff, Bill, Embedding with GNU: the gdb Remote Serial Protocol, Embedded Systems Programming, September 1999, p. 109. [5].Gilmore J, Shebs S, GDB Internals: A Guild to the Internals of the GNU Debugger, Free Software Foundation Inc.,1999. 銆€ 浣滆€呭柈浣嶏細娴欐睙澶у瑷堢畻姗熺郴 銆€ 鍦板潃锛氭禉姹熷ぇ瀛哥帀娉夋牎鍗€(q奴)4鑸�230銆€310027銆€ Email锛歭iulin@zju.edu.cn

妯欑敖锛�

榛炶磰

鍒嗕韩鍒帮細

涓婁竴绡囷細鍠墖姗熺牬瑙g殑甯哥敤鏂规硶鍙婃噳灏嶇瓥鐣�

涓嬩竴绡囷細寰兘WIN-V63鐭㈤噺鎺у埗璁婇牷鍣ㄥ湪...

涓湅鍌冲嫊缍�(w菐ng)鐗堟瑠鑸囧厤璨伈鏄庯細鍑℃湰缍�(w菐ng)娉ㄦ槑[渚嗘簮锛氫腑鍦嬪偝鍕曠恫(w菐ng)]鐨勬墍鏈夋枃瀛�銆佸湒鐗囥€侀煶瑕栧拰瑕栭牷鏂囦欢锛岀増娆婂潎鐐轰腑鍦嬪偝鍕曠恫(w菐ng)(www.wangxinlc.cn)鐛ㄥ鎵€鏈�銆傚闇€杞夎級璜嬭垏0755-82949061鑱�(li谩n)绯�銆備换浣曞獟楂�銆佺恫(w菐ng)绔欐垨鍊嬩汉杞夎級浣跨敤鏅傞爤娉ㄦ槑渚嗘簮鈥滀腑鍦嬪偝鍕曠恫(w菐ng)鈥�锛岄仌鍙嶈€呮湰缍�(w菐ng)灏囪拷绌跺叾娉曞緥璨换銆�

鏈恫(w菐ng)杞夎級骞舵敞鏄庡叾浠栦締婧愮殑绋夸欢锛屽潎渚嗚嚜浜掕伅(li谩n)缍�(w菐ng)鎴栨キ(y猫)鍏ф姇绋夸汉澹�锛岀増娆婂爆浜庡師鐗堟瑠浜�銆傝綁杓夎珛淇濈暀绋夸欢渚嗘簮鍙婁綔鑰咃紝绂佹鎿呰嚜绡℃敼锛岄仌鑰呰嚜璨犵増娆婃硶寰嬭铂浠汇€�

缍�(w菐ng)绔欑啊浠�|鏈冨摗鏈嶅嫏|鑱�(li谩n)绯绘柟寮�|骞姪淇℃伅|鐗堟瑠淇℃伅|缍�(w菐ng)绔欏湴鍦�|鍙嬫儏閺堟帴|娉曞緥鏀寔|鎰忚鍙嶉|sitemap

鍌冲嫊缍�(w菐ng)-宸ユキ(y猫)鑷嫊鍖栬垏鏅鸿兘鍒堕€犵殑鍏ㄥ獟楂斺€滀簰鑱�(li谩n)缍�(w菐ng)+鈥濆壍(chu脿ng)鏂版湇鍕欏钩鑷�

缍�(w菐ng)绔欏鏈�鏈嶅嫏鍜ㄨ閲囪臣鍜ㄨ濯掗珨鍚堜綔

Chuandong.com Copyright ?2005 - 2025 锛孉ll Rights Reserved 娣卞湷甯傚ェ缇庡ぇ鍞愬唬鍛婃湁闄愬叕鍙� 鐗堟瑠鎵€鏈�
绮礗CP鍌� 14004826铏� | 鐕熸キ(y猫)鍩�(zh铆)鐓ц瓑鏇� | 涓嶈壇淇℃伅鑸夊牨涓績 | 绮靛叕缍�(w菐ng)瀹夊倷 44030402000946铏�