鎽樿锛�
銆€銆€鏈枃瑷庤珫浜咷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