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