锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鏈瘒鏂囩珷寰椾富瑕佺洰鐨勬槸浠嬬粛WINDBG鐨勪富瑕佸姛鑳戒互鍙婄浉鍏崇殑鍛戒護銆傚叧浜庤繖浜涘懡浠ょ殑璇︾粏璇硶錛岃鍙傞槄甯姪鏂囦歡銆傚鏂囩珷涓彁鍒扮殑璁稿鍛戒護錛學INDBG鏈夌浉搴旂殑鑿滃崟閫夐」銆? 鍦ㄥ懡浠わ紙Command錛夌獥鍙d腑杈撳叆.hh 鍛戒細璋冨嚭甯姪鏂囦歡浠ゃ?/p>
.hh keyword 浼氭樉紺哄叧浜巏eyword鐨勮緇嗗懡浠ゃ?/p>
2.鍚姩Debugger Windbg鍙互鐢ㄤ簬濡備笅涓夌璋冭瘯錛?/p>
a.榪滅▼璋冭瘯錛氫綘鍙互浠庢満鍣ˋ涓婅皟璇曞湪鏈哄櫒B涓婃墽琛岀殑紼嬪簭銆傚叿浣撴楠ゅ涓嬶細 ? 鍦ㄦ満鍣˙涓婂惎鍔ㄤ竴涓皟璇曠獥鍙o紙Debug Session錛夈備綘鍙互鐩存帴鍦╓indbg涓嬭繍琛屼竴涓▼搴忔垨鑰呭皢Windbg闄勫姞錛圓ttach錛夊埌涓涓繘紼嬨?/p>
? 鍦ㄦ満鍣˙鐨刉indbg鍛戒護紿楀彛涓婂惎鍔ㄤ竴涓繙紼嬭皟璇曟帴鍙o紙remote錛夛細 .server npipe:pipe=PIPE_NAME PIPE_NAME鏄鎺ュ彛鐨勫悕瀛椼?/p>
? 鍦ㄦ満鍣ˋ涓婅繍琛岋細 windbg –remote npipe:server=SERVER_NAME,pipe=PIPE_NAME SERVER_NAME鏄満鍣˙鐨勫悕瀛椼?/p>
b.Dump鏂囦歡璋冭瘯錛氬鏋滃湪浣犵殑瀹㈡埛鐨勬満鍣ㄤ笂鍑虹幇闂錛屼綘鍙兘涓嶈兘浣跨敤榪滅▼璋冭瘯鏉ヨВ鍐抽棶棰樸備綘鍙互瑕佹眰浣犵殑鐢ㄦ埛灝哤indbg闄勫姞鍒板嚭鐜伴棶棰樼殑榪涚▼涓婏紝鐒跺悗鍦ㄥ懡浠ょ獥鍙d腑杈撳叆: .dump /ma File Name 鍒涘緩涓涓狣ump鏂囦歡銆傚湪寰楀埌Dump鏂囦歡鍚庯紝浣跨敤濡備笅鐨勫懡浠ゆ潵鎵撳紑瀹冿細 windbg –z DUMP_FILE_NAME c.鏈湴榪涚▼璋冭瘯錛氫綘鍙互鍦╓indbg涓嬬洿鎺ヨ繍琛屼竴涓▼搴忥細 Windbg “path to executable” arguments 涔熷彲浠ュ皢Windbg闄勫姞鍒頒竴涓鍦ㄨ繍琛岀殑紼嬪簭錛?/p>
Windbg –p “process id” Windbg –pn “process name” 娉ㄦ剰鏈変竴縐嶉潪渚靛叆錛圢oninvasive錛夋ā寮忓彲浠ョ敤鏉ユ鏌ヤ竴涓繘紼嬬殑鐘舵佸茍涓嶈繘紼嬬殑鎵ц銆傚綋鐒跺湪榪欑妯″紡涓嬫棤娉曟帶鍒惰璋冭瘯紼嬪簭鐨勬墽琛屻傝繖縐嶆ā寮忎篃鍙互鐢ㄤ簬鏌ョ湅涓涓凡緇忓湪Debugger鎺у埗涓嬭繍琛岀殑榪涚▼銆傚叿浣撳懡浠ゅ涓嬶細 Windbg –pv –p “process id” Windbg –pv –pn “process name” 璋冭瘯澶氫釜榪涚▼鍜岀嚎紼?/p>
濡傛灉浣犳兂鎺у埗涓涓繘紼嬩互鍙婂畠鐨勫瓙榪涚▼鐨勬墽琛岋紝鍦╓indbg鐨勫懡浠よ涓婂姞涓?o閫夐」銆俉indbg涓繕鏈変竴涓柊鐨勫懡浠?childdbg 鍙互鐢ㄦ潵鎺у埗瀛愯繘紼嬬殑璋冭瘯銆傚鏋滀綘鍚屾椂璋冭瘯鍑犱釜榪涚▼錛屽彲浠ヤ嬌鐢?| 鍛戒護鏉ユ樉紺哄茍鍒囨崲鍒頒笉鍚岀殑榪涚▼銆?/p>
鍦ㄥ悓涓涓繘紼嬩腑鍙兘鏈夊涓嚎紼嬨倊鍛戒護鍙互鐢ㄦ潵鏄劇ず鍜屽垏鎹㈢嚎紼嬨?/p>
------------------------------------------------------------ 璋冭瘯鍓嶇殑蹇呭宸ヤ綔 鍦ㄥ紑濮嬭皟璇曞墠棣栧厛瑕佸仛鐨勫伐浣滄槸璁劇疆濂界鍙鳳紙Symbols錛夎礬寰勩傛病鏈夌鍙鳳紝浣犵湅鍒扮殑璋冪敤鍫嗘爤鍩烘湰涓婃鏃犳剰涔夈侻icrosoft鐨勬搷浣滅郴緇熺鍙鋒枃
浠訛紙PDB錛夋槸瀵瑰鍏紑鐨勩傚彟澶栬娉ㄦ剰鍦ㄧ紪璇戜綘鑷繁鐨勭▼搴忛夋嫨鐢熸垚PDB鏂囦歡鐨勯夐」銆傚鏋滆緗ソ絎﹀彿璺緞鍚庯紝璋冪敤鍫嗘爤鐪嬭搗鏉ヨ繕鏄笉瀵廣傚彲浠ヤ嬌鐢╨m,
!sym noisy, !reload 絳夊懡浠ゆ潵楠岃瘉絎﹀彿璺緞鏄惁姝g‘銆? Windbg涔熸敮鎸佹簮鐮佺駭鐨勮皟璇曘傚湪寮濮嬫簮鐮佽皟璇曞墠錛屼綘闇瑕佺敤.srcpath璁劇疆婧愪唬鐮佽礬寰勩傚鏋滀綘鏄湪鐢熸垚鎵鎵ц浠g爜鐨勬満鍣ㄤ笂榪涜璋冭瘯錛岀鍙鋒枃
浠朵腑鐨勬簮鐮佽礬寰勪細鎸囧悜姝g‘鐨勪綅緗紝鎵浠ヤ笉闇瑕佽緗簮浠g爜璺緞銆傚鏋滄墍鎵ц浠g爜鏄湪鍙︿竴鍙版満鍣ㄤ笂鐢熸垚鐨勶紝浣犲彲浠ュ皢鎵鐢ㄧ殑婧愮爜鎷瘋礉錛堜繚鎸佸師鏈夌殑鐩綍緇撴瀯錛夌殑涓
涓彲浠ヨ闂殑鏂囦歡澶癸紙鍙互鏄綉緇滆礬寰勶級騫跺皢婧愪唬鐮佽礬寰勮涓鴻鏂囦歡澶圭殑璺緞銆傛敞鎰忓鏋滄槸榪滅▼璋冭瘯錛屼綘闇瑕佷嬌鐢?lsrcpath鏉ヨ緗簮鐮佽礬寰勩?/p>
------------------------------------------------------------ 闈欐佸懡浠わ細 1.鏄劇ず璋冪敤鍫嗘爤錛氬湪榪炴帴鍒頒竴涓皟璇曠獥鍙e悗錛岄鍏堣鐭ラ亾鐨勫氨鏄▼搴忓綋鍓嶇殑鎵ц鎯呭喌k* 鍛戒護鏄劇ず褰撳墠綰跨▼鐨勫爢鏍堛倊*kb浼氭樉紺烘墍鏈夌嚎紼嬬殑璋冪敤鍫嗘爤銆傚鏋滃爢鏍堝お闀匡紝Windbg鍙細鏄劇ず鍫嗘爤鐨勪竴閮ㄥ垎銆?kframes鍙互鐢ㄦ潵璁劇疆緙虹渷鏄劇ず妗嗘灦鏁般?/p>
2.鏄劇ず灞閮ㄥ彉閲忥細鎺ヤ笅鏉ヨ鍋氶氬父鏄敤dv鏄劇ず灞閮ㄥ彉閲忕殑淇℃伅銆侰TRL錛婣LT錛媀鍙互鍒囨崲鍒版洿璇︾粏鐨勬樉紺烘ā寮忋傚叧浜巇v瑕佹敞鎰忕殑鏄湪浼樺寲榪囩殑浠?
鐮佷腑dv鐨勮緭鍑烘瀬鏈夊彲鑳芥槸涓嶅噯紜殑銆傝繖鏃跺悗浣犺兘鍋氱殑灝辨槸闃呰姹囩紪浠g爜鏉ュ彂鐜頒綘鎰熷叴瓚g殑鍊兼槸鍚﹀瓨鍌ㄥ湪瀵勫瓨鍣ㄤ腑鎴栧爢鏍堜笂銆傛湁鏃跺悗褰撳墠鐨勬鏋訛紙Frame錛変笂鍙?
鑳芥壘涓嶅埌浣犳兂鐭ラ亾鐨勬暟鎹傚鏋滆鏁版嵁鏄綔涓哄弬鏁頒紶鍒板綋鍓嶇殑鏂規硶涓殑錛屽彲浠ヨ涓璇諱笂涓涓垨鍑犱釜妗嗘灦鐨勬眹緙栦唬鐮侊紝鏈夊彲鑳借鏁版嵁榪樺湪鍫嗘爤鐨勬煇涓湴鍧涓娿傞潤鎬佸彉閲?
鏄偍瀛樺湪鍥哄畾鍦板潃涓殑錛屾墍浠ユ壘鍑洪潤鎬佸彉閲忕殑鍊艱緝涓哄鏄撱?Frame錛堟垨鑰呭湪璋冪敤鍫嗘爤紿楀彛涓弻鍑伙級鍙互鐢ㄦ潵鍒囨崲褰撳墠鐨勬鏋躲傛敞鎰廳v鍛戒護鏄劇ず鐨勬槸褰撳墠妗嗘灦
鐨勫唴瀹廣備綘涔熷彲鍦╳atch紿楀彛涓瀵熷眬閮ㄥ彉閲忕殑鍊箋?/p>
3.鏄劇ず綾誨拰閾捐〃錛?dt鍙互鏄劇ず鏁版嵁緇撴瀯銆傛瘮濡俤t PEB 浼氭樉紺烘搷浣滅郴緇熻繘紼嬬粨鏋勩傚湪鍚庨潰璺熶笂涓涓繘紼嬬粨鏋勭殑鍦板潃浼氭樉紺鴻緇撴瀯鐨勮緇嗕俊鎭細dt PEB 7ffdf000銆?/p>
Dl鍛戒護鍙互鏄劇ず涓浜涚壒瀹氱殑閾捐〃緇撴瀯銆?/p>
4.鏄劇ず褰撳墠綰跨▼鐨勯敊璇鹼細!gle浼氭樉紺哄綋鍓嶇嚎紼嬬殑涓婁竴涓敊璇煎拰鐘舵佸箋?error鍛戒護鍙互瑙g爜HRESULT銆?/p>
5.鎼滅儲鎴栦慨鏀瑰唴瀛橈細浣跨敤s 鍛戒護鏉ユ悳绱㈠瓧鑺傦紝瀛楁垨鍙屽瓧錛孮WORD鎴栧瓧絎︿覆銆備嬌鐢╡鍛戒護鏉ヤ慨鏀瑰唴瀛樸?/p>
6.璁$畻琛ㄨ揪寮忥細錛熷懡浠ゅ彲浠ョ敤鏉ヨ繘琛岃綆椼傚叧浜庤〃杈懼紡鐨勬牸寮忚鍙傜収甯姪鏂囨。銆備嬌鐢╪鍛戒護鏉ュ垏鎹㈣緭鍏ユ暟瀛楃殑榪涘埗銆?/p>
7.鏄劇ず褰撳墠綰跨▼錛岃繘紼嬪拰妯″潡淇℃伅錛?teb鏄劇ず褰撳墠綰跨▼鐨勭幆澧冧俊鎭傛渶甯歌鐨勭敤閫旀槸鏌ョ湅褰撳墠綰跨▼鍫嗘爤鐨勮搗濮嬪湴鍧錛岀劧鍚庡湪鍫嗘爤涓悳绱㈠箋?peb鏄劇ず褰撳墠榪涚▼鐨勭幆澧冧俊鎭紝姣斿鎵ц鏂囦歡鐨勮礬寰勭瓑絳夈俵m鏄劇ず榪涚▼涓姞杞界殑妯″潡淇℃伅銆?/p>
8.鏄劇ず瀵勫瓨鍣ㄧ殑鍊鹼細r鍛戒護鍙互鏄劇ず鍜屼慨鏀瑰瘎瀛樺櫒鐨勫箋傚鏋滆鍦ㄨ〃杈懼紡涓嬌鐢ㄥ瘎瀛樺櫒鐨勫鹼紝鍦ㄥ瘎瀛樺櫒鍚嶅墠鍔燖絎﹀彿錛堟瘮濡侤eax錛夈?/p>
9.鏄劇ず鏈鐩歌繎鐨勭鍙鳳細ln Address銆傚鏋滀綘鏈変竴涓狢錛嬶紜瀵硅薄鐨勬寚閽堬紝鍙互鐢ㄦ潵ln鏉ユ煡鐪嬭瀵硅薄綾誨瀷銆? 10.鏌ユ壘絎﹀彿錛歺鍛戒護鍙互鐢ㄦ潵鏌ユ壘鍏ㄥ眬鍙橀噺鐨勫湴鍧鎴栬繃紼嬬殑鍦板潃銆倄鍛戒護鏀寔鍖歸厤絎﹀彿銆倄 kernel32!*鏄劇ずKernel32.dll涓殑鎵鏈夊彲瑙佸彉閲忥紝鏁版嵁緇撴瀯鍜岃繃紼嬨?/p>
11.鏌ョ湅lock錛?locks鏄劇ず鍚勭嚎紼嬬殑閿佽祫婧愪嬌鐢ㄦ儏鍐點傚璋冭瘯姝婚攣寰堟湁鐢ㄣ?/p>
12.鏌ョ湅handle錛?handle鏄劇ず鍙ユ焺淇℃伅銆傚鏋滀竴孌典唬鐮佸鑷村彞鏌勬硠婕忥紝浣犲彧闇瑕佸湪浠g爜鎵ц鍓嶅悗浣跨敤!handle鍛戒護騫舵瘮杈冧袱嬈¤緭鍑虹殑鍖哄埆銆傛湁涓涓懡浠?htrace瀵硅皟璇曚笌鍙ユ焺鏈夊叧鐨凚ug闈炲父鏈夌敤銆傚湪寮濮嬭皟璇曞墠杈撳叆錛?/p>
!htrace –enable 鐒跺悗鍦ㄨ皟璇曡繃紼嬩腑浣跨敤!htrace handle_value 鏉ユ樉紺烘墍鏈変笌璇ュ彞鏌勬湁鍏崇殑璋冪敤鍫嗘爤銆?/p>
13.鏄劇ず姹囩紪浠g爜錛歶銆?/p>
------------------------------------------------------------ 紼嬪簭鎵ц鎺у埗鍛戒護錛?/p>
1.璁劇疆浠g爜鏂偣錛歜p/bu/bm 鍙互鐢ㄦ潵璁劇疆浠g爜鏂偣銆備綘鍙互鎸囧畾鏂偣琚煩榪囩殑嬈℃暟銆傚亣璁句竴孌典唬鐮並ERNEL32!SetLastError鍦ㄨ繍琛屽緢澶氭鍚庝細鍑洪敊錛屼綘鍙互璁劇疆濡備笅鏂偣錛?/p>
bp KERNEL32!SetLastError 0x100. 鍦ㄥ嚭閿欏悗浣跨敤bl 鏉ユ樉紺烘柇鐐逛俊鎭紙娉ㄦ剰綺椾綋鏄劇ず鐨勫鹼級錛?/p>
0 e 77e7a3b0 004f (0100) 0:*** KERNEL32!SetLastError 閲嶆柊鍚姩璋冭瘯錛?restart鍛戒護錛夊茍璁劇疆濡備笅鐨勬柇鐐癸細 bp Kernel32!SetLastError 0x100-0x4f Debugger浼氬仠鍦ㄥ嚭閿欏墠鏈鍚庝竴嬈¤皟鐢ㄨ榪囩▼鐨勫湴鏂廣?/p>
浣犲彲浠ユ寚瀹氭柇鐐硅嬋媧繪椂Debugger搴斿綋鎵ц鐨勫懡浠や覆銆傚湪璇ュ懡浠や覆涓嬌鐢↗鍛戒護鍙互鐢ㄦ潵璁劇疆鏉′歡鏂偣錛?/p>
bp `mysource.cpp:143` "j (poi(MyVar)”0n20) ''; 'g' " 涓婇潰鐨勬柇鐐瑰彧鍦∕yVar鐨勫煎ぇ浜?2鏃惰嬋媧?g鍛戒護 鏉′歡鏂偣鐨勭敤閫旀瀬涓哄箍娉涖備綘鍙互鎸囧畾涓涓柇鐐瑰彧鍦ㄧ壒孌婄殑鎯呭喌涓嬭嬋媧伙紝姣斿浼犲叆鐨勫弬鏁版弧瓚充竴瀹氱殑鏉′歡錛岃皟鐢ㄨ呮槸鏌愪釜鐗規畩鐨勮繃紼嬶紝鏌愪釜鍏ㄥ眬鍙橀噺琚涓虹壒孌婄殑鍊肩瓑絳夈?/p>
2.璁劇疆鍐呭瓨鏂偣錛歜a鍙互鐢ㄦ潵璁劇疆鍐呭瓨鏂偣銆傝皟璇曡繃紼嬩腑涓涓父瑙佺殑闂鏄窡韙煇浜涙暟鎹殑鍙樺寲銆傚涓嬬殑鏂偣錛?/p>
ba w4 0x40000000 "kb; g" 鍙互鎵撳嵃鍑烘墍鏈変慨鏀?x40000000鐨勮皟鐢ㄥ爢鏍堛?/p>
3.鎺у埗紼嬪簭鎵ц錛歱, pa,t, ta絳夊懡浠ゅ彲浠ョ敤鏉ユ帶鍒剁▼搴忕殑鎵ц銆?/p>
4.鎺у埗寮傚父鍜屼簨浠跺鐞嗭細Debugger鐨勭己鐪佽緗槸璺寵繃棣栨寮傚父(first chance
expcetion)錛屽湪浜屾寮傚父(second chance
exception)鏃朵腑鏂▼搴忕殑鎵ц銆俿x鍛戒護鏄劇ずDebugger鐨勮緗俿xe鍜宻xd鍙互鏀瑰彉Debugger鐨勮緗?/p>
sxe clr 鍙互鎺у埗Debugger鍦ㄦ墭綆″紓甯稿彂鐢熸椂涓柇紼嬪簭鐨勬墽琛屻傚父鐢ㄧ殑Debugger浜嬩歡鏈夛細 av 璁塊棶寮傚父 eh C++寮傚父 clr 鎵樼寮傚父 ld 妯″潡鍔犺澆 -c 閫夐」鍙互鐢ㄦ潵鎸囧畾鍦ㄤ簨浠跺彂鐢熸椂鎵ц鐨勮皟璇曞懡浠ゃ?/p>
powerwolf 鍙戣〃浜?2006.07.03 15:02
http://blog.csdn.net/vagrxie/archive/2009/07/31/4398721.aspx
浠婂ぉ瑕佽漿鐨勫氨鏄?nbsp; SEH + MiniDump 瀹炵幇鏃ump鏂囦歡 鍙堣紼嬪簭緇х畫榪愯
2 #include <windows.h>
3 #include <Dbghelp.h>
4 using namespace std;
5
6 #pragma auto_inline (off)
7 #pragma comment( lib, "DbgHelp" )
8
9 // 涓轟簡紼嬪簭鐨勭畝媧佸拰闆嗕腑鍏蟲敞鍏沖績鐨勪笢瑗匡紝鎸夌ず渚嬬▼搴忕殑鎯緥蹇界暐閿欒媯鏌ワ紝瀹為檯浣跨敤鏃惰娉ㄦ剰
10
11 LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo )
12 {
13 HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
14 MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
15 loExceptionInfo.ExceptionPointers = ExceptionInfo;
16 loExceptionInfo.ThreadId = GetCurrentThreadId();
17 loExceptionInfo.ClientPointers = TRUE;
18 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
19 CloseHandle(lhDumpFile);
20 return EXCEPTION_EXECUTE_HANDLER;
21 }
22
23 void Fun2()
24 {
25 __try
26 {
27 static bool b = false;
28 if(!b)
29 {
30 b = true;
31 int *p = NULL;
32 *p = 0;
33 }
34 else
35 {
36 MessageBox(NULL, _T("Here"), _T(""), MB_OK);
37 }
38 }
39 __except(MyUnhandledExceptionFilter(GetExceptionInformation()))
40 {
41 }
42 }
43
44 void Fun()
45 {
46 Fun2();
47 }
48
49 int main()
50 {
51 Fun();
52 Fun(); //鐢ㄤ簬鏄劇ずMessageBox
53 return 1;
54 }
55
56
Make it right before you make it faster.
Keep it right when you make it faster.
Make it clear before you make it faster.
Do not sacrifice clarity for small gains in efficiency.
]]>
2
3 //鍦ㄧ▼搴忛噷闈㈣皟鐢?/span>
4 SetUnhandledExceptionFilter(&MyUnhandledExceptionFilter);
5 //鏉ヨ緗?/span>
6 LONG WINAPI MyUnhandledExceptionFilter( _EXCEPTION_POINTERS *ExceptionInfo )
7 {
8 HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
9
10 MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
11
12 loExceptionInfo.ExceptionPointers = ExceptionInfo;
13
14 loExceptionInfo.ThreadId = GetCurrentThreadId();
15
16 loExceptionInfo.ClientPointers = TRUE;
17
18 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
19
20 CloseHandle(lhDumpFile);
21
22 return EXCEPTION_EXECUTE_HANDLER;
23 }
]]>
鍏圕opy璧勬枡鍚?br>
1.濡備綍寰楀埌甯姪
------------------------------------------------------------
reference url: http://powerwolf.itpub.net/post/20237/130218
鐗瑰埆瑕佹敞鎰忕殑灝辨槸!gle 榪欎釜鍛戒護鐩稿綋浜庢墽琛孏etLastError() 鑰屼笖榪樿兘鏌ョ湅鍐呮牳鐨凬TSTATUS
闂鍒氬垰瑙e喅浜?nbsp; 鏈鍚庡嚭鐜扮殑闂涔熸壘鍒頒簡 浣嗘槸閿欒鍘熷洜澶ц穼鐪奸暅 ------鏉姣掕蔣浠?..
緇撹:
铏界劧鎴戜滑闇瑕佷赴瀵岀殑璋冭瘯鎶宸?nbsp; 浣嗘槸 緇忛獙浠嶇劧鏄渶閲嶈鐨?br>灝卞儚鎵懼伐浣滀竴鏍?nbsp; 瀛︽牎閲岄潰浣犲啀鐗?nbsp; 娌℃湁緇忛獙 浣犻兘姣斾笉榪囧伐浣滀袱騫寸殑楂樹腑鐢?br>
]]>