2.4 ¥Î cc ¨Ó½s͵{¦¡

¥»³¹½d¨Ò¥u¦³°w¹ï GNU C compiler ©M GNU C++ compiler §@»¡©ú¡A ³o¨â­Ó¦b FreeBSD base system ¤¤´N¦³¤F¡A ª½±µ¥´ cc ©Î gcc ´N¥i¥H°õ¦æ¡C ¦Ü©ó¡A¦p¦ó¥Îª½Ä¶¾¹²£¥Íµ{¦¡ªº»¡©ú¡A³q±`¥i¦bª½Ä¶¾¹ªº¤å¥ó©Î½u¤W¤å¥ó§ä¨ì»¡©ú¡A¦]¦¹¤£¦AÂØ­z¡C

·í§A¼g§¹§Aªº³Ç§@«á¡A±µ¤U¨Ó«K¬OÅý³o­Óµ{¦¡¥i¥H¦b FreeBSD ¤W°õ¦æ¡A ³q±`³o¨Ç­n¤@¨Ç¨BÆJ¤~¯à§¹¦¨¡A¦³¨Ç¨BÆJ«h»Ý­n¤£¦Pµ{¦¡¨Ó§¹¦¨¡C

  1. ¹w¥ý³B²z(Pre-process)§Aªºµ{¦¡½X¡A²¾°£µ{¦¡¤ºªºµù¸Ñ¡A©M¨ä¥L§Þ¥©¡A ¹³¬O expanding(ÂX¤j) C ªº marco¡C

  2. ½T»{§Aªºµ{¦¡»yªk¬O§_½T¹ê¿í·Ó C/C++ ªº³W©w¡A¦pªG¨S¦³²Å¦Xªº¸Ü¡A½s;¹·|¥X²{ĵ§i¡C

  3. ±N­ì©l½XÂন²Õ¦X»y¨¥ ¡X¡X ¥¦¸ò¾÷¾¹»y¨¥(machine code)«D±`¬Ûªñ¡A¦ý¤´¦b¤HÃþ¥i²z¸Ñªº½d³ò¤º(¾Ú»¡À³¸Ó¬O³o¼Ë)¡C [1]

  4. §â²Õ¦X»y¨¥Âন¾÷¾¹»y¨¥ ¡X¡X ¬Oªº¡A³o¸Ì»¡ªº¾÷¾¹»y¨¥´N¬O±`´£¨ìªº bit ©M byte¡A¤]´N¬O 1 ©M 0¡C

  5. ½T»{µ{¦¡¤¤¥Î¨ìªº¨ç¦¡©I¥s¡B¥þ°ìÅܼƬO§_¥¿½T¡AÁ|¨Ò¨Ó»¡¡G¦p­Y©I¥s¤F¤£¦s¦bªº¨ç¦¡¡A½s;¹·|Åã¥Üĵ§i¡C

  6. ¦pªGµ{¦¡¬O¥Ñµ{¦¡½XÀɮרӽsĶ¡A½s;¹·|¾ã¦X°_¨Ó¡C

  7. ½s;¹·|­t³d²£¥ÍªF¦è¡AÅý¨t²Î¤Wªº run-time loader ¥i¥H§âµ{¦¡¸ü¤J°O¾ÐÅ餺°õ¦æ¡C

  8. ³Ì«á·|§â½sͧ¹ªº°õ¦æÀɦs¦bµwºÐ¤W¡C

³q±` ½sĶ(compiling) ¬O«ü²Ä 1 ¨ì²Ä 4 ­Ó¨BÆJ¡C ¡X¡X ¨ä¥L¨BÆJ«hºÙ¬° ³sµ²(linking)¡A ¦³®É­Ô¨BÆJ 1 ¤]¥i¥H¬O«ü ¹w¥ý³B²z(pre-processing)¡A ¦Ó¨BÆJ 3 ¨ì¨BÆJ 4 «h¬O ²ÕĶ(assembling)¡C

©¯¹Bªº¬O¡A§A¥i¥H¤£¥Î²z·|¥H¤W²Ó¸`¡A½s;¹³£·|¦Û°Ê§¹¦¨¡C ¦]¬° cc ¥u¬O¬O­Ó«eºÝµ{¦¡(front end)¡A¥¦·|¨Ì·Ó¥¿½Tªº°Ñ¼Æ¨Ó©I¥s¬ÛÃöµ{¦¡À°§A³B²z¡C ¥u»Ý¥´¡G

% cc foobar.c

¤W­z«ü¥O·|§â foobar.c ¶}©l½sĶ¡A¨Ã§¹¦¨¤W­z°Ê§@¡C ¦pªG§A¦³³\¦hÀɮ׻ݭn½sĶ¡A¨º½Ð¥´Ãþ¦ü¤U¦C«ü¥O§Y¥i¡G

% cc foo.c bar.c

°O¦í»yªk¿ù»~Àˬd´N¬O ¡X¡X ¯ÂºéÀˬd»yªk¿ù»~»P§_¡A ¦Ó¤£·|À°§AÀË´ú¥ô¦óÅÞ¿è¿ù»~¡A¤ñ¦p¡GµL­­°j°é¡A©Î¬O±Æ§Ç¤è¦¡·Q¥Î binary sort «o§Ë¦¨ bubble sort¡C [2]

cc ¦³«D±`¦hªº¿ï¶µ¡A³£¥i³z¹L½u¤W¤â¥U¨Ó¬d¡C ¤U­±¥u´£¤@¨Ç¥²­n¥B­«­nªº¿ï¶µ¡A¥H§@¬°¨Ò¤l¡C

-o ÀɦW

-o ½sĶ«áªº°õ¦æÀÉÀɦW¡A¦pªG¨S¦³¨Ï¥Î³o¿ï¶µªº¸Ü¡A ½sͦnªºµ{¦¡¹w³]ÀɦW±N·|¬O a.out [3]

% cc foobar.c               °õ¦æÀÉ´N¬O a.out
% cc -o foobar foobar.c     °õ¦æÀÉ´N¬O foobar
	    
-c

¨Ï¥Î -c ®É¡A¥u·|½sĶ­ì©l½X¡A¦Ó¤£§@³sµ²(linking)¡C ·í¥u·Q½T»{»yªk¬O§_¥¿½T©Î¨Ï¥Î Makefile ¨Ó½s͵{¦¡®É¡A³o­Ó¿ï¶µ«D±`¦³¥Î¡C

        % cc -c foobar.c
	    

³o·|²£¥Í¥s°µ foobar ªº object file(«D°õ¦æÀÉ)¡C ³oÀÉ¥i¥H»P¨ä¥Lªº object file ³sµ²¦b¤@°_¡A¦Ó¦¨°õ¦æÀÉ¡C

-g

-g ±N·|§â¤@¨Çµ¹ gdb ¥Îªº°£¿ù°T®§¥]¶i¥h°õ¦æÀɸ̭±¡A©Ò¿×ªº°£¿ù°T®§¨Ò¦p¡G µ{¦¡¦b²Ä´X¦æ¥X¿ù¡B¨º­Óµ{¦¡²Ä´X¦æ°µ¤°»ò¨ç¦¡©I¥sµ¥µ¥¡C°£¿ù¸ê°T«D±`¦n¥Î¡C ¦ý¯ÊÂI´N¬O¡G¹ï©óµ{¦¡¨Ó»¡¡AÃB¥~ªº°£¿ù°T®§·|Åý½sĶ¥X¨Óªºµ{¦¡¤ñ¸ûªÎ¨Ç¡C -g ªº¾A¥Î®É¾÷¦b©ó¡G·íµ{¦¡ÁÙ¦b¶}µo®É¨Ï¥Î´N¦n¡A ¦Ó·í§A­nÄÀ¥X§Aªº ¡§µo¦æª©¥»(release version)¡¨ ©ÎªÌ½T»{µ{¦¡¥i¹B§@¥¿±`ªº¸Ü¡A´N¤£¥²¥Î -g ³o¿ï¶µ¤F¡C

% cc -g foobar.c
	    

³o°Ê§@·|²£¥Í¦³§t°£¿ù°T®§ªº°õ¦æÀÉ¡C [4]

-O

-O ·|²£¥Í³Ì¨Î¤Æªº°õ¦æÀÉ¡A ½s;¹·|¨Ï¥Î¤@¨Ç§Þ¥©¡A¨ÓÅýµ{¦¡¥i¥H¶]ªº¤ñ¥¼¸g³Ì¨Î¤Æªºµ{¦¡ÁÙ§Ö¡A ¥i¥H¦b¤j¼g O «á­±¥[¤W¼Æ¦r¨Ó«ü©ú·Q­nªº³Ì¨Î¤Æ¼h¯Å¡C ¦ý¬O³Ì¨Î¤ÆÁÙ¬O·|¦³¤@¨Ç¿ù»~¡AÁ|¨Ò¨Ó»¡¦b FreeBSD 2.10 release ¤¤¥Î cc ¥B«ü©w -O2 ®É¡A¦b¬Y¨Ç±¡§Î¤U·|²£¥Í¿ù»~ªº°õ¦æÀÉ¡C

¥u¦³·í­nÄÀ¥Xµo¦æª©¥»¡B©ÎªÌ¥[³tµ{¦¡®É¡A¤~»Ý­n¨Ï¥Î³Ì¨Î¤Æ¿ï¶µ¡C

% cc -O -o foobar foobar.c
	    

³o·|²£¥Í foobar °õ¦æÀɪº³Ì¨Î¤Æª©¥»¡C

¥H¤U¤T­Ó°Ñ¼Æ±N·|±j­¢ cc ½T»{µ{¦¡½X¬O§_²Å¦X¤@¨Ç°ê»Ú¼Ð·Çªº³W½d¡A ¤]´N¬O³q±`»¡ªº ANSI ¼Ð·Ç¡A ¦Ó ANSI ÄY®æ¨ÓÁ¿ÄÝ ISO ¼Ð·Ç¡C

-Wall

-Wall Åã¥Ü cc ºûÅ@ªÌ©Ò»{¬°­È±oª`·Nªº©Ò¦³Äµ§i°T®§¡C ¤£¹L³o¦W¦r¥i¯à·|³y¦¨»~¸Ñ¡A¨Æ¹ê¤W¥¦¨Ã¥¼§¹¥þÅã¥Ü cc ©Ò¯àª`·N¨ìªº¦U¶µÄµ§i°T®§¡C

-ansi

-ansi Ãö³¬ cc ¯S¦³ªº¬Y¨Ç¯S®í«D ANSI C ¼Ð·Ç¥\¯à¡C ¤£¹L³o¦W¦r¥i¯à·|³y¦¨»~¸Ñ¡A¨Æ¹ê¤W¥¦¨Ã¤£«OÃÒ§Aªºµ{¦¡·|§¹¥þ²Å¦X ANSI ¼Ð·Ç¡C

-pedantic

¥þ­±Ãö³¬ cc ©Ò¯S¦³ªº«D ANSI C ¼Ð·Ç¥\¯à¡C

°£¤F³o¨Ç°Ñ¼Æ¡Acc ÁÙ¤¹³\§A¨Ï¥Î¤@¨ÇÃB¥~ªº°Ñ¼Æ¨ú¥N¼Ð·Ç°Ñ¼Æ¡A¦³¨ÇÃB¥~°Ñ¼Æ«D±`¦³¥Î¡A ¦ý¬O¹ê»Ú¤W¨Ã¤£¬O©Ò¦³ªº½s;¹³£¦³´£¨Ñ³o¨Ç°Ñ¼Æ¡C ·Ó¼Ð·Ç¨Ó¼gµ{¦¡ªº³Ì¥D­n¥Øªº´N¬O¡A§Æ±æ§A¼g¥X¨Óªºµ{¦¡¥i¥H¦b©Ò¦³½s;¹¤W½sĶ¡B°õ¦æµL»~¡A ·íµ{¦¡¥i¥H¹F¦¨¤W­z¥Øªº®É¡A´NºÙ¬° portable code(²¾´Ó©Ê¨}¦nªºµ{¦¡½X)¡C

¤@¯ë¨Ó»¡¡A¦b¼¶¼gµ{¦¡®É´NÀ³­nª`·N¡y²¾´Ó©Ê¡z¡C §_«h¡C·í·Q§âµ{¦¡®³¨ì¥t¥~¤@¥x¾÷¾¹¤W¶]ªº®É­Ô¡A´N¥i¯à±o»Ý­n­«¼gµ{¦¡¡C

% cc -Wall -ansi -pedantic -o foobar foobar.c

¤W­z«ü¥O·|½T»{ foobar.c ¤ºªº»yªk¬O§_²Å¦X¼Ð·Ç¡A ¨Ã¥B²£¥Í¦W¬° foobar ªº°õ¦æÀÉ¡C

-llibrary

§i¶D gcc ¦b³sµ²(linking)µ{¦¡®É§A»Ý­n¥Î¨ìªº¨ç¦¡®w¦WºÙ¡C

³Ì±`¨£ªº±¡ªp´N¬O¡A·í§A¦bµ{¦¡¤¤¨Ï¥Î¤F C ¼Æ¾Ç¨ç¦¡®w¡A ¸ò¨ä¥L§@·~¥­¥x¤£¤@¼Ëªº¬O¡A³o¨ç¥Ü¾Ç¨ç¦¡³£¤£¦b¼Ð·Ç¨ç¦¡®w(library)¤¤¡A ¦]¦¹½s;¹¨Ã¤£ª¾¹D³o¨ç¦¡®w¦WºÙ¡A§A¥²¶·§i¶D½s;¹­n¥[¤W¥¦¤~¦æ¡C

³W«h«Ü²³æ¡A¦pªG¦³­Ó¨ç¦¡®w¥s°µ libsomething.a¡A ´N¥²¶·¦b½sͮɥ[¤W°Ñ¼Æ -lsomething ¤~¦æ¡C Á|¨Ò¨Ó»¡¡A¼Æ¾Ç¨ç¦¡®w¥s°µ libm.a¡A ©Ò¥H§A¥²¶·µ¹ cc ªº°Ñ¼Æ´N¬O -lm¡C ¤@¯ë±¡ªp¤U¡A³q±`·|§â³o°Ñ¼Æ¥²¶·©ñ¦b«ü¥Oªº³Ì«á¡C

% cc -o foobar foobar.c -lm
	    

¤W­±³o«ü¥O·|Åý gcc ¸ò¼Æ¾Ç¨ç¦¡®w§@³sµ²¡A¥H«K§Aªºµ{¦¡¥i¥H©I¥s¨ç¦¡®w¤º§tªº¼Æ¾Ç¨ç¦¡¡C

¦pªG§A¥¿¦b½sĶªºµ{¦¡¬O C++ µ{¦¡½X¡A§AÁÙ¥²¶·ÃB¥~«ü©w -lg++ ©ÎªÌ¬O -lstdc++¡C ¦pªG§Aªº FreeBSD ¬O 2.2(§t)¥H«áª©¥»¡A §A¥i¥H¥Î«ü¥O c++ ¨Ó¨ú¥N cc¡C ¦b FreeBSD ¤W c++ ¤]¥i¥H¥Î g++ ¨ú¥N¡C

% cc -o foobar foobar.cc -lg++     ¾A¥Î FreeBSD 2.1.6 ©Î§ó¦­´Áªºª©¥»
% cc -o foobar foobar.cc -lstdc++  ¾A¥Î FreeBSD 2.2 ¤Î¤§«áªºª©¥»
% c++ -o foobar foobar.cc
	    

¤W­z«ü¥O³£·|±q­ì©lÀÉ foobar.cc ½sͲ£¥Í¦W¬° fooboar ªº°õ¦æÀÉ¡C ³oÃä­n´£¿ôªº¬O¦b UNIX® ¨t²Î¤¤ C++ µ{¦¡¶Ç²Î³£¥H .C¡B .cxx ©ÎªÌ¬O .cc §@¬°°ÆÀɦW¡A ¦Ó«D MS-DOS® ¨ººØ¥H .cpp §@¬°°ÆÀɦWªº©R¦W¤è¦¡(¤£¹L¤]¶V¨Ó¶V´¶¹M¤F)¡C gcc ·|¨Ì°ÆÀɦW¨Ó¨M©w¥Î­þ¤@ºØ½s;¹½sĶ¡A µM¦Ó¡A²{¦b¤w¸g¤£¦A­­¨î°ÆÀɦW¤F¡A ©Ò¥H¥i¥H¦Û¥Ñªº¨Ï¥Î .cpp §@¬° C++ µ{¦¡½Xªº°ÆÀɦW¡I

2.4.1 ±`¨£ªº cc °ÝÃD

2.4.1.1. §Ú¥Î sin() ¨ç¥Ü¼¶¼g§Úªºµ{¦¡¡A ¦ý¬O¦³­Ó¿ù»~°T®§(¦p¤U)¡A³o¥NªíµÛ¡H
2.4.1.2. ¦n§a¡A§Ú¸ÕµÛ¼g¨Ç²³æªºµ{¦¡¡A¨Ó½m²ß¨Ï¥Î -lm ¿ï¶µ(¸Óµ{¦¡·|¹Bºâ 2.1 ªº 6 ¦¸¤è)
2.4.1.3. ¨º¦p¦ó¤~¥i¥H­×¥¿­è©Ò»¡ªº°ÝÃD¡H
2.4.1.4. ¤w¸g½sͦn foobar.c¡A ¦ý¬O½sĶ«á§ä¤£¨ì foobar °õ¦æÀÉ¡C ¸Ó¥h­þÃä§ä©O¡H
2.4.1.5. ¦n¡A¦³­Ó½sͦnªºµ{¦¡¥s°µ foobar¡A ¥Î ls «ü¥O®É¥i¥H¬Ý¨ì¡A ¦ý°õ¦æ®É¡A°T®§«o»¡«o¨S¦³³oÀɮסC¬°¤°»ò¡H
2.4.1.6. ¸ÕµÛ°õ¦æ test °õ¦æÀÉ¡A ¦ý¬O«o¨S¦³¥ô¦ó¨Æµo¥Í¡A¨ì©³¬O­þ¸Ì¥X¿ù¤F¡H
2.4.1.7. ·í°õ¦æ§Ú¼gªºµ{¦¡®É­è¶}©l¥¿±`¡A ±µ¤U¨Ó«o¥X²{ ¡§core dumped¡¨ ¿ù»~°T®§¡C³o¿ù»~°T®§¨ì©³¥Nªí¤°»ò¡H
2.4.1.8. ¯u¬O¤Ó¯«©_¤F¡Iµ{¦¡©~µMµo¥Í ¡§core dumped¡¨ ¤F¡A¸Ó«ç»ò¿ì¡H
2.4.1.9. ·íµ{¦¡¤w¸g§â core memory ¸ê®Æ dump ¥X¨Ó«á¡A ¦P®É¤]¥X²{¥t¤@­Ó¿ù»~ ¡§segmentation fault¡¨ ³o·N«ä¬O¡H
2.4.1.10. Sometimes when I get a core dump it says ¡§bus error¡¨. It says in my UNIX book that this means a hardware problem, but the computer still seems to be working. Is this true?
2.4.1.11. This dumping core business sounds as though it could be quite useful, if I can make it happen when I want to. Can I do this, or do I have to wait until there is an error?

2.4.1.1. §Ú¥Î sin() ¨ç¥Ü¼¶¼g§Úªºµ{¦¡¡A ¦ý¬O¦³­Ó¿ù»~°T®§(¦p¤U)¡A³o¥NªíµÛ¡H

/var/tmp/cc0143941.o: Undefined symbol `_sin' referenced from text segment
	      

·í¨Ï¥Î sin() ³oÃþªº¼Æ¾Ç¨ç¥Ü®É¡A §A¥²¶·§i¶D cc ­n©M¼Æ¾Ç¨ç¦¡®w§@³sµ²(linking)¡A´N¹³³o¼Ë¡G

% cc -o foobar foobar.c -lm
	      

2.4.1.2. ¦n§a¡A§Ú¸ÕµÛ¼g¨Ç²³æªºµ{¦¡¡A¨Ó½m²ß¨Ï¥Î -lm ¿ï¶µ(¸Óµ{¦¡·|¹Bºâ 2.1 ªº 6 ¦¸¤è)

#include <stdio.h>

int main() {
	float f;

	f = pow(2.1, 6);
	printf("2.1 ^ 6 = %f\n", f);
	return 0;
}
	      

µM«á¶i¦æ½sĶ¡G

% cc temp.c -lm
	      

½sĶ«á°õ¦æµ{¦¡¡A±o¨ì¤U­±³oµ²ªG¡G

% ./a.out
2.1 ^ 6 = 1023.000000
	      

«Ü©úÅ㪺¡Aµ{¦¡µ²ªG¤£¬O¥¿½Tµª®×¡A¨ì©³¬O­þÃä¥X¿ù¡H

·í½s;¹µo²{§A©I¥s¤@­Ó¨ç¥Ü®É¡A¥¦·|½T»{¸Ó¨ç¥Üªº¦^¶Ç­ÈÃþ«¬(prototype)¡A ¦pªG¨S¦³¯S§O«ü©ú¡A«h¹w³]ªº¦^¶Ç­ÈÃþ«¬¬° int(¾ã¼Æ)¡C «Ü©úÅ㪺¡A§Aªºµ{¦¡©Ò»Ý­nªº¨Ã¤£¬O¦^¶Ç­ÈÃþ§O¬° int¡C

2.4.1.3. ¨º¦p¦ó¤~¥i¥H­×¥¿­è©Ò»¡ªº°ÝÃD¡H

¼Æ¾Ç¨ç¥Üªº¦^¶Ç­ÈÃþ«¬(prototype)·|©w¸q¦b math.h¡A ¦pªG§A¦³ include ³oÀÉ¡A½s;¹´N·|ª¾¹D¸Ó¨ç¥Üªº¦^¶Ç­ÈÃþ«¬¡A¦p¦¹¤@¨Ó¸Ó¹Bºâ´N·|±o¨ì¥¿½Tªºµ²ªG¡I

#include <math.h>
#include <stdio.h>

int main() {
...
	      

¥[¤F¤W­z¤º®e¤§«á¡A¦A­«·s½sĶ¡A³Ì«á°õ¦æ¡G

% ./a.out
2.1 ^ 6 = 85.766121
	      

¦pªG¦³¥Î¨ì¼Æ¾Ç¨ç¦¡¡A½Ð½T©w­n¦³ include math.h ³oÀÉ¡A ¦Ó¥B°O±o­n©M¼Æ¾Ç¨ç¦¡®w§@³sµ²¡C

2.4.1.4. ¤w¸g½sͦn foobar.c¡A ¦ý¬O½sĶ«á§ä¤£¨ì foobar °õ¦æÀÉ¡C ¸Ó¥h­þÃä§ä©O¡H

°O±o¡A°£«D¦³«ü©w½s͵²ªGªº°õ¦æÀÉÀɦW¡A§_«h¹w³]ªº°õ¦æÀÉÀɦW¬O a.out¡C ¥Î -o filename °Ñ¼Æ¡A ´N¥i¥H¹F¨ì©Ò·Q­nªºµ²ªG¡A¤ñ¦p¡G

% cc -o foobar foobar.c
	      

2.4.1.5. ¦n¡A¦³­Ó½sͦnªºµ{¦¡¥s°µ foobar¡A ¥Î ls «ü¥O®É¥i¥H¬Ý¨ì¡A ¦ý°õ¦æ®É¡A°T®§«o»¡«o¨S¦³³oÀɮסC¬°¤°»ò¡H

»P MS-DOS ¤£¦Pªº¬O¡A°£«D¦³«ü©w°õ¦æÀɪº¸ô®|¡A §_«h UNIX ¨t²Î¨Ã¤£·|¦b¥Ø«eªº¥Ø¿ý¤U´M§ä§A·Q°õ¦æªºÀɮסC ¦b«ü¥O¦C¤U¥´ ./foobar ¥Nªí ¡§°õ¦æ¦b³o­Ó¥Ø¿ý©³¤U¦W¬° foobar ªºµ{¦¡¡¨¡A ©ÎªÌ¤]¥i¥H§ó§ï PATH Àô¹ÒÅܼƳ]©w¦p¤U¡A¥H¹F¦¨Ãþ¦ü®ÄªG¡G

bin:/usr/bin:/usr/local/bin:.
	      

¤W¤@¦æ³Ì«áªº "." ¥Nªí¡§¦pªG¦b«e­±¼gªº¨ä¥L¥Ø¿ý§ä¤£¨ì¡A´N§ä¥Ø«eªº¥Ø¿ý¡¨¡C

2.4.1.6. ¸ÕµÛ°õ¦æ test °õ¦æÀÉ¡A ¦ý¬O«o¨S¦³¥ô¦ó¨Æµo¥Í¡A¨ì©³¬O­þ¸Ì¥X¿ù¤F¡H

¤j¦h¼Æªº UNIX ¨t²Î³£·|¦b¸ô®| /usr/bin Â\©ñ°õ¦æÀÉ¡C °£«D¦³«ü©w¨Ï¥Î¦b¥Ø«e¥Ø¿ý¤ºªº test¡A§_«h shell ·|Àu¥ý¿ï¾Ü¦ì¦b /usr/bin ªº test¡A ­n«ü©wÀɦWªº¸Ü¡A§@ªkÃþ¦ü¡G

% ./test
	      

¬°¤FÁ×§K¤W­z§xÂZ¡A½Ð¬°§Aªºµ{¦¡¨ú§ó¦nªº¦WºÙ§a¡I

2.4.1.7. ·í°õ¦æ§Ú¼gªºµ{¦¡®É­è¶}©l¥¿±`¡A ±µ¤U¨Ó«o¥X²{ ¡§core dumped¡¨ ¿ù»~°T®§¡C³o¿ù»~°T®§¨ì©³¥Nªí¤°»ò¡H

Ãö©ó core dumped ³o­Ó¦WºÙªº¥Ñ¨Ó¡A ¥i¥H°l·¹¨ì¦­´Áªº UNIX ¨t²Î¶}©l¨Ï¥Î core memory ¹ï¸ê®Æ±Æ§Ç®É¡C °ò¥»¤W·íµ{¦¡¦b«Ü¦h±¡ªp¤Uµo¥Í¿ù»~«á¡A §@·~¨t²Î·|§â core memory ¤¤ªº¸ê°T¼g¤J core ³oÀɮפ¤¡A ¥H«KÅý programmer ª¾¹Dµ{¦¡¨ì©³¬O¬°¦ó¥X¿ù¡C

2.4.1.8. ¯u¬O¤Ó¯«©_¤F¡Iµ{¦¡©~µMµo¥Í ¡§core dumped¡¨ ¤F¡A¸Ó«ç»ò¿ì¡H

½Ð¥Î gdb ¨Ó¤ÀªR core µ²ªG(¸Ô±¡½Ð°Ñ¦Ò Section 2.6)¡C

2.4.1.9. ·íµ{¦¡¤w¸g§â core memory ¸ê®Æ dump ¥X¨Ó«á¡A ¦P®É¤]¥X²{¥t¤@­Ó¿ù»~ ¡§segmentation fault¡¨ ³o·N«ä¬O¡H

°ò¥»¤W¡A³o­Ó¿ù»~ªí¥Ü§Aªºµ{¦¡¦b°O¾ÐÅ餤¸ÕµÛ°µ¤@­ÓÄY­«ªº«Dªk¹B§@(illegal operation)¡A UNIX ´N¬O³Q³]­p¨Ó«OÅ@¾ã­Ó§@·~¨t²Î§K©ó³Q´c½èªºµ{¦¡¯}Ãa¡A©Ò¥H¤~·|§i¶D§A³o­Ó°T®§¡C

³Ì±`³y¦¨¡§segmentation fault¡¨ªº­ì¦]³q±`¬°¡G

  • ¸ÕµÛ¹ï¤@­Ó NULL ªº«ü¼Ð(pointer)§@¼g¤Jªº°Ê§@¡A¦p

    char *foo = NULL;
    strcpy(foo, "bang!");
    		
    
  • ¨Ï¥Î¤@­Ó©|¥¼ªì©l¤Æ(initialized)ªº«ü¼Ð¡A¦p¡G

    char *foo;
    strcpy(foo, "bang!");
    		
    

    ©|¥¼ªì©l¤Æªº«ü¼Ðªºªì©l­È±N·|¬OÀH¾÷ªº¡A¦pªG§A°÷©¯¹Bªº¸Ü¡A ³o­Ó«ü¼Ðªºªì©l­È·|«ü¦V kernel ¤w¸g¥Î¨ìªº°O¾ÐÅé¦ì¸m¡A kernel ·|µ²§ô±¼³o­Óµ{¦¡¥H½T«O¨t²Î¹B§@¥¿±`¡C¦pªG§A¤£°÷©¯¹B¡A ªì©l«ü¨ìªº°O¾ÐÅé¦ì¸m¬O§Aµ{¦¡¥²¶·­n¥Î¨ìªº¸ê®Æµ²ºc(data structures)ªº¦ì¸m¡A ·í³o­Ó±¡§Îµo¥Í®Éµ{¦¡±N·|·íªº¤£ª¾¨ä©Ò¥HµM¡C

  • ¸ÕµÛ¼g¤J¶W¹L°}¦C(array)¤¸¯À­Ó¼Æ¡A¦p¡G

    int bar[20];
    bar[27] = 6;
    		
    
  • ¸ÕµÛŪ¼g¦b°ßŪ°O¾ÐÅé(read-only memory)¤¤ªº¸ê®Æ¡A¦p¡G

    char *foo = "My string";
    strcpy(foo, "bang!");
    		
    

    UNIX compilers often put string literals like "My string" into read-only areas of memory.

  • Doing naughty things with malloc() and free(), eg

    char bar[80];
    free(bar);
    		
    

    or

    char *foo = malloc(27);
    free(foo);
    free(foo);
    		
    

Making one of these mistakes will not always lead to an error, but they are always bad practice. Some systems and compilers are more tolerant than others, which is why programs that ran well on one system can crash when you try them on an another.

2.4.1.10. Sometimes when I get a core dump it says ¡§bus error¡¨. It says in my UNIX book that this means a hardware problem, but the computer still seems to be working. Is this true?

No, fortunately not (unless of course you really do have a hardware problem...). This is usually another way of saying that you accessed memory in a way you should not have.

2.4.1.11. This dumping core business sounds as though it could be quite useful, if I can make it happen when I want to. Can I do this, or do I have to wait until there is an error?

Yes, just go to another console or xterm, do

% ps
	    

to find out the process ID of your program, and do

% kill -ABRT pid
	    

where pid is the process ID you looked up.

This is useful if your program has got stuck in an infinite loop, for instance. If your program happens to trap SIGABRT, there are several other signals which have a similar effect.

Alternatively, you can create a core dump from inside your program, by calling the abort() function. See the manual page of abort(3) to learn more.

If you want to create a core dump from outside your program, but do not want the process to terminate, you can use the gcore program. See the manual page of gcore(1) for more information.

Notes

[1]

ÄY®æ»¡°_¨Ó¡A¦b³o­Ó¶¥¬q cc ¨Ã¤£¬O¯uªº§â­ì©lµ{¦¡Âন²Õ¦X»y¨¥¡A ¦Ó¬OÂର machine-independent ªº p-code¡C

[2]

­è©Ò»¡ªº binary sort ©M bubble sort °ÝÃD¡A ¦b¤w±Æ§Ç¦nªº§Ç¦C¤¤¡Abinary sort ·j¯Á®Ä²v·|¤ñ bubble sort ¦n¡C

[3]

¦Ü©ó -o ªº­ì¦]¡A«h¬O¤@¹Î¾ú¥v°gÃú¤F¡C

[4]

½Ðª`·N¡A¦]¬°¤W¨Ò¨S¥Î -o ¥H«ü©w°õ¦æÀɦWºÙ¡A ©Ò¥H°õ¦æÀÉ·|¬O a.out ³oÀÉ¡C ¨º»ò¡A­n¦p¦ó²£¥Í foobar ªº°õ¦æÀɨ产t°£¿ù°T®§¡A ³o´N¯d«Ý¬Ý­¾­Ì½m²ß¤@¤UÅo¡C

¥»¤å¤Î¨ä¥L¤å¥ó¡A¥i¥Ñ¦¹¤U¸ü¡Gftp://ftp.FreeBSD.org/pub/FreeBSD/doc/¡C

­Y¦³ FreeBSD ¤è­±ºÃ°Ý¡A½Ð¥ý¾\Ū FreeBSD ¬ÛÃö¤å¥ó¡A¦p¤£¯à¸Ñ¨Mªº¸Ü¡A¦A¬¢¸ß <questions@FreeBSD.org>¡C
Ãö©ó¥»¤å¥óªº°ÝÃD¡A½Ð¬¢¸ß <doc@FreeBSD.org>¡C