ǶÈëʽ²Ù×÷ϵͳʵÑéÈýGDB ÁªÏµ¿Í·þ

·¢²¼Ê±¼ä : ÐÇÆÚÒ» ÎÄÕÂǶÈëʽ²Ù×÷ϵͳʵÑéÈýGDB¸üÐÂÍê±Ï¿ªÊ¼ÔĶÁ

ʵÑéÊÕ»ñ£º

1¡¢ÊµÑéµÄÄÚÈÝ·Ö³ÉÁËÁ½²¿·Ö£¬ÏÔʾѧ»áʹÓÃÁËgdbµÄ¼òµ¥Ö¸Áîµ÷ÊÔ¼òµ¥µÄ³ÌÐò¡£GdbµÄµ÷ÊÔ·½·¨·Ö³É±¾µØµ÷ÊÔºÍÄ¿±ê»úµ÷ÊÔÁ½²¿·Ö¡£±àÒë¸ø¶¨µÄ³ÌÐò£¬Ê¹Óüòµ¥µÄÖ¸ÁîÈ磺list¡¢run¡¢continue¡¢kill¡¢quit¡¢break¡¢next¡¢step¡¢print¡¢display¡¢watchµÈ¡£

2¡¢Á½¸öÊÕ»ñ£¬Ò»¸öÊÇʹÓÃÐéÄâ»úqemuµ÷ÊÔÄںˣ¨²»ÄÜÔÚ±¾»úÖØÆôÄں˰ɣ¬¿ÉÒÔÏëÏóÔÚÐéÄâ»úskyeyeƽ̨ÉÏÔËÐÐʱ£¬Ò²¿ÉÒÔ×÷ΪĿ±ê»ú½øÐе÷ÊÔ£©¡£Ò»¸öÊÇgdbµÄÔ¶³Ìµ÷ÊÔ£¨¼´Ö÷»úºÍÄ¿±ê»ú²»ÊÇͬһ̨»úÆ÷£¬Òª½¨Á¢Á¬½Ó£©¡£½âѹ±àÒë°²×°qemu£»±àÒëlinuxÄںˣ»±àдÆô¶¯½Å±¾Æô¶¯qemu£¬½¨Á¢Á¬½Ó£¬¿ªÊ¼µ÷ÊÔ¡£

¾ßÌåµÄ֪ʶµãÊÕ»ñ£º

1¡¢

gdbÊÇlinux»·¾³ÏµÄÒ»¿î³£ÓõijÌÐòµ÷ÊÔ¹¤¾ß¡£Í¨¹ýgdb£¬¿ÉÒÔµ¥²½¸ú×Ù³ÌÐòµÄÖ´ÐÐÁ÷³Ì£¬ÓÐÖúÓÚ³ÌÐòÔ±¸üºÃµØÀí½â¸Ã³ÌÐò£¬²¢·¢ÏÖÆäÖÐÒþ²ØµÄbug¡£ÔÚGDBÊõÓïÖУ¬ÓÐһС¶ÎפÁôÔÚÄ¿±ê»úÉϵĴúÂë±»³ÆΪ¡°µ÷ÊÔ×®¡±(debugging stub)£¬Ò²³ÆΪ¡°µ÷ÊÔ´úÀí¡±(debugging agent)£¬ÆäÔðÈξÍÊÇÔÚÄ¿±ê»úÉÏʵÏÖÓÉÖ÷»úÉϵĵ÷ÊÔÆ÷·¢Ë͹ýÀ´µÄµ÷ÊÔÃüÁ´ËÍ⻹ÓÐÏòÖ÷»úµ÷ÊÔÆ÷±¨¸æÄ¿±ê»úÉÏ·¢ÉúµÄÒ쳣ʼþ£¬µ÷ÊÔ´úÀíÓëGDBÖ÷»úÖ®¼äµÄͨÐÅ×ñÑ­¡°GDBÔ¶³Ì´®ÐÐЭÒé(Remote Serial Protocol)¡±¡£µ±È»£¬Èç¹ûÄ¿±ê»úºÍÖ÷»úÊÇͬһ̨»úÆ÷£¬ÄÇô¾ÍÊÇÊôÓÚgdb±¾µØµ÷ÊÔ£¬ÕâÊÇ»ù´¡ÁË¡£ÏÂÃ棬ÎÒÃÇÒÔ±¾µØµ÷ÊÔΪÀý×Ó£¬À´¸ø´ó¼Ò½éÉÜÒ»°ãµÄgdbµ÷ÊÔ¹ý³Ì¡£

