Linux下GDB除錯工具

2021-08-18 01:40:33 字數 1605 閱讀 1725

1.常用的除錯**的方法:

不管你使用哪種方法除錯**,都需要有足夠的耐性

方法一:在**中加入列印語句--》在關鍵語句的前後(函式呼叫),關鍵變數

方法二:使用gdb除錯(原理也是讓程式分步執行,列印關鍵變數的值)

(1)使用gdb在編譯程式的時候必須加上-g選項(將程式的除錯資訊新增到生成的可執行程式中)

gcc mytree.c  -o  mytree   -g

(2)開始除錯

gdb 程式的名字

(3)常用的gdb除錯命令

不管你使用哪種除錯方法:首先要做的事情是縮小錯誤的範圍

一:列印**內容

l         預設列舉原始碼的前面10行

l  1,20   列舉前面1到20行

二:設定斷點(可以設定多個斷點)

b  行號              程式等會執行到斷點所在的行就停下來

info b               幫助你檢視目前所有的斷點資訊

d  斷點的序號        取消斷點

三:單步執行程式ns 

區別:遇到自定義的函式呼叫

n 一下子直接執行完,退出函式

s 進入函式**中,一行行執行 

n不會進入函式內部一行行去單步除錯,s會   

四:列印變數值

p  變數的名字

五:繼續執行程式

c六:執行程式

r          //不帶引數

r  引數   //帶引數執行

如果以上無法確定錯誤**,而且錯誤是段錯誤segmentatin fault(就是你的程式訪問了非法的記憶體,比如使用了野指標)

可以讓 gdb 幫我們直接定位出現段錯誤的地方。

a) 使用 -g 編譯待除錯**

b) 去掉系統對core檔案的大小限制: ulimit -c unlimited

c) 重新讓程式死一遍,產生乙個core檔案

d) 使用 gdb 來直接定位: gdb ./example  core  (注意:不是100%能解決問題,看運氣)

2.3 如果發生的不是段錯誤,或者用以上辦法,gdb無法直接定位段錯誤的位置,那就只能單步除錯

gdb 可供使用的常用命令:

> list/l/l 10/l 2,30 (列出當前正在除錯的**)

> breakpoint/b 20 (在第20行設定了乙個斷點)

> b 20 if i>=100 (在第20行設定了乙個條件斷點)

> b somefunction (在函式somefunction設定了乙個斷點)

> run/r/r 123 abc (啟動程式開始執行,可以帶參)

> print i/p i  (檢視變數i當前的值)

> display i  (持續跟蹤變數 i 變化)

> backtrace full/bt full  (檢視當前棧記憶體的詳細細節)

> whatis i (檢視變數i的型別)

> next/n (單步執行:函式呼叫將會被當做一步)

> step/s (單步執行:將會進入函式呼叫內部) 

> continue/c (繼續執行**,直到遇到下乙個斷點,或者程式退出)

> quit/q  (退出偵錯程式gdb)

Linux下C C 除錯工具GDB

例項除錯程式 main.c include int add range int low,int high int main void 以上函式add range功能為從low加到high,基本除錯步驟 1.編譯 gcc g main.c o main 2.除錯 gdb main 3.幫助 gdb h...

linux除錯工具GDB

gdb偵錯程式除錯的物件是可執行檔案,使用gcc或者g 編譯器編譯源 時,必須加上 g才能使目標可執行檔案包含可被除錯的資訊。比如 gcc g o helloworld helloworld.c 編譯並連線程式,使之包含可被除錯資訊 gdb helloworld 使用gdb偵錯程式開啟hellowo...

linux下的程式除錯工具gdb

這裡只列舉最最常用的gdb命令。gdb program 準備除錯程式。也可以直接進入gdb,再通過file命令載入。run args 開始執行程式,run後面可以加程式需要的引數,就像在命令列正常執行時那樣。s n si c kill s即step in,進入下一行 執行 n即step next,執...