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

首頁 > 系統 > Linux > 正文

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

2024-08-27 23:55:41
字體:
來源:轉載
供稿:網友
  Linux編程工具gdb 支持很多與 UNIX shell 程序一樣的命令編輯特征. 你能象在 bash 或 tcsh里那樣按 Tab 鍵讓 gdb 幫你補齊一個唯一的命令, 如果不唯一的話 gdb 會列出所有匹配的命令. 你也能用光標鍵上下翻動歷史命令.
 
  本節用一個實例教你一步步的用Linux編程工具gdb 調試程序. 被調試的程序相當的簡單, 但它展示了Linux編程工具gdb 的典型應用.

  第一次鍵入 list 命令的輸出如下:
 
  #include  
  static void my_print (char *);  
  static void my_print2 (char *);  
  main ()  
  {  
  char my_string[] = "hello world!";  
  my_print (my_string);  
  my_print2 (my_string);
  再按一次回車將列出 hello 程序的剩余部分:
 
  根據列出的源程序, 你能看到要設斷點的地方在第26行, 在 gdb 命令行提示符下鍵入如下命令設置斷點: (gdb) break 26
 
  gdb 將作出如下的響應: Breakpoint 1 at 0x804857c: file hello.c, line 26. (gdb)
 
  現在再鍵入 run 命令, 將產生如下的輸出:
 
  Starting program: /root/hello  
  The string is hello world!  
  Breakpoint 1, my_print2 (string=0xbffffab0 "hello world!") at hello.c:26  
  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 用如下的顯示來告訴你這個信息:
 
  Hardware watchpoint 2: string2[size - i]  
  Old value = 0 '00'
  New value = 104 'h'
  my_print2 (string=0xbffffab0 "hello world!") at hello.c:25  
  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 為空字符保留.
 
 

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扶余县| 卫辉市| 四川省| 保定市| 双江| 改则县| 都昌县| 晋宁县| 武冈市| 东城区| 沁源县| 西乌珠穆沁旗| 大渡口区| 奉节县| 甘南县| 灯塔市| 新源县| 惠水县| 吴堡县| 彭泽县| 武隆县| 新闻| 米林县| 沁水县| 金堂县| 那曲县| 嘉定区| 濮阳县| 都匀市| 普兰县| 梁平县| 石门县| 楚雄市| 遵义县| 奉节县| 张家口市| 武宣县| 明水县| 文山县| 高邮市| 莱西市|