gdb+gdbserver×ÜÌå½éÉÜ

Ô¶³Ìµ÷ÊÔ»·¾³ÓÉËÞÖ÷»úGDBºÍÄ¿±ê»úµ÷ÊÔstub¹²Í¬¹¹³É£¬Á½Õßͨ¹ý´®¿Ú»òTCPÁ¬½Ó¡£Ê¹Óà GDB±ê×¼³Ì´®ÐÐЭÒéЭͬ¹¤×÷£¬ÊµÏÖ¶ÔÄ¿±ê»úÉϵÄϵͳÄں˺ÍÉϲãÓ¦Óõļà¿ØºÍµ÷ÊÔ¹¦ÄÜ¡£µ÷ÊÔstubÊÇǶÈëʽϵͳÖеÄÒ»¶Î´úÂ룬×÷ΪËÞÖ÷»úGDBºÍÄ¿±ê»úµ÷ÊÔ³ÌÐò¼äµÄÒ»¸öý½é¶ø´æÔÚ¡£

¾ÍÄ¿Ç°¶øÑÔ£¬Ç¶ÈëʽLinuxϵͳÖУ¬Ö÷ÒªÓÐÈýÖÖÔ¶³Ìµ÷ÊÔ·½·¨£¬·Ö±ðÊÊÓÃÓÚ²»Í¬³¡ºÏµÄµ÷ÊÔ¹¤×÷£ºÓÃROM Monitorµ÷ÊÔÄ¿±ê»ú³ÌÐò¡¢ÓÃKGDBµ÷ÊÔϵͳÄں˺ÍÓÃgdbserverµ÷ÊÔÓû§¿Õ¼ä³ÌÐò¡£ÕâÈýÖÖµ÷ÊÔ·½·¨µÄÇø±ðÖ÷ÒªÔÚÓÚ£¬Ä¿±ê»úÔ¶³Ìµ÷ÊÔstub µÄ´æÔÚÐÎʽµÄ²»Í¬£¬¶øÆäÉè¼Æ˼·ºÍʵÏÖ·½·¨ÔòÊÇ´óÖÂÏàͬµÄ¡£

¶øÎÒÃÇ×î³£ÓõÄÊǵ÷ÊÔÓ¦ÓóÌÐò¡£¾ÍÊDzÉÓÃgdb+gdbserverµÄ·½Ê½½øÐе÷ÊÔ¡£ÔںܶàÇé¿öÏ£¬Óû§ÐèÒª¶ÔÒ»¸öÓ¦ÓóÌÐò½øÐз´¸´µ÷ÊÔ£¬ÌرðÊǸ´ÔӵijÌÐò¡£²ÉÓÃGDB·½·¨µ÷ÊÔ£¬ÓÉÓÚǶÈëʽϵͳ×ÊÔ´ÓÐÏÞÐÔ£¬Ò»°ã²»ÄÜÖ±½ÓÔÚÄ¿±êϵͳÉϽøÐе÷ÊÔ£¬Í¨³£²ÉÓÃgdb+gdbserverµÄ·½Ê½½øÐе÷ÊÔ¡£

