The Linux GCC HOWTO¤¤Ä¶ª©V0.2 : °£¿ù»PºÊºÞ
Previous: ²¾´Óµ{¦¡»P½s͵{¦¡
Next: ³sµ²

5. °£¿ù»PºÊºÞ

5.1. ¹w¨¾­«©óªvÀø¡]lint¡^

lint¹ïLinux¦Ó¨¥¨Ã¨S¦³«Ü¼sªxªº¥Î³~¡A¥D­n¬O¦]¬°¤j³¡¥÷ªº¤H³£¯àº¡¨¬©ógcc©Ò´£¨ÑªºÄµ§i°T®§¡C¥i¯à³Ì¦³¥Îªº´N¬O-Wall°Ñ¼Æ¤F---³o­Ó°Ñ¼Æªº¥Î³~¬O­n¨Dgcc±N©Ò¦³ªºÄµ§i°T®§Åã²{¥X¨Ó¡Fbut probably has more mnemonic value if thought of as the thing you bang your head against.

ºô¸ô¤W¦³¤@­Ó¹ê¥Îªºpublic domain lint¡A¦ì©ó ftp://larch.lcs.mit.edu/pub/Larch/lclint¡C§Ú¨Ã¤£ª¾¹D³o­Ó¯¸¨ì©³¦³¦h¦n´N¬O¤F¡C

5.2. °£¿ù

5.2.1. §Ú­n«ç¼Ë°µ¤~¯à±N°£¿ù¸ê°T©ñ¨ì¤@¤äµ{¦¡¸ÌÀY¡H

§A»Ý­n²K¥[-gªº°Ñ¼Æ¨Ó½sĶ»P³sµ²µ{¦¡¡A¦Ó¥B¤£¥i¥H¥Î-fomit-frame-pointer°Ñ¼Æ¡C¨Æ¹ê¤W¡A§A¤£»Ý­n­«·s½sĶ©Ò¦³ªºµ{¦¡¡A¥u»Ý­«·s½sĶ¥Ø«e§A¥¿¦b°£¿ùªº³¡¥÷§Y¥i¡C

´Na.outªº²ÕºA¦Ó¨¥¡A¦@¨Éµ{¦¡®w¬O¥H-fomit-frame-pointer½sͦӦ¨¡A³o­Ó®É­Ô¡Agdb´NÅܱo­^¶¯µL¥ÎªZ¤§¦a¤F¡C³sµ²®Éµ¹©w-gªº¿ï¶µ¡AÀ³¸Ó´NÁô§tµÛÀRºA³sµ²ªº·N¸q¤F¡F³o´N¬O¬°¤°»ò­n¥[-gªº­ì¦]¤F¡C

¦pªG³sµ²¾¹³sµ²¥¢±Ñ¡A§i¶D§A§ä¤£¨ìlibg.a¡A¨º´N¬O¦b/usr/lib/ªº¥Ø¿ý©³¤U¡A¤Ö¤Flibg.a¡Clibg.a¬O¤@­ÓC»y¨¥«Ü¯S§Oªº°»¿ùµ{¦¡®w¡C¤@¯ë¦blibcªº®M¥ó¤º´N·|´£¨Ñlibg.a¡F¤£µMªº¸Ü¡]·sª©¬O³o¼Ëªº¡^¡A§A¥i¯à»Ý­n®³libcªº­ì©l½X¦Û¤v³]¸m¤F¡A¤£¹L¡A¹ê»Ú¤W§AÀ³¸Ó¤£»Ý­n¤~¹ï¡C¤£ºÞ¬O¤°»ò¥Øªº¡A¤j³¡¥÷ªº±¡ªp¤U¡A¥u»Ý±Nlibg.a³sµ²¨ì/usr/lib/libc.a¡A§A´N¯à±o¨ì¨¬°÷ªº¸ê°T¤F¡C

5.2.1.1. ¨º¡A¯à¤£¯à§â°£¿ù¸ê°Tµ¹®³±¼¡H

«Ü¦hªºGNU³nÅé¦b½sͳsµ²®É¡A³£·|³]©w-gªº¿ï¶µ¡F³o¼Ë°µ·|³y¦¨°õ¦æÀɹL¤jªº°ÝÃD¡]³q±`¬OÀRºAªº³sµ²¡^¡C¹ê»Ú¤W¡A³o¨Ã¤£¬O¤@­Ó«Ü¼öªùªº·Qªk¡C

¦pªGµ{¦¡¥»¨­¦³autoconf¡A²£¥Í¤Fconfigure©R¥O½Z¡A³q±`§A´N¥i¥H¥Î./configure CFLAGS=©Î¬O./configure CFLAGS=-O2¨ÓÃö±¼°£¿ù¸ê°T¡C¤£µMªº¸Ü¡A§A±oÀˬdÀˬdMakefile¤F¡C·íµM°Õ¡A°²¦p§A¥Îªº¬OELF¡Aµ{¦¡«K·|¥H°ÊºAªº¤è¦¡¨Ó³sµ²¡A¤£½×¬O§_¦³-gªº³]©w¡F¦]¦¹§A¥i¥H¥­±`¤ß§â-g®³±¼¡C

5.2.2. ¹ê¥Îªº³nÅé

¾ÚÁA¸Ñ¡A¤j³¡¥÷ªº¤H³£¬O¥Îgdb¨Ó°£¿ù¡C§A¥i¥H±qGNU archive sites®³¨ì­ì©lµ{¦¡¡F©ÎªÌ¬O¨ìtsx-11®³¥i°õ¦æÀÉ¡Cxxgdb¬O¤@­ÓX¤¶­±ªº°£¿ùµ{¦¡¡A´Ó°ò©ógdb¡]¤]´N¬O»¡§A±o¥ý¦w¸Ë¦ngdb¡A¤~¯à¦A¸Ëxxgdb¡^¡Cxxgdbªº­ì©l½X¥i¥H¦bftp://ftp.x.org/contrib/xxgdb-1.08.tar.gz§ä¨ì¡C

¥t¥~¡AUPS°£¿ùµ{¦¡¤w¥ÑRick Sladkey²¾´Ó¦¨¥\¡CUPS¥i¥H¦bX©³¤U¬¡±o«Ü¦n¡A¤£¹³xxgdb¨º¼Ë---¶È¶È¬OgdbªºX«eºÝ¤¶­±¡]X front end¡^¡C³o¤ä°£¿ùµ{¦¡¦³¤@¤j°ïÀu¨}ªº¯SÂI¡A¦Ó¥B¦pªG§A±oªá®É¶¡¥h°£¤@¤ä¯}Äꪺµ{¦¡¡A«ØÄ³§A¦Ò¼{¦Ò¼{xxgdb¡C¨Æ¥ý½sͦnªºLinuxª©»P­×¥¿ª©ªº­ì©l½X¥i¥H¦bftp://sunsite.unc.edu/pub/Linux/devel/debuggers/§ä¨ì¡C¦Ó³Ìªìªº­ì©lµ{¦¡«h©ñ¦b ftp://ftp.x.org/contrib/ups-2.45.2.tar.Z¡C

§A¥i¯à·|µo²{¥t¤@­Ó¥Î¨Ó°£¿ùªº¤u¨ãstrace¡A¤]¬O¬Û·íªº¦³¥Î¡C¥¦¥i¥HÅã¥Ü¥X¥Ñµ{§Ç©Ò²£¥Íªº¨t²Î©I¥s¡A¦Ó¥BÁÙ¾Ö¦³¨ä¥¦²³¦hÁc½Æªº¥\¯à¡A¹³¬O¦pªG§A¤âÃä¨S¦³­ì©l½Xªº¸Ü¡Astrace¥i¥HÀ°§A§ä¥X¦³¨º¨Ç¸ô®|¦WºÙ¡]path-names¡^¤w½sͶi°õ¦æÀɤº¡F exacerbating race conditions in programs that you suspect contain them;ÁÙ¦³¡Astrace¥i®³¨Ó¾Ç²ßµ{¦¡¬O«ç»ò¦b¹q¸£¤¤°õ¦æªº¡C³Ì·sªºª©¥»¡]¥Ø«e¬O3.0.8¡^¥i¦b§ä¨ìftp://ftp.std.com/pub/jrs/¡C

5.2.3. ­I´ºµ{¦¡¡]±`¾nµ{¦¡¡

¦­´Á¨å«¬ªº±`¾nµ{¦¡(daemon programs)¬O°õ¦æfork()¡AµM«á²×¤î¤÷µ{§Ç¡C³o¼Ëªº°µªk¨Ï±o°£¿ùªº®É¶¡´îµu¤F¡C

ÁA¸Ñ³oÂIªº³Ì²³æªº¤èªk´N¬O´Àfork()³]¤@­Ó¤¤Â_ÂI¡]breakpoint¡^¡C·íµ{¦¡°±¤î®É¡A±j­¢fork()¶Ç¦^0¡C

(gdb) list 
1       #include <stdio.h>
2
3       main()
4       {
5         if(fork()==0) printf("child\n");
6         else printf("parent\n");
7       }
(gdb) break fork
Breakpoint 1 at 0x80003b8
(gdb) run
Starting program: /home/dan/src/hello/./fork 
Breakpoint 1 at 0x400177c4

Breakpoint 1, 0x400177c4 in fork ()
(gdb) return 0
Make selected stack frame return now? (y or n) y
#0  0x80004a8 in main ()
    at fork.c:5
5         if(fork()==0) printf("child\n");
(gdb) next
Single stepping until exit from function fork, 
which has no line number information.
child
7       }

5.2.4. ®Ö¤ßÀÉ®×

·íLinux¶}¾÷®É¡A³q±`²ÕºA·|³]©w¦¨¤£­n²£¥Í®Ö¤ßÀɮסC­n¬O§A¨º»ò³ßÅw¥¦­Ìªº¸Ü¡A¥i¥H¥Îshellªºbuiltin©R¥O¨Ï¨ä­«·s¥Í®Ä¡G´NC-shell¬Û®eªºshell¡]¦ptcsh¡^¦Ó¨¥¡A·|¬O¤U­±³o¼Ë¡G

% limit core unlimited
¦ÓÃþ¦üBourne shellªºshell¡]sh, bash, zsh, pdksh¡^«h¨Ï¥Î¤U­±ªº»yªk¡G
$ ulimit -c unlimited

