《gdb除錯之實用技巧篇》

2021-06-27 23:55:44 字數 2536 閱讀 3146

gdb可以用來除錯程序發生錯誤時產生的coredump檔案,那麼coredump檔案是怎麼產生,以及生成在**呢?為什麼很多時候我們找不到coredump檔案呢?這主要有兩個原因:

首先使用ulimit -a檢視核心轉儲功能是否被關閉,如果core_file_size被設定為0則表示該功能被關閉。這時可以用ulimit -c命令設定core_file_size為非0值來開啟的該功能。

核心轉儲檔案生成路徑和檔名取決於核心引數kernel.core_pattern和kernel.core_uses_pid。我們也可以通過這兩個核心引數來查詢和設定核心轉儲的路徑和檔名。具體的設定方式有兩種,如下圖所示:

核心引數core_pattern,指定的實際上是核心轉儲檔案的全路徑名(包括路徑和檔名)。例如/var/core/core表示在/var/core/路徑下生成名為core的核心轉儲檔案。如果只設定了檔名,例如上圖中core_pattern=core的情況,則表示在可執行檔案所在目錄生成檔名為core的核心轉儲檔案。

核心引數core_uses_pid表示是否在生成的核心轉儲檔案後新增程序號字尾,1表示新增,0表示不新增。實際上,我們也可以將core_uses_pid設定為0,而直接在core_pattern裡通過格式符來設定,具體的格式符較多,建議自行查閱。

需要說明的是,這種方式只是臨時生效,當計算機重啟之後則會恢復/etc/sysctl.conf中的設定或系統預設設定。因此如果希望每次重啟計算機都能夠生效,則可以通過修改/etc/sysctl.conf檔案實現。例如在檔案中增加如下兩行設定:

kernel.core_pattern=/var/core/core.%p

kernel.core_uses_pid=0

在基礎篇裡曾列出了gdb的常用內部命令,實際使用時候還是有很多技巧的。這裡針對部分常用內部命令做進一步的說明:

gdb可執行檔案

gdb –args可執行檔案arguments

gdb可執行檔案coredump檔案

gdb –c coredump檔案可執行檔案

gdb可執行檔案程序pid

上面列出了多種啟動方式,大致還是分為3類,除錯可執行檔案,coredump檔案和正在執行的程序。

斷點的設定:

break/b 函式名/行號/檔名:行號/檔名:函式名/+偏移量/-偏移量/*位址

條件斷點的設定:

break 斷點if條件

condition 斷點編號條件

除錯可執行檔案時才有可能需要指定引數,引數即可以在啟動gdb時指定,也可以在開始除錯時指定:

run/r 引數

backtrace/bt [ [full] n/-n]

說明:指定full時除了顯示棧幀,還會顯示區域性變數。n和-n分別表示開頭和最後n個棧幀。

顯示暫存器:inforeg

說明:顯示暫存器時,可以看到乙個eip暫存器,那就是程式指標。x命令可用格式為i,表示以組合語言顯示。那麼我要顯示從程式指標指向位址開始的10條指令就可以用一下命令:

x/10i $eip

p/格式變數

說明:這裡的重點在格式符,x,d,u,o,t,a,c,f,s分別表示十六進製制,十進位制,無符號十進位制,八進位制,二進位制,位址,字元,浮點小數,字串。

set  variable  變數=值

next/n n:單步執行n步,不進入函式呼叫

step/s n:單步執行n步,進入函式呼叫

continue/c n:繼續執行,n次遇到斷點不停止,相當於連續執行n次continue

finish/fin:執行到當前函式的結束

clear 函式名/行號/檔名:行號/檔名:函式名

delete [breakpoints]斷點編號

disable [breakpoints] [斷點編號]

enable [breakpoints] [once/delete] [斷點編號]

說明:disable和enable命令,不指定斷點編號是會對所有斷點起作用,once表示只啟用一次,delete表示啟用一次後刪除該斷點

commands 斷點編號

命令……

end

說明:這個功能非常適合在設定的斷點處列印變數的值或者檢視棧幀。

watch 表示式:表示式發生變化時,暫停執行

rwatch 表示式:表示式被訪問時,暫停執行

awatch 表示式:表示式發生變化或者被訪問時,暫停執行

在gdb除錯過程中,可以使用generate-core-file子命令生成核心轉儲檔案。我們也可以直接使用gcore命令對正在執行的程序直接生成核心轉儲檔案:

gcore pid

除了在啟動gdb時直接指定程序號,我們還可以在啟動gdb之後,使用內部命令attach進行程序繫結。這非常適用於已經出現問題無法正常結束的程序。除錯結束是可以使用detach命令釋放程序。

MySQL 實用技巧篇

mysql float型別查詢 字段 id float 7,4 當id 3.0000時我可以select from table where id 3或者select from table where id 3.0000查出來 而當id 3.1000時用select from table where ...

實用技巧Web篇(3)

3 雙表頭固定的資料列表中,滾動條同步移動的實現 l問題 web中單表頭固定的資料列表使用比較多,其滾動條移動的實現很簡單,只要使用標記,設定其的樣式就可以了。但有時也需要使用雙表頭固定的資料列表,典型的例子就是人員的日程安排。l解決方法 分別用三個標記包含上表頭 topheader 左表頭 lef...

AutoCAD實用技巧基礎篇

autocad 實用技巧基礎篇 課 程描述 薑軍 女 實驗師,主要從事cad cam技術 機 械製造等方面的科研和實驗教學工作,具有多年實踐教學經驗,參編出版多部相關專業書籍。主要作品有 autocad 2008 中文版應用基礎 第2版 autocad 2008中文版機械製圖應用與例項教程 auto...