ǶÈëʽLinuxµÄGDBµ÷ÊÔ»·¾³ÓÉHostºÍTargetÁ½²¿·Ö×é³É£¬Host¶ËʹÓÃarm£­linux£­gdb£¬Target Board¶ËʹÓÃgdbserver¡£ÕâÑù£¬Ó¦ÓóÌÐòÔÚǶÈëʽĿ±êϵͳÉÏÔËÐУ¬¶øgdbµ÷ÊÔÔÚHost¶Ë£¬ËùÒÔÒª²ÉÓÃÔ¶³Ìµ÷ÊÔ£¨remote£©µÄ·½·¨¡£

µ÷ÊÔÄÚºËÐèÒªÒ»¸ö½ÐqemuµÄÐéÄâ»ú¡£QEMUÊÇ»ùÓÚGPLЭÒéµÄ¿ª·ÅÔ´´úÂëµÄÐéÄâ»úÈí¼þ£¬qemuÐéÄâ»úµÄºÃ´¦ÊDz»Óð²×°ÅÓ´óµÄÐéÄâ»úϵͳ¡£²¢ÇÒ½éÓÚËüµÄµÍ×ÊÔ´Õ¼Óá¢Ãâ°²×°¡¢ÂÌÉ«¡¢Ð¡ÇɵÄÌص㣬ÎÒÃÇÓÐÀíÓÉÑ¡ÔñËü£¬µ±È»Ëü²»ÄÜÍêÈ«È¡´úVMWAREÖ®ÀàµÄÐéÄâ»úÈí¼þ¡£QEMUÊÊÓÃÓÚLinux ,Windows, FreeBSD and MaxOS XÕ⼸¸öƽ̨£¬¶ÔlinuxµÄÖ§³Ö±È½ÏºÃ¡£Ëü¿ÉÒÔ·ÂÕæ³öÒ»¸öÐéÄâµÄCPU£¬Ò»°ãµÄ²Ù×÷ϵͳ·ÂÕæ³ÌÐòµÄÖ´ÐÐËٶȶ¼·Ç³£Âý£¬µ«ÊÇQEMUµÄËٶȾÓ

È»¿ÉÒÔ´ïµ½Õý³£µÄËÄ·ÖÖ®Ò»ÒÔÉÏ£¬ÔÚ·ÂÕæ³ÌÐòÖÐËãÊÇ¿ìµÄÁË¡£

2¡¢

list£ºÁбíÏÔʾԴ´úÂë¡£List 1,18ÊÇÏÔʾ´ÓµÚ1Ðе½µÚ18ÐдúÂë list func ²é¿´º¯Êý run£ºÖ´Ðе±Ç°±»µ÷ÊԵijÌÐò £¬´ÓÍ·¿ªÊ¼Ö´ÐС£ Continue ÖжϺó´Ó¶Ïµã¿ªÊ¼Ö´ÐÐ kill£ºÖÕÖ¹ÕýÔÚµ÷ÊԵijÌÐò¡£ quit£ºÖÕÖ¹gdb

break£ºÔÚ´úÂëÀïÉèÖöϵ㣬³ÌÐòÖ´Ðе½ÕâÀïʱ¹ÒÆ𠣬Èçbreak 18£¨b 18£© Delete 18 ɾ³ý18ÐеĶϵã Disable 18ʧÄÜ18ÐеĶϵã Enable 18ʹÄÜ18ÐеĶϵã Info b ÏÔʾËùÓеĶϵãÐÅÏ¢

next£ºÖ´ÐÐÒ»ÐÐÔ´´úÂ뵫²»½øÈ뺯ÊýÄÚ²¿¡£ step£ºÖ´ÐÐÒ»ÐÐÔ´´úÂë¶øÇÒ½øÈ뺯ÊýÄÚ²¿¡£ Print ´òÓ¡Ò»´Îij¸ö±äÁ¿µÄÖµ£¬Èçprint i Display ÿ´Îµ¥²½Ö´Ðк󶼻á´òÓ¡±äÁ¿µÄÖµ

