讀書筆記
1 預處理in.c out.i
gcc–E b.c –o b.i //讓程序在預處理結束後停止編譯過程 –E
2編譯 in.i out.s
gcc–S b.i –o b.s
3.彙編 in.s out.o
gcc–c b.s –o b.o
4鏈接 輸入爲.o和其他的代碼文件和庫文件
gccb.o –o b
輸出b就是一個可執行文件
如何使用GDB
首先編譯時候要加入調試信息,用命令
gcc–g b.c –o b、、、、-g、-ggdb、-g3和-ggdb3
打開gdb調試 b
命令:gdb b
運行:run 會顯示錯誤在那裏
回溯:backtrace(bt)顯示具體錯誤信息
顯示錯誤代碼 frame n
設置斷點 break(b)
break<function>在進入指定函數時停住
break<linenum> 在指定行號前停住
break+-offset 在當前行號的前面(+)offset處停住 (-)後
break if(condition)在什麼條件下停住
break沒有參數代表在下一條指令處停住
breakfilename:function/linenum在源文件filename的。。。處停住
break*address在程序運行的內存處停止
delete 1 刪除斷點 1是斷點的序號
break後面跟的那些參數很多其他的命令 比如list jump都可以用
watch i 變量i值有變化就停止
運行run(r)終止kill
單步進入函數step(s)
單步不進入函數next
print(查看運行時數據,print和$符號使用,以及輸出格式)
print<expr> print/<fmt> <expr>
printa; print $;print $$;print $n
print/aa 顯示十六進制格式的a (Xduotacf)
print還可以賦值print a=100;
display 自動顯示命令
display<expr> display/<fmt><expr> display/<fmt><addr>
expr是一個表達式 fmt顯示格式 addr表示內存地址
undisplay<dnums> delete display<dnums> 刪除顯示
disabledisplay<dnums> enable display<dnums> 失效或者恢復顯示 info display 顯示序號信息及是否有效等信息
顯示的每一個變量都會加一個序號dnum,對dnum操作即可實現刪除或者失效否
display/i $pc $pc 是gdb環境變量,就是指令的地址,/i表示顯示機器碼,也即是彙編代碼。停止時會顯示機器碼和代碼對應情形。
examine(x)查看內存
x/<n/f/u><addr> fu是參數可以獨立或者聯合使用,n正整數表示顯示幾個內存的內容 ;f格式,支持s,i格式;u字節數,bhwg分別表示1248個字節
set命令很強大
info
list(顯示代碼)
quit(退出gdb)
watchbachtrace frame n examine signal return call make shell//這兩個需要系統支持(我的是在win7下mingw不可以,沒裝mnys)