偵錯程式gdb
一、 linux 下的gdb(gnu debugger)是乙個用來除錯c、c++程式的功能強大的偵錯程式,它能夠在程式執行的過程中觀察程式的內部結構和記憶體的使用情況。程式設計師也可以使用gdb來跟蹤程式中的錯誤,從而減少了程式設計師的工作量。核心偵錯程式(kgdb)
程式錯誤的分類:1.編譯時的錯誤(語法錯誤)
2.執行時的錯誤(記憶體錯誤/邏輯錯誤)
二、gdb的功能:1.執行程式
2.設定斷點
3.檢視變數值
三、gdb的使用:例如對hello.c進行除錯
gcc -g hello.c -o hello
gdb hello
在gcc編譯時必須加上-g或者直接-ggdb
四、gdb常用的命令
1.執行指令
run(簡寫r): 執行程式,當遇到斷點後,程式會在斷點處停止執行,等待使用者輸入下一步命令
continue(簡寫c) : 繼續執行,到下乙個斷點停止(或執行結束)
next(簡寫n) : 單步跟蹤程式,當遇到函式呼叫時,也不進入此函式體;此命令同 step 的主要區別是,step 遇到使用者自定義的函式,將步進到函式中去執行,而 next 則直接呼叫函式,不會進入到函式體內。
step (簡寫s):單步除錯如果有函式呼叫,則進入函式;與命令n不同,n是不進入呼叫的函式的
until(簡寫u):當你厭倦了在乙個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。
until+行號:執行至某行,不僅僅用來跳出迴圈
finish:執行程式,直到當前函式完成返回,並列印函式返回時的堆疊位址和返回值及引數值等資訊。
call 函式(引數):呼叫程式中可見的函式,並傳遞「引數」,如:call gdb_test(55)
quit(簡寫q) : 退出gdb
2.設定斷點
break n (簡寫b n):在第n行處設定斷點(可以帶上**路徑和**名稱:b oagupdate.cpp:578)
b fn1 if a>b:條件斷點設定
break func(break縮寫為b):在函式func()的入口處設定斷點,如:break cb_button
delete 斷點號n:刪除第n個斷點
disable 斷點號n:暫停第n個斷點
enable 斷點號n:開啟第n個斷點
clear 行號n:清除第n行的斷點
info b (info breakpoints) :顯示當前程式的斷點設定情況
delete breakpoints:清除所有斷點:
3.檢視源**
list :簡記為 l ,其作用就是列出程式的源**,預設每次顯示10行。
list 行號:將顯示當前檔案以「行號」為中心的前後10行**,如:list 12
list 函式名:將顯示「函式名」所在函式的源**,如:list main
list :不帶引數,將接著上一次 list 命令的,輸出下邊的內容。
4.列印表示式
print 表示式(簡記p): 其中「表示式」可以是任何當前正在被測試程式的有效表示式,比如當前正在除錯c語言的程式,那麼「表示式」可以是任何c語言的有效表示式,包括數字,變數甚至是函式呼叫。
print a:將顯示整數 a 的值
print ++a:將把 a 中的值加1,並顯示出來
print name:將顯示字串 name 的值
print gdb_test(22):將以整數22作為引數呼叫 gdb_test() 函式
print gdb_test(a):將以變數 a 作為引數呼叫 gdb_test() 函式
display 表示式:在單步執行時將非常有用,使用display命令設定乙個表示式後,它將在每次單步進行指令後,緊接著輸出被設定的表示式及值。如:display a
watch 表示式:設定乙個監視點,一旦被監視的「表示式」的值改變,gdb將強行終止正在被除錯的程式。如:watch a
whatis :查詢變數或函式
info function:查詢函式
擴充套件info locals:顯示當前堆疊頁的所有變數
5.查詢執行資訊
where/bt :當前執行的堆疊列表;
bt backtrace 顯示當前呼叫堆疊
up/down 改變堆疊顯示的深度
set args 引數:指定執行時的引數
show args:檢視設定好的引數
info program:來檢視程式的是否在執行,程序號,被暫停的原因。
gdb -tui +(可執行程式)直接進入tui圖形化除錯介面
layout:用於分割視窗,可以一邊檢視**,一邊測試;
layout src:顯示源**視窗;
layout asm:顯示反彙編視窗;
layout regs:顯示源**/反彙編和cpu暫存器視窗;
layout split:顯示源**和反彙編視窗;
工程管理器make
一、在編譯單個.c檔案時,可以gcc hello.c -o hello
編譯多個在同一目錄下的檔案時可以 *.c,實現自動編譯,根據makefile檔案內容進行。
在開發乙個系統時,一般是將乙個系統分成幾個模組,這樣做提高了系統的可維護性,但由於各個模組間不可避免存在關聯,所以當乙個模組改動後,其他模 塊也許會有所更新,當然對小系統來說,手工編譯連線是沒問題,但是如果是乙個大系統,存在很多個模組,那麼手工編譯的方法就不適用了。為此,在linux系統中,專門提供了乙個make命令來自動維護目標檔案,與手工編譯和連線相比,make命令的優點在於他只更新修改過的檔案(在linux中,乙個檔案被建立或更新後有乙個最後修改時間,make命令就是通過這個最後修改時間來判斷此檔案是否被修改),而對沒修改的檔案則置之不理,並且make命令不會漏掉乙個需要更新的檔案。檔案和檔案間或模組或模組間有可能存在倚賴關係,make命令也是依據這種依賴關係來進行維護的,所以我們有必要了解什麼是依賴關係。
二、makefile(進行批處理的指令碼檔案)語法:目標、依賴、命令。
目標:依賴
(按tab)命令
#乙個簡單的makefile
prog:prog1.o prog2.o //prog目標依賴prog1.o和prog2.o
gcc prog1.o prog2.o -o prog 和prog2.o生成prog
prog1.o:prog1.c lib.h 依賴 prog1.c lib.h
gcc -c -i. -o prog1.o prog1.c
prog2.o:prog2.c
gcc -c prog2.c
以上mamefile中定義了三個目標:prog、prog1和prog2,冒號後是依賴檔案列表,中間用乙個冒號隔開;對於第乙個目標檔案prog來說,他有兩個依賴檔案:prog1.o和prog2.o,任何乙個依賴檔案更新,prog也要隨之更新,命令gcc prog1.o prog2.o -o prog是生成prog的命令。make檢查目標是否需要更新時採用遞迴的方法,遞迴從底層向上對過時目標進行更新,只有當乙個目標所依賴的所有目標都為最新時,這個目標才會被更新。 以上面的makefile為例,我們修改了prog2.c,執行make時,由於目標prog依賴prog1.o和prog2.o,所以要先檢查 prog1.o和prog2.o是否過時,目標prog1.o依賴prog1.c和lib.h,由於我們並沒修改這兩個檔案,所以他們都沒有過期,接下來,再檢查目標prog2.o,他依賴prog2.c,由於我們修改了prog2.c,所以prog2.c比目標檔案prog2.o要新,即prog2.o過 期,而導致了依賴prog2.o的所有目標都過時;這樣make會先更新prog2.o再更新prog。
執行順序:自上而下,當你的目標依賴是乙個目標是,會先跳轉到該目標去執行相關命令。
make+目標名 以該目標開始自上而下執行。
三、自動編譯
1.根據makefile檔案內容進行自動編譯
2.根據makefile檔案的時間戳來判斷檔案是否需要編譯。
偽目標:執行命令,不生成對應檔案
·phony:clean
為什麼將. c 檔案先編譯生成 .o 檔案,再由 .o 檔案生成可執行檔案?
前提:原始檔到可執行檔案有四步:預處理,編譯,彙編,鏈結。
功能目錄管理軟體**makefile
總控makefile:進入各個功能目錄執行make,並將所有 .o檔案鏈結成可執行檔案(第二步)
功能目錄makefile:將功能目錄下的原始檔編譯生成目標檔案.o(第三步)
scripts目錄 標頭檔案makefile定義變數供其他makefile使用(第一步)
gdb使用初步
首先,你的程式在經由gcc g 編譯的時候,要帶上 g選項。比如 g test.cpp g o test 然後,執行 gdb test 進入gdb介面之後,輸入start並回車,則除錯開始。如果被除錯的程式需要引數,則在start後面帶引數 以下是常用命令 help display help.you...
make和gdb的簡單應用
a 以下是本次實驗的內容一 例項檔案有六個原始檔 和六個標頭檔案 分別是 func1.c func2.c func3.c func4.c func5.c main.c head1.h head2.h head3.h head4.h head5.h head.h 編寫makefile檔案,要求實現 執...
gdb偵錯程式與make工程管理器
gdb偵錯程式 gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具,gdb主要可幫助工程師完成下面4個方面的功能 1.啟動程式,可以按照工程師自定義的要求隨心所欲的執行程式。2.讓被除錯的程式在工程師指定的斷點處停住,斷點可以是條件表示式。3.當程式被停住時,可以檢查此時程式中所發生的事...