watch£º¼àÊÓÒ»¸ö±äÁ¿µÄÖµ£¬Ã¿Ò»´Î¼àÊÓµÄÖµ·¢Éú±ä»¯µÄʱºò¶¼»áÖжϲ¢´òÓ¡¡£ ÕâЩÃüÁ¿ÉÒÔÓÃÊ××Öĸ½øÐмòд¡£ 3¡¢-g

Ö»ÊDZàÒëÆ÷£¬ÔÚ±àÒëµÄʱºò£¬²úÉúµ÷ÊÔÐÅÏ¢¡£ ×ܹ²ÐèÒª4²½

1.Ô¤´¦Àí,Éú³É.iµÄÎļþ[Ô¤´¦ÀíÆ÷cpp]

2.½«Ô¤´¦ÀíºóµÄÎļþ²»×ª»»³É»ã±àÓïÑÔ,Éú³ÉÎļþ.s[±àÒëÆ÷gcc] 3.Óлã±à±äΪĿ±ê´úÂë(»úÆ÷´úÂë)Éú³É.oµÄÎļþ[»ã±àÆ÷as] 4.Á¬½ÓÄ¿±ê´úÂë,Éú³É¿ÉÖ´ÐгÌÐò[Á´½ÓÆ÷ld]

ËùÒÔÖ§³Ö³ÌÐò¿ª·¢µÄÊÇÒ»ÕûÌ×µÄGUN¹¤¾ßÁ´£¬GCCÖ»Êǵ÷ÓÃÕâÒ»Ìõ¹¤¾ßÁ´ÀﲻͬµÄ¹¤¾ß¶øÒÑ¡£

GNU ToolsÊÇlinux»·¾³ÏÂ×îÖ÷ÒªµÄ¿ª·¢ ¹¤¾ß¼¯,Ö÷ÒªÓÐÒÔϼ¸¸ö²¿·Ö:

±àÒ뿪·¢¹¤¾ß:°ÑÔ´³ÌÐò±àÒëΪ¿ÉÖ´ÐÐÎļþ, Èçgcc. µ÷ÊÔ¹¤¾ß:¶ÔÖ´ÐгÌÐò½øÐÐÔ´Âë»ò»ã±à¼¶µ÷ÊÔ µÄÈí¼þ,Èçgdb. Èí¼þ¹¤³Ì¹¤¾ß:ÓÃÓÚЭÖú¶àÈË¿ª·¢»ò´óÐÍÈí¼þ ÏîÄ¿µÄ¹ÜÀíµÄÈí¼þ,Èçmake,cvsµÈ.

1. GCC(GNU Compiler Collection)

Ö§³ÖC,C++,ADA,Object C,Java, Fortran,PASCALµÈÓïÑÔ. Ö÷Òª°üÀ¨:

cpp:GNU C±àÒëÆ÷µÄÔ¤´¦ÀíÆ÷. gcc:·ûºÏISO±ê×¼µÄC±àÒëÆ÷. g++:»ù±¾·ûºÏISO±ê×¼µÄC++±àÒëÆ÷. gcj:GCCµÄjavaÇ°¶Ë. gnat:GCCµÄGNU ADA 95µÄÇ°¶Ë. ×é¼þ½éÉÜ(Ðø) 2. binutils

ÊÇÒ»×é¶þ½øÖƹ¤¾ß³ÌÐò¼¯ºÏ,ÊǸ¨ÖúGCCµÄÖ÷ ÒªÈí¼þ. Ö÷Òª°üÀ¨:

as:GNU»ã±àÆ÷ ld:GNUÁ´½ÓÆ÷ ar:´´½¨¹éµµÎļþ,Ïò¿âÖÐÌí¼Ó/ÌáÈ¡objÎļþ nm:ÁгöobjÎļþÖеķûºÅ objcopy:¸´ÖƺÍת»¯objÎļþ ×é¼þ½éÉÜ(Ðø)

2. binutils Ö÷Òª°üÀ¨:

