gdb调式程序
gdb調(diào)式程序
標簽: listfileubuntugcc優(yōu)化編譯器 2012-04-09 18:43 2630人閱讀 評論(0) 收藏 舉報 分類: PHP(41) Linux(21)版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
目錄(?)[+]
gdb調(diào)式程序最近要調(diào)試PHP源代碼,使用工具GDB.
1.?GDB簡介
GDB是Linux/Unix下一個GNU調(diào)試程序,是用來調(diào)試C與C++程序的強力調(diào)試器。能夠讓用戶在程序運行時觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存的使用情況。 作用: 1)按照自定義的方式啟動運行需要調(diào)試的程序。 2)可以使用指定位置和條件表達式的方式來設(shè)置斷點。 3)程序暫停時的值的監(jiān)視。 4)動態(tài)改變程序的執(zhí)行環(huán)境。2.??基本操作命令:
這里只介紹常用命令的簡單用法,如需讀者想更加深入的了解,還請讀者參照gdb手冊。也可以使用--help查看。 基本命令列表:
| 命令 | 解釋 | 簡寫 |
| file | 裝入想要調(diào)試的可執(zhí)行文件 | 無 |
| list | 列出產(chǎn)生執(zhí)行文件源代碼的一部分 | l |
| next | 執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部 | n |
| step | 執(zhí)行一行源代碼而且進入函數(shù)內(nèi)部 | s |
| run | 執(zhí)行當前被調(diào)試的程序 | r |
| continue | 繼續(xù)執(zhí)行程序 | c |
| quit | 終止GDB | q |
| 輸出當前指定變量的值 | p | |
| break | 在代碼里設(shè)置斷點 | b |
| info break | 查看設(shè)置斷點的信息 | i b |
| delete | 刪除設(shè)置的斷點 | d |
| watch | 監(jiān)視一個變量的值,一旦值有變化,程序停住 | wa |
| help | GDB中的幫助命令 | h |
3,編程實例
創(chuàng)建c文件:test.c
[cpp] view plaincopyprint?
編譯,其目標文件為test
gcc -o test test.c這個程序執(zhí)行
[cpp] view plaincopyprint?
時顯示如下結(jié)果:
hello 1
hello 2
hello 3
hello 4
hello 5
4 gdb調(diào)試程序
如果需要使用gdb調(diào)試
在編譯test.c的時候,并把調(diào)試選項打開:
[plain] view plaincopyprint?
(調(diào)試選項資料:
調(diào)試選項(DEBUGGING?OPTION)
GNU?CC擁有許多特別選項,既可以調(diào)試用戶的程序,也可以對GCC排錯:?-g?
以操作系統(tǒng)的本地格式(stabs,?COFF,?XCOFF,或DWARF).產(chǎn)生調(diào)試信息.?GDB能夠使用這些調(diào)試信息.?
在大多數(shù)使用stabs格式的系統(tǒng)上,?`-g'選項啟動只有GDB才使用的額外調(diào)試信息;這些信息使GDB?調(diào)試效果更好,但是有可能導致其他調(diào)試器崩潰,或拒絕讀入程序.如果你確定要控制是否生成額外的信息,?使用`-gstabs+',?`-gstabs',?`-gxcoff+',?`-gxcoff',?`-gdwarf+',或`-gdwarf'?(見下文).?
和大多數(shù)C編譯器不同,?GNU?CC允許結(jié)合使用`-g'和`-O'選項.優(yōu)化的代碼偶爾制造?一些驚異的結(jié)果:某些聲明過的變量根本不存在;控制流程直接跑到?jīng)]有預料到的地方;某些語句因為計算結(jié)果是常量或已經(jīng)確定而?沒有執(zhí)行;某些語句在其他地方執(zhí)行,因為他們被移到循環(huán)外面了.?
然而它證明了調(diào)試優(yōu)化的輸出是可能的.對可能含有錯誤的程序使用優(yōu)化器是合理的.?
如果GNU?CC支持輸出多種調(diào)試信息,下面的選項則非常有用.?
-ggdb?
以本地格式(如果支持)輸出調(diào)試信息,盡可能包括GDB擴展.?
)
1)啟動
2)載入文件:file命令
file test
結(jié)果:
[plain] view plaincopyprint?
也可以通過直接啟動的方式載入文件:
[plain] view plaincopyprint?
3)list命令
也可以過回車查看源代碼
[cpp] view plaincopyprint?
一次只列10行,如果要從11行開始繼續(xù)列源代碼可以輸入
(gdb) list也可以什么都不輸直接敲回車,gdb提供了一個很方便的功能,在提示符下直接敲回車表示用適當?shù)膮?shù)重復上一條命令。
回車:[cpp] view plaincopyprint?
4)單步逐條執(zhí)行 next
首先用start命令開始執(zhí)行程序:
[plain] view plaincopyprint?
我們可以用next命令(簡寫為n)控制這些語句一條一條地執(zhí)行:
[plain] view plaincopyprint?
5)逐條執(zhí)行并進入函數(shù):
用start命令重新來過,step命令(簡寫為s)進入 函數(shù)中去執(zhí)行:
[plain] view plaincopyprint?
在函數(shù)中有幾種查看狀態(tài)的辦法,backtrace命令(簡寫為bt)可以查看函數(shù)調(diào)用的棧幀:
[plain] view plaincopyprint?
6)在可以用info命令(簡寫為i)查看局部變量
[plain] view plaincopyprint?
如果想查看main函數(shù)當前局部變量的值也可以做到,先用frame命令(簡寫為f)選擇1號棧幀然后再查看局部變量:
[plain] view plaincopyprint?
7)輸出當前指定變量的值 print
[plain] view plaincopyprint?
總結(jié)
- 上一篇: 装水体积c语言,C语言基础之--size
- 下一篇: soapui工具_自动化测试需知的4项测