linux GDB 简单用法以及例子
生活随笔
收集整理的這篇文章主要介紹了
linux GDB 简单用法以及例子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????? 首先GDB是類unix系統下一個優秀的調試工具, 當然作為debug代碼的工具, 肯定沒有IDE來的直觀了. 不過, 命令行自然有命令行的有點, 當你無法是使用IDE時, gdb有時會幫上很大的忙.
????? 下面用1個例子來說明用法吧:
????? 建立1個目錄testgdb2
???? 1. 編寫c文件test.c
#include <stdio.h> #include <test2.h>int g_i; int func(int n){g_i=1; int sum = 0, i;for (i=1; i<=n; i++){sum+=i;}return sum; }int main(){g_i=0; int i;long result = 0;for (i=1; i<=100; i++){result += i;}printf("result[1-100] =%d\n", result);printf("result[1-250] =%d\n", func(250));printf("result of func2(100) =%d\n", func2(100)); //call func2 in test2.c }
?可以見到在23行,? call 了 test2.c的函數, 而且引用了頭文件 test2.h
?
???? 2. 編寫頭文件 ./headfiles/test2.h
#ifndef __TEST2_H_ #define __TEST2_H_int func2(); #endif
只聲明了1個函數啦
??
?? 3. 編寫c文件test2.c?
#include "test2.h"int func2(int n){int i,sum;for (i=1;i<n;i++){sum+=i;}return sum; }
編寫對應函數的內容啦.
??? 4. 編寫Makefile
這里要注意,? gcc 命令默認編譯出來的可執行文件是不帶調試信息的, 也就是說不能用gdb來調試的.
如果要用gdb來debug程序, 則必須要用-g參數來編譯.
Makefile如下圖(文件名就是Makefile,放在與test.c同1個目錄)
test.o: test.c ./headfiles/test2.hgcc -c -g test.c -I ./headfiles/ -o test.o test2.o: test2.c ./headfiles/test2.hgcc -c -g test2.c -I ./headfiles/ -o test2.o test: test.o test2.ogcc test.o test2.o -o test clean:rm -rf *.o cleanall:rm -rf *.o test
?? ?? 5. 編寫編譯腳本, 并執行編譯.
???? 參照上面Makefile,在同一級目錄編寫編譯腳本mk.mak 如下圖:? ??
并且執行編譯:
可以見到可以調試的執行文件test 被編譯出來了.
?
?
?
?? ?? 6.運行 gdb 來啟動調試模式
????在當前目錄執行gdb, enter
?????
?? ?? 6.1 gdb 命令 file
???????????? file命令用來決定用戶要調試那個執行文件.
??????????????? 輸入file test(file + 執行文件名字)
?
??????? 前提是這個執行文件用gcc編譯時加入了調試信息(-g 參數), 上面提示過的.
也可以開始時執行gdb + 執行文件名+ 參數來直接調試這個執行那個文件
set args 可指定運行時參數。(如:set args 10 20 30 40 50)
show args 命令可以查看設置好的運行參數。
不過我這個簡單例子沒有參數啦~
????? 6.2 gdb 命令 list, 簡寫l
???? list 命令用來查看對應file命令用查看執行程序的源代碼
????? 例如用list 10命令可以查看test.c 第10行附近的代碼
????? 但是執行文件是用test.c 和 test2.c 編譯出來的啊, 如果想查看test2.c的代碼,
???? 則可以用list test2.c:5 ? 來查看test2.c第5行附近的代碼:
????
?? 不過要看代碼的話, 建議還是開兩個窗口, 1個用來調試, 1個用來看代碼啦.
?????? 6.3 gdb 命令 break, 用來設置斷點
????? 執行break test.c:6 之就可以在test.c 上設置這個斷點了.
???? 執行break test2.c:func2 就可以在test2.c 里的 func2定義上設斷點:
?
??? 執行info break, 可以查看已設置的斷點:
可以見到每個斷點都有1個斷點號碼:
可以執行:
?? disable 斷點號碼?? 來禁用斷點
?? delete 斷點號碼??? 來刪除斷點
?
??? ? 6.4 gdb 命令 run, 用于運行調試, 相當IDE debug工具欄那個啟動按鈕啦.? (簡寫r)
????? 執行r, 一般來講,程序就會在你設置的第1個斷點上暫停啦~
?
如上圖, 我執行run后, 程序就跳到第6行的斷點了,? 而且執行到這里時, 實際上程序已經執行了main 函數的一部分代碼, 所以會見到一部分程序輸出的(result[1-100]=5050
????? 6.5 gdb 命令 next, 就是跳到1一步的意思, 相當于IDE debug工具欄的那個Next按鈕啦.(簡寫n)
????? 執行n, 就會跳到第7行了:
???
?
??? ?? 6.6 gdb 命令 print, 就是查看變量的命令, 簡寫p 一般p + 變量名字就ok了
????? 在第7行執行p i, i的值是1個隨機數, 因為i只定義了, 還沒賦值.
???? 跳到第8行,(代表執行完第7行的代碼)
就見到i的值被第7行賦值成1了.
? 6.7 gdb 命令bt , 用于查看函數堆棧
? 執行bt, 如下圖:
?
可以見到當前運行在 test.c的main() -->? test.c的func()里面啦.?
如何查看函數堆棧詳見:
http://blog.csdn.net/azr22005/article/details/6927420
?
?? 6.8 gdb 命令 step, 就是進入的意思, 相當與IDE debug工具欄那個step按鈕啦.
?? 這個太簡單不講解啦
??? 6.9 gdb 命令finish, 就是跳出當前函數的意思, IDE debug工具欄貌似沒有這個按鈕哦. ?? 執行finish..:
? 見到跳出函數func后, 就到了test.c 的22行了,? 是因為在22行call 這個函數func的啊~
順便還把函數的返回值show出來了.
??
?? 6.10 gdb 命令continue, 跳到下1個斷點,? 相當于IDE debug工具欄的continue按鈕啦, 簡寫c
?? 執行 continue..
?
見到了吧. 跳到了斷點2.
再執行1次的花就直接提示程序執行完成了, 因為下面沒有斷點了..
? 6.11 gdb 命令watch , 就是watchpoint的意思啦.
?用法: watch + 變量名,? 這個變量必須是在函數外面定義的, 一般是全局變量啦.? 當這個變量的值發生變化時, 就自動斷點在發生變化的語句.
watch expr
為表達式(變量)expr設置一個觀察點。一量表達式值有變化時,馬上停住程序。
rwatch expr
當表達式(變量)expr被讀時,停住程序。
awatch expr
當表達式(變量)的值被讀或被寫時,停住程序。
info watchpoints
查看觀察點、斷點和捕捉點信息,同info break 一樣.
gdb還有很多高級用法了啊:
詳細可以參考這里啊:
http://witmax.cn/gdb-usage.html
? ?
總結
以上是生活随笔為你收集整理的linux GDB 简单用法以及例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构--折半查找法 详解
- 下一篇: 关于一维数组和二位数组的数组指针