下面是從無到有使用gdb的乙個過程:
// 檢視程序
root@c650-
253:
/root> ps -a
pid tty time cmd
583 ttys0 00:00
:00 login
595 ttys0 00:00
:00 sh
687 ttys0 00:00
:00 sh
730 ttys0 00:33
:50 ***
772 ttys0 00:20
:53 ***x
800 ttys0 00:23
:35 ***x
801 ttys0 00:33
:10 ***
802 ttys0 00:52
:03 ***
803 ttys0 00:26
:32 xx
804 ttys0 00:28
:54 ***
805 ttys0 01:08
:06 xx
806 ttys0 00:36
:27 ***
807 ttys0 00:28
:14 xx
808 ttys0 00:24
:39 ***
811 ttys0 00:50
:16 ***
812 ttys0 02:01
:47 ***
815 ttys0 00:44
:19 ***
818 ttys0 00:41
:35 ***
823 ttys0 00:33
:48 xx
26894 ttys0 00:00
:00 ps
// 進入gdb的同時,繫結程序
root@c650
-253
:/root> gdb -p 823
gnugdb
(gdb
)7.10.1(
c)2015 free software foundation, inc.
license gplv3+
:gnu
gpl version 3 or later >
this is free software: you are free to chang...
...
-進入gdb後,通過設斷點來掌握程式執**況:(b 後面跟函式名);
設定斷點後,當程式執行到 這個斷點的時候,就會停在這個位置;方便後續除錯。
剛開始的時候,可以只打乙個斷點,從這個斷點開始,往後面除錯;以後熟悉了,可以設定多個斷點,在多個斷點之間跳轉,會更方便一些。
// b 是break的縮寫
(gdb) b show_general_switch_nmo_get_many_obj
breakpoint 1 at 0xaea06424
: file /processor.c, line 54.
(gdb)
//檢視斷點資訊
(gdb) info b
//刪除斷點
(gdb) del + 斷點序號
當使用gdb繫結該程序後,該程序就處於掛起狀態,該程序上的一切操作都無法進行,所以當你希望程序動起來的時候,就需要敲c命令,也是continue的縮寫;
// 當你執行c命令後,就需要去啟動你的程式或者**段
(gdb) c
continuing.
啟動程式的方式有很多,比如命令列、函式呼叫等。
// 當啟動你的程式後,並且程式能執行到斷點位置時,就會在斷點處停住;
(gdb) c
continuing.
breakpoint 1
,show_general_switch_nmo_get_many_obj
(buf_mgr=
0xae9f28e0
, context=
0xae9f2968
) at /processor.c:
5454
/processor.c:
(gdb)
斷點停在該函式後,可以看到該函式位於的檔案位置、以及當前處於的行數的資訊;便於除錯;
除錯一般用到的都是 n命令、p命令、s命令等;
p:print 列印變數值;
// next命令,執行下一行,可以看到前面行號發生變化
(gdb) n
56in
/processor.
c(gdb) n
57in
/processor.
c(gdb) n
58in
/processor.
c(gdb)
// step命令
(gdb) n
79in
/processor.
c(gdb) s
show_general_switch_get_first
(breakpoint=
0x0, cookie=
0xae9f28a4
)312
312(gdb)
// print命令
(gdb) n
341in
c(gdb) p cookie$1=
(uint32*)
0xae9f28a4
(gdb) p *cookie$2=
0(gdb)
此時,需要對照本地**去除錯。看程式執行的乙個邏輯,以及檢視程式執行過程中的變數值,還可以隨意更改變數的值,來達到控制程式的乙個效果;
好了,以上就是怎麼從無到有開始除錯你的程式,接下來就是一些除錯會用到的除錯命令整理:
命令功能r
run, 直接調到斷點處,沒有設定斷點的話直接執行程式
b fun
設定乙個斷點breakpoint在函式」fun」的最開始
b n在當前執行原始檔的第n行設定斷點
b file.c:n
在當前原始檔file.c的第n行設定斷點
d n刪掉delete第n行的斷點
info break
顯示所有斷點資訊
c繼續(continue)執行程式,一直到下乙個斷點或程式結束
f執行直到當前函式(function)結束
s按step除錯1行,會進入函式體
s n按step除錯接下來的n行
n除錯1行,與按s命令不同的是此處不進入函式體
p var
輸出(print)變數」var」的值
set var=val
設定變數」var」的值
bt列印呼叫堆疊(stack trace)
q退出gdb
x命令是直接檢視指定位址為開頭的記憶體裡的內容;
參考文章1
參考文章2
gdb的使用指南(上)
本文將介紹gdb的最基本的使用方法,其中的難點 多執行緒除錯 堆疊資訊分析和core檔案分析將放在下一節來講述。gcc是linux系統 windows系統的cygwin下最常使用的c語言編譯器。gcc g 源 檔名如果追加了 g編譯選項,會在最後生成的可執行檔案中嵌入一些用於捕捉和輸出程式當前程式執...
Ubuntu apt 使用指南
起初gnu linux系統中只有.tar.gz。使用者必須自己編譯他們想使用的每乙個程式。在debian出現之後,人們認為有必要在系統中新增 一種機制用來管理安裝在計算機上的軟體包。人們將這套系統稱為dpkg。至此著名的 package 首次在gnu linux上出現。不久之後紅帽子也 開始著手建立...
CImageList使用指南
1.綜述 在mfc 中cimagelist 類封裝了 影象列表控制項的功能,影象列表是乙個具有相同大小的 影象 可以是不同 型別 的集合,其主要用於 應用程式中大規模 圖示的儲存。該控制項是不可 見的,通常與其它如 clistbox ccombobox ccomboboxex ctabctrl 以及...