【正文】
字節(jié)對(duì)齊,會(huì)減少很多麻煩。 這特別表現(xiàn)在為別人開發(fā)庫文件時(shí),如果一個(gè)庫函數(shù)使用了 struct作為其參數(shù),當(dāng)調(diào)用者與庫文件開發(fā)者使用不同的 pack時(shí),就會(huì)造成錯(cuò)誤,而且該類錯(cuò)誤很不好查。 如果效率非常重要,就盡量不要使用 pragma pack, 如果必須使用,也最好僅在需要的地方進(jìn)行設(shè)置。這個(gè)參數(shù)對(duì)數(shù)據(jù)包網(wǎng)絡(luò)傳輸?shù)葢?yīng)用尤為重要,不是存取速度問題,而是數(shù)據(jù)位的精確定義問題,一般在程序中使用 pragma pack來指定。 盡管 i只有一個(gè)字節(jié), j占 4個(gè)字節(jié),但編譯器可能為了對(duì)齊為 i分配 4個(gè)字節(jié),結(jié)果整個(gè)結(jié)構(gòu)是 8個(gè)字節(jié),這就是 4字節(jié)對(duì)齊的情況,而在編譯器設(shè)為單字節(jié)對(duì)齊時(shí)則正好是 5個(gè)字節(jié)。 int j。 } gcc和 vc的結(jié)果是 9, 12, tc2的結(jié)果都是 5,因?yàn)?tc的 int是 2位的,對(duì)于 pc的開發(fā)問題不是很大,但是對(duì)于嵌入式開發(fā),必須考慮到內(nèi)存浪費(fèi)的問題。 fflush(stdout)。 fwrite(amp。 = 0x4D4E4F50。 fflush(stdout)。 fwrite(amp。c39。 = 0x45464748。 } s_2。 int j。 } s_1。 int j。 要退出 gdb, 請(qǐng)鍵入命令 quit, 如果程序此時(shí)仍在進(jìn)行 ,gdb會(huì)讓你確認(rèn)是否真的要退出 , 屏幕會(huì)出現(xiàn)類似下面的提示信息: (gdb) quit The program is running. Exit anyway? (y or n) 按下 ‘ y’即退出調(diào)試程序,如果程序本身已經(jīng)運(yùn)行完畢,則quit命令鍵入后,會(huì)直接退出 gdb,而不出現(xiàn)任何提示信息 。 為了進(jìn)入到函數(shù) display內(nèi)部進(jìn)行調(diào)試 , 輸入命令 step, 即: (gdb) step display (z=5, zptr=0xbffffb44) at :15 15 printf(In display():\n)。 (gdb) next x is 5 and is stored at 0xbffffb44. 9 printf( xptr holds %p and points to %d.\n, xptr, *xptr)。 (gdb) next In main(): 8 printf( x is %d and is stored at %p.\n, x, amp。x。 上述信息表明 , gdb已經(jīng)開始執(zhí)行可執(zhí)行程序 , 目前程序運(yùn)行到 程序中 main()函數(shù)的第五行處停止 , 并且顯示出即將要執(zhí)行的第五行語句 。在 gdb下,Linux最常用文本編輯命令 vi不能使用,可以使用 list命令列出可執(zhí)行文件的源代碼的一部分,為了列出源代碼的全部,只要多鍵入幾次 list命令即可。在 bash提示符下,鍵入命令 :gdb example1, 啟動(dòng)了對(duì)可執(zhí)行文件example1 的調(diào)試,在屏幕上會(huì)出現(xiàn)下面的信息: [nieuClinux nie]$ gdb example1 GNU gdb Red Hat Linux () (MI_OUT) Copyright 2021 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are wele to change it and/or distribute copies of it under certain conditions. Type show copying to see the conditions. There is absolutely no warranty for GDB. Type show warranty for details. This GDB was configured as i386redhatlinux... (gdb) 最后一行 (gdb)就是進(jìn)入到 gdb調(diào)試中的提示符,此時(shí)可以在提示符下輸入任何想鍵入的命令。 } 要使用 gdb調(diào)試程序 , 一定要在編譯程序時(shí) , 使用 g編譯選項(xiàng) , 以生成參數(shù)符號(hào)表( augmented symbol table), 提供調(diào)試信息 。z)。 } void display(int z, int *zptr) { printf(In display():\n)。 display(x, xptr)。x)。 printf(In main():\n)。 int *xptr = amp。 源程序名為 , 代碼如下: /******************************************************* * Institute of Automation, Chinese Academy of Sciences * File Name: * Description: introduce how to use gdb * Author: Xueyuan Nie * Date: *******************************************************/ include static void display(int i, int *ptr)。 當(dāng)在調(diào)試過程中 , 想查看一個(gè)變量值的時(shí)候 , 可以在 gdb環(huán)境下 輸 入 命 令 : watch variablename , 這 里 的variablename是你想觀察的變量名 。 continue命令是繼續(xù)運(yùn)行程序 , 直到遇到下一個(gè)斷點(diǎn)或程序結(jié)束 。如果想查看目前設(shè)置斷點(diǎn)的情況,可以使用命令 info break, 屏幕會(huì)顯示出每一個(gè)設(shè)置的斷點(diǎn)信息 在 gdb提示符下使用 help命令 , 會(huì)給出有關(guān) gdb命令的一個(gè)簡短描述和命令分類 。 (gdb) 當(dāng)想將某個(gè)斷點(diǎn)除去,可以在 gdb提示符下輸入命令: delete N, 這里 N表示第幾個(gè)中斷,第一個(gè)設(shè)置的中斷序號(hào)為 1,第二個(gè)設(shè)置的序號(hào)為 2,依次類推。 當(dāng)然,也可以使用行號(hào)設(shè)置中斷位置,上面設(shè)置中斷的語句可以等價(jià)為 break 604, 可以在屏幕上看到相同的效果。 就在上一小節(jié)中所舉 makefile例子來說 ,就是鍵入 gdb tune1, 則在屏幕上會(huì)出現(xiàn) : [nieuClinux mysrc]$ gdb tune1 GNU gdb Red Hat Linux () (MI_OUT) Copyright 2021 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are wele to change it and/or distribute copies of it under certain conditions. Type show copying to see the conditions. There is absolutely no warranty for GDB. Type show warranty for details. This GDB was configured as i386redhatlinux... (gdb) gdb雖然運(yùn)行起來 , 但是可執(zhí)行程序 tune1并沒有運(yùn)行 , 此時(shí)在 gdb提示符下直接鍵入 run命令即可 , 如果可執(zhí)行程序在運(yùn)行的時(shí)候需要輸入命令行參數(shù) , 則在 gdb提示符下可以這樣鍵入命令: run mandlinearguments , 就如同是輸入命令: tune1 mandlinearguments一樣 , 啟動(dòng)了可執(zhí)行程序的運(yùn)行 。用了 g選項(xiàng)后,程序在編譯的時(shí)候就會(huì)包含調(diào)試信息,這些調(diào)試信息存在目標(biāo)文件中,它描述了每個(gè)函數(shù)或