¦pªG§A·Q­n¦³­Ó¦h¤~¦hÃÀªº®Ö¤ßÀÉ©R¦W¡]core file naming¡^¡]for example, if you're trying to conduct a post-mortem using a debugger that's buggy itself¡^¡A¨º»ò§A¥i¥H¹ï§Aªº®Ö¤ßµ{¦¡°µ¤@ÂI¤p¤pªº§ó°Ê¡C§ä¤@§äfs/binfmt_aout.c»Pfs/binfmt_elf.cÀɤ¤»P¤U¦C¬Û²Åªºµ{¦¡¤ù¬q(in newer kernels, you'll have to grep around a little in older ones)¡G

        memcpy(corefile,"core.",5);
#if 0
        memcpy(corefile+5,current->comm,sizeof(current->comm));
#else
        corefile[4] = '\0';
#endif

±N0´«¦¨1.

5.3. ºÊºÞ

ºÊºÞ¡]Profiling¡^¬O¥Î¨ÓÀˮ֤@¤äµ{¦¡¤¤¨º¨Ç³¡¥÷¬O³Ì±`©I¥s©Î¬O°õ¦æªº®É¶¡³Ì¤[ªº¤èªk¡C³o¹ïµ{¦¡ªº³Ì¨Î¤Æ»P§ä¥X¦ó®É®É¶¡¬O®ö¶O±¼ªº¦Ó¨¥¡A¬O¬Û·í¦nªº¤è¦¡¡C§A¥²¶·´N§A©Ò­nªº®Éµ{¸ê°T¡]timing information¡^ªº¥ØªºÀÉ¥[¤W-p¨Ó½sĶ¡A¦Ó¥B¦pªG­nÅý¿é¥XªºÀɮצ³·N¸q¡A§A¤]·|»Ý­ngprof¡]¨Ó¦Ûbinutils®M¥óªº©R¥O¡^¡C°Ñ¾\gprofªºmanual page¡A¥i±oª¾¨ä²Ó¸`¡C

11/18/97Ķ


The Linux GCC HOWTO¤¤Ä¶ª©V0.2 : °£¿ù»PºÊºÞ
Previous: ²¾´Óµ{¦¡»P½s͵{¦¡
Next: ³sµ²