個人博客:www.while0.comshell
個人博客:www.shishangguan.net函數
GDB調試:ui
-g 生成的可執行文件才能夠用gdb調試 (建議在發行版中用strip filename 來把這些調試信息去除)spa
開始調試。.net
如下是基礎調試命令:調試
help (class) 來獲取幫助ip
list 或者l 來獲取源代碼get
list n來獲取某一行的代碼博客
list fucname 來獲取某個函數的代碼編譯
start (從新)開始執行程序
next(s) 逐行執行
step(s) 單步進入
bt(backtrace) 查看函數調用的棧陣和實參
f(frame) num 能夠在函數間切換,num是棧幀號,由bt命令能夠查看。
i(info) locals 查看當站棧幀函數的局部變量。
p(print) 打印一個變量的值
finish 結束當前函數運行並返回
set var x=y 設置x的值爲y,y的值能夠爲變量或者數字
q(quiet) 退出調試
如下是斷點調試命令:
display 每一步都顯示一個變量的值
undisplay n 取消顯示一個變量的值。n是那個顯示值的編號。
b(break) n (表達式) 在第n行設置一個斷點,若是表達式不爲空,則只有知足表達式時斷點纔會停住
b(break) funcname 在函數funcname的第一行設置斷點
c(continue) 運行到下一個斷點。
i(info) breakpoints 顯示全部斷點
delete breakpoints n 刪除編號爲n的斷點,不指定n的話則是所有刪除
disable breakpoints n 暫時禁用編號爲n的斷點
enable n 恢復禁用的編號爲n的斷點
run 從頭開始連續運行程序,只有遇到斷點纔會中止執行。
如下是觀察點命令:
watch varname 觀察一個變量名爲varname的變量,若是該變量發生變化,就給出舊值和新值,若是不變化,則
i(info) watchpoints 查看已經設置的觀察點
若是調試彙編語言,只能經過加斷點,查看寄存器值的方法以下:
info registers的用法:
i(info) r(registers) #顯示通用寄存器和段寄存器的值
i(info) r(registers) # 查看全部寄存器(包括浮點、多媒體)
i(info) r(registers) esp #顯示指定寄存器的值
print的用法:
x的用法:
更詳細的用法能夠在gdb中輸入 gdb x來查看。
注意:GDB能夠執行shell命令,如要執行清屏命令 能夠用 (gdb) shell clean便可。。
預處理
gcc -E hello.c -o hello.i 此處若是不用-o指定輸出文件,則只會在屏幕顯示輸出結果
編譯
gcc –S hello.i –o hello.s 必須指定輸出文件。生成彙編代碼
彙編
gcc -c hello.s -o hello.o 把彙編代碼編譯成機器碼,但系統函數等還須要從新定位
鏈接
gcc hello.o –o hello.exe 不須要加選項
編譯時給文件定義宏
-D
編譯時取消宏
-U
若是要縮小文件體積,能夠用strip來去掉符號表等調試信息。能夠用file來查看是否stripped。