国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux編程工具C編譯器和C編程工具GDB執行步驟

2024-08-27 23:57:26
字體:
來源:轉載
供稿:網友

Linux編程工具gdb 支持很多與 UNIX shell 程序一樣的命令編輯特征. 你能象在 bash 或 tcsh里那樣按 Tab 鍵讓 gdb 幫你補齊一個唯一的命令, 如果不唯一的話 gdb 會列出所有匹配的命令. 你也能用光標鍵上下翻動歷史命令.

Linux編程工具gdb 應用舉例

本節用一個實例教你一步步的用Linux編程工具gdb 調試程序. 被調試的程序相當的簡單, 但它展示了Linux編程工具gdb 的典型應用.

下面列出了將被調試的程序. 這個程序被稱為 hello , 它顯示一個簡單的問候, 再用反序將它列出.

  1. #include  
  2. static void my_print (char *);  
  3. static void my_print2 (char *);  
  4. main ()  
  5. {  
  6. char my_string[] = "hello world!";  
  7. my_print (my_string);  
  8. my_print2 (my_string);  
  9. }  
  10. void my_print (char *string)  
  11. {  
  12. printf ("The string is %s ", string);  
  13. }  
  14. void my_print2 (char *string)  
  15. {  
  16. char *string2;  
  17. int size, i;  
  18. size = strlen (string);  
  19. string2 = (char *) malloc (size + 1);  
  20. for (i = 0; i < size; i++)  
  21. string2[size - i] = string[i];  
  22. string2[size+1] = '';  
  23. printf ("The string printed backward is %s ", string2);  

用下面的命令編譯它: gcc -g -o hello hello.c 這個程序執行時顯示如下結果:

  1. ./hello  
  2. The string is hello world!  
  3. The string printed backward is 

輸出的第一行是正確的, 但第二行打印出的東西并不是我們所期望的. 我們所設想的輸出應該是:The string printed backward is !dlrow olleh由于某些原因, my_print2 函數沒有正常工作. 讓我們用 gdb 看看問題究竟出在哪兒, 先鍵入如下命令:gdb hello

如果你在輸入命令時忘了把要調試的程序作為參數傳給 gdb , 你可以在 gdb 提示符下用 file 命令來載入它: (gdb) file hello
這個命令將載入 hello 可執行文件就象你在 gdb 命令行里裝入它一樣.這時你能用 gdb 的 run 命令來運行 hello 了. 當它在 gdb 里被運行后結果大約會象這樣:

  1. (gdb) run  
  2. Starting program: /root/hello  
  3. The string is hello world!  
  4. The string printed backward is  
  5. Program exited with code 040 

這個輸出和在Linux編程工具gdb 外面運行的結果一樣. 問題是, 為什么反序打印沒有工作? 為了找出癥結所在, 我們可以在 my_print2 函數的 for 語句后設一個斷點, 具體的做法是在 gdb 提示符下鍵入 list 命令三次, 列出源代碼:

  1. (gdb) list  
  2. (gdb) list  
  3. (gdb) list 

第一次鍵入 list 命令的輸出如下:

  1. #include  
  2. static void my_print (char *);  
  3. static void my_print2 (char *);  
  4. main ()  
  5. {  
  6. char my_string[] = "hello world!";  
  7. my_print (my_string);  
  8. my_print2 (my_string); 

再按一次回車將列出 hello 程序的剩余部分:

根據列出的源程序, 你能看到要設斷點的地方在第26行, 在 gdb 命令行提示符下鍵入如下命令設置斷點: (gdb) break 26

gdb 將作出如下的響應: Breakpoint 1 at 0x804857c: file hello.c, line 26. (gdb)

現在再鍵入 run 命令, 將產生如下的輸出:

  1. Starting program: /root/hello  
  2. The string is hello world!  
  3. Breakpoint 1, my_print2 (string=0xbffffab0 "hello world!") at hello.c:26  
  4. 26 string2[size - i] = string[i]; 

你能通過設置一個觀察 string2[size - i] 變量的值的觀察點來看出錯誤是怎樣產生的, 做法是鍵入:

(gdb) watch string2[size - i]

gdb 將作出如下回應: Hardware watchpoint 2: string2[size - i]

現在可以用 next 命令來一步步的執行 for 循環了: (gdb) next

經過第一次循環后, gdb 告訴我們 string2[size - i] 的值是 `h`. gdb 用如下的顯示來告訴你這個信息:

  1. Hardware watchpoint 2: string2[size - i]  
  2. Old value = 0 '00' 
  3. New value = 104 'h' 
  4. my_print2 (string=0xbffffab0 "hello world!") at hello.c:25  
  5. 25 for (i = 0; i < size; i++) 

這個值正是期望的. 后來的數次循環的結果都是正確的. 當 i=11 時, 表達式 string2[size - i] 的值等于 `!`, size - i 的值等于 1, 最后一個字符已經拷到新串里了.

如果你再把循環執行下去, 你會看到已經沒有值分配給 string2[0] 了, 而它是新串的第一個字符, 因為 malloc 函數在分配內存時把它們初始化為空(null)字符. 所以 string2 的第一個字符是空字符. 這解釋了為什么在打印 string2 時沒有任何輸出了.

現在找出了問題出在哪里, 修正這個錯誤是很容易的. 你得把代碼里寫入 string2 的第一個字符的的偏移量改為 size - 1 而不是 size. 這是因為 string2 的大小為 12, 但起始偏移量是 0, 串內的字符從偏移量 0 到 偏移量 10, 偏移量 11 為空字符保留.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿城市| 临澧县| 揭西县| 三河市| 洛浦县| 东平县| 同德县| 眉山市| 绥阳县| 光山县| 贡嘎县| 大田县| 共和县| 吴旗县| 和龙市| 历史| 阿鲁科尔沁旗| 福建省| 罗定市| 天全县| 定边县| 景洪市| 普宁市| 乡宁县| 敖汉旗| 绥江县| 万山特区| 武定县| 土默特左旗| 泰兴市| 柳林县| 永修县| 民和| 张家界市| 抚顺市| 宜良县| 安远县| 太原市| 武邑县| 尉氏县| 陵水|