2010年9月17日 星期五

[GNU 程式設計] C 及 C++ 程式除錯器 : 檢視及設定變數的值


前言 :
當程式停在中斷點, 你可以看看程式到底是如何執行的. 基本的變數處理命令包括 :
命令 | 說明
whatis | 判斷變數或陣列的型別.
set variable | 設定變數的值
print | 除了印出變數的值外, print 也可以設定值.


範例說明 :
要知道變數的型別, 可以用下列命令 : ((gdb) whatis variable-name)
(gdb) list 14 <檢視原始碼>
warning: Source file is more recent than executable.

9 hello("John");
10 printf("%d\n",itt[0]);
11 printf("%d\n",itt[1]);
12 hello("Peter");
13 printf("\n");
14 for(; testi<=2; testi++){
15 printf("%d ", testi);
16 printf("======\n");
17 }
18 return 0;
(gdb) break 15 <在15行設中斷點>
Breakpoint 1 at 0x80484ee: file string_test.c, line 15.
(gdb) run <執行程式>
Starting program: /usr/home/benjamin/src/test/test
Test
Hello John
0
1
Hello Peter


Breakpoint 1, main () at string_test.c:15
15 printf("%d ", testi);
(gdb) whatis testi <檢視變數testi 的型態>
type = int

你也可以用 whatis 去查詢資料結構, 雖然 ptype 命令的功能更勝一籌. 舉例來說 whatis 雖然可以給你資料結構名稱, ptype 卻能告訴你資料結構的定義. print 會印出任何變數或運算式的值. 請參考如下範例 :
(gdb) print testi <檢視變數 testi的值>
$1 = 0
(gdb) print testi=3 <檢視變數testi 的值同時將之設為 3>
$2 = 3
(gdb) set variable testi = 1 <利用命令 set 將變數 testi 設為 1>
(gdb) print testi <檢視變數 testi的值>
$3 = 1
(gdb) c <繼續執行>
Continuing.
1 ====== 

Breakpoint 1, main () at string_test.c:15
15 printf("%d ", testi);

若程式已作最佳化, 也許不能列印變數的值或將其改指定新值. 例如已指定到暫存器或已從程式刪除的變數, gdb 就不可能看得到. 
This message was edited 3 times. Last update was at 21/02/2010 14:42:45

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...