*********gdb 的常用命令*************** 命令 解釋 break NUM 在指定的行上設置斷點。 BT 顯示所有的調用棧幀。該命令可用來顯示函數的調用順序。 clear 刪除設置在特定源文件、特定行上的斷點。其用法為:clear FILENAME:NUM。 continue 繼續執行正在調試的程序。該命令用在程序由于處理信號或斷點而 導致停止運行時。 display EXPR 每次程序停止后顯示表達式的值。表達式由程序定義的變量組成。 file FILE 裝載指定的可執行文件進行調試。 help NAME 顯示指定命令的幫助信息。 info break 顯示當前斷點清單,包括到達斷點處的次數等。 info files 顯示被調試文件的具體信息。 info func 顯示所有的函數名稱。 info local 顯示當函數中的局部變量信息。 info prog 顯示被調試程序的執行狀態。 info var 顯示所有的全局和靜態變量名稱。 kill 終止正被調試的程序。 list 顯示源代碼段。 make 在不退出 gdb 的情況下運行 make 工具。 next 在不單步執行進入其他函數的情況下,向前執行一行源代碼。 print EXPR 顯示表達式 EXPR 的值。
if (argc < 2) { printf ("Usage: %s n/n", argv [0]); return -1; } else { n = atoi (argv[1]); printf ("Factorial of %d is %d./n", n, factorial (n)); }
return 0; } ----------------------- 利用如下的命令可編譯生成可執行文件,并執行程序: $ gcc -o factorial main.c factorial.c $ ./factorial 5 Factorial of 5 is 120.
GCC 可同時用來編譯 C 程序和 C++ 程序。一般來說,C 編譯器通過源文件的后綴名來判定是 C 程序還是 C+ + 程序。在 linux 中,C 源文件的后綴名為 .c,而 C++ 源文件的后綴名為 .C 或 .cpp。 但是,gcc 命令只能編譯 C++ 源文件,而不能自動和 C++ 程序使用的庫連接。因此,通常使用 g++ 命令來完 完成 C++ 程序的編譯和連接,該程序會自動調用 gcc 實現編譯。 假設我們有一個如下的 C++ 源文件(hello.C):
以下是dbxtra基本命令: c cont 在斷點后繼續執行 d delete 刪除所設斷點 h help 幫助 e edit 編輯源程序 n next 源程序區的內容向下翻一屏。 p print 顯示變量 q quit 退出dbxtra r run 運行程序,直到遇上設置的斷點 rr rerun 再次運行 s step 單步運行 st stop 設置斷點 j status 顯示當前斷點 t where 顯示當前狀態,列出所有設置的變量值 di display 開顯示窗,用于查看變量 ud undisplay 刪除顯示窗的條目 f forward 源程序區的內容向上 翻一屏。 B backward 源程序區的內容向下 翻一屏。 Stopi stop inst 設置斷點 tracei trace inst跟蹤子程序
首先帶上-g參數編譯 cc -g -o t t.c 啟動調試器 dbxtra t 屏幕顯示: 1.main() 2.{ int i=10 ,*p1; 3. float j=1.5,*p2; 4. p1=& 5. p2=& 6. p2=p1; 7. printf("%d,%d/n",*p1,*p2); 8.} C[browse] File:t.c Func.- Readubg symbolic information Type 'help' for help (dbxtra) (dbxtra)
設置斷點:
(dbxtra)stop at 5 運行: (dbxtra) run 程序自動在第5行停下。 這時我們可以看變量的值。 (dbxtra) print *p1
LD_AOUT_PRELOAD 除了不使用 a.out 二進制格式外,與 LD_PRELOAD 相同。 LD_KEEPDIR 只適用于 a.out 庫;忽略由它們指定的目錄。 LD_LIBRARY_PATH 將其他目錄加入庫搜索路徑。它的內容應該是由冒號 分隔的目錄列表,與可執行文件的 PATH 變量具有相同的格式。 假如調用設置用戶 ID 或者進程 ID 的程序,該變量被忽略。 LD_NOWARN 只適用于 a.out 庫;當改變版本號是,發出警告信息。 LD_PRELOAD 首先裝入用戶定義的庫,使得它們有機會覆蓋或者重新定義標準庫。 使用空格分開多個入口。對于設置用戶 ID 或者進程 ID 的程序, 只有被標記過的庫才被首先裝入。在 /etc/ld.so.perload 中指定 了全局版本號,該文件不遵守這個限制。
4. 使用 dlopen
另外一個強大的庫函數是 dlopen()。該函數將打開一個新庫,并把它裝入內存。該函數主要用來加載庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 服務器利用這個函數在運行過程中加載模塊,這為它提供了額外的能力。一個配置文件控制了加載模塊的過程。這種機制使得在系統中添加或者刪除一個模塊時,都不需要重新編譯了。