objdump:ÏÔʾ¶ÔÏóÎļþµÄÐÅÏ¢ ranlib:¸ù¾Ý¹éµµÎļþÖÐÄÚÈݽ¨Á¢Ë÷Òý readdlf:ÏÔʾ

elf¸ñʽִÐÐÎļþÖеĸ÷ÖÖÐÅÏ¢ size:ÏÔʾobjectÎļþºÍÖ´ÐÐÎļþ¸÷¶ÎµÄ×Ü´óС strings:ÏÔʾÎļþÖпÉÒÔ´òÓ¡µÄ×Ö·û strip:È¥µôÖ´ÐÐÎļþÖжàÓàµÄÐÅÏ¢(Èçµ÷ÊÔÐÅÏ¢) gprof:ÓÃÀ´ÏÔʾͼ±íµµ°¸Êý¾Ý ×é¼þ½éÉÜ(Ðø)

3. gdb:GNUµ÷ÊÔÆ÷.¿ÉÒÔÓÃÀ´µ÷ÊÔC, C++ºÍÆäËûÓïÑÔ±àдµÄ³ÌÐò.Èç¼ÓһЩͼ ÐÎÇ°¶Ë(ÈçDDD),¿ÉÒÔÔÚͼÐλ·¾³Ïµ÷ ÊÔ³ÌÐò.

4. GNU make:ÊÇÒ»¸öÓÃÀ´¿ØÖÆ¿ÉÖ´ÐгÌÐòÉú³É¹ý³Ì,´ÓÆäËûÔ´ÂëÎļþÖÐÉú³É¿ÉÖ´ÐÐ³Ì ÐòµÄ³ÌÐò.ËüÔÊÐíÓû§Éú³ÉºÍ°²×°Èí¼þ°ü, ¶øÎÞÐèÁ˽âÉú³É,°²×°Èí¼þ°üµÄ¹ý³Ì. ×é¼þ½éÉÜ(Ðø)

5. diff/diff3/sidff:±È½ÏÎı¾²îÒìµÄ¹¤ ¾ß,Ò²¿ÉÒÔÓÃÀ´Éú³É²¹¶¡.

6. patch:²¹¶¡°²×°³ÌÐò,¿É¸ù¾ÝdiffÉú³ÉµÄ ²¹¶¡À´¸üгÌÐò 7. CVS:°æ±¾¿ØÖÆϵͳ.ÓÃÓÚ¹ÜÀí·¢Ðа汾 ºÍ¿ØÖÆÔÚ¶àλ×÷Õß¼äͬʱ±à¼­Ô´ÂëÎļþ.

°²×°½»²æ±àÒë»·¾³£¬¾ÍÊǶÔGCC¡¢GBD¡¢make¡¢ld¡¢asµÄ°²×°£¬¼´¶Ôgcc¡¢binutils¡¢¿âµÄ°²×°£¨Èç¹ûÖ»ÐèÒª½»²æ±àÒëÄÚºË,binutilsºÍgcc¾Í×ã¹»ÁË,¡¢Èç¹ûÐèÒª½»²æ±àÒëÓ¦ÓóÌÐò,ÄǾͻ¹ÒªÔÙ±àÒëÒ»·Ý glibc£¬¶øgbdµÈÆäËû¹¤¾ß¶¼²»ÊDZØÐèµÄ£©¡£¶Ô½»²æ±àÒë»·¾³£¬ÓÐÊÖ¶¯¡¢½Å±¾°²×°¡¢Ö±½Ó»ñÈ¡¶þ½øÖÆÔ´ÂëµÄ·½Ê½¡£

Ò»¡¢ÊµÑé²½Öè

Ò»¡¢»ù´¡ÊµÑé

£¨1£© ±àÒëµ÷ÊÔ³ÌÐò

$gcc ¨Cg test.c ¨Co test

£¨2£© ListÃüÁî

(gdb) list line1,line2

list func

list 1,18