天天看點

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試
前言

GDB是Linux下非常好用且強大的調試工具。GDB可以調試C、C++、Go、java、 objective-c、PHP等語言。對于一名Linux下工作的c/c++程式員,GDB是必不可少的工具,本篇以C語言來調試。

GDB簡介

UNIX及UNIX-like下的調試工具。雖然它是指令行模式的調試工具,但是它的功能強大到你無法想象,能夠讓使用者在程式運作時觀察程式的内部結構和記憶體的使用情況。

一般來說,GDB主要幫助你完成下面四個方面的功能:

1
           
基本指令的操作

GDB中的指令很多,但我們隻需掌握其中十個左右的指令,就大緻可以完成日常的基本的程式調試工作。

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

gdb指令擁有較多内部指令。在gdb指令提示符“(gdb)”下輸入“help”可以檢視所有内部指令及使用說明。

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試
判斷檔案是否帶有調試資訊

要調試C/C++的程式,首先在編譯時,要使用gdb調試程式,在使用gcc編譯源代碼時必須加上“-g”參數。保留調試資訊,否則不能使用GDB進行調試。

有一種情況,有一個編譯好的二進制檔案,你不确定是不是帶有-g參數,帶有GDB調試,這個時候你可以使用如下的指令驗證:

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

如果沒有調試資訊,則會出現:

Reading symbols from /home/minger/share/tencent/gdb/main…(no debugging symbols found)…done.
           

/home/minger/share/tencent/gdb/main是程式的路徑。

如果帶有調試功能,下面會提示:

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試
Reading 
           

說明可以進行GDB調試。

還有使用指令readlef檢視可執行檔案是否帶有調試功能

readelf -S main|grep debug
           
c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

如果有debug說明有調試功能,如果沒有debug。說明沒有帶有調試功能,則不能被調試。

開始進入正題,GDB啟動調試。

調試方式啟動運作無參程式

以下是linux下GDB調試的一個執行個體,先給出一個示例用的小程式,C語言代碼:

main.c

#include 
           

編譯:

gcc 
           

下面“gdb”指令啟動GDB,将首先顯示GDB說明,不管它:

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

上面最後一行“(gdb)”為GDB内部指令引導符,等待使用者輸入GDB指令。

下面使用“file”指令載入被調試程式 main(這裡的 main 即前面gcc 編譯輸出的可執行檔案):

如果最後一行提示Reading symbols from /home/minger/share/tencent/gdb/main…done. 表示已經加載成功。

下面使用“r”指令執行(Run)被調試檔案,因為尚未設定任何斷點,将直接執行到程式結束:

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試
調試啟動帶參程式

假設有以下程式,啟動時需要帶參數:

#include 
           

編譯:

gcc 
           

這種情況如何啟動調試呢?隻需要r的時候帶上參數即可。

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試
調試core檔案

Core Dump:Core的意思是記憶體,Dump的意思是扔出來,堆出來(段錯誤)。開發和使用Unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示(有時候會提示core dumped),這時候可以檢視一下有沒有形如core.程序号的檔案生成,這個檔案便是作業系統把程式down掉時的記憶體内容扔出來生成的, 它可以做為調試程式的參考,能夠很大程式幫助我們定位問題。那怎麼生成Core檔案呢?

生成Core方法

産生coredump的條件,首先需要确認目前會話的ulimit –c,若為0,則不會産生對應的coredump,需要進行修改和設定。

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

即便程式core dump了也不會有core檔案留下。我們需要讓core檔案能夠産生,設定core大小為無限:

ulimit 
           
c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試
更改core dump生成路徑

因為core dump預設會生成在程式的工作目錄,但是有些程式存在切換目錄的情況,導緻core dump生成的路徑沒有規律,

是以最好是自己建立一個檔案夾,存放生成的core檔案。

我建立一個 /data/coredump 檔案夾,在根目錄data裡的coredump檔案夾。

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

調用如下指令:

echo 
           

将更改core檔案生成路徑,自動放在這個/data/coredump檔案夾裡。

%e表示程式名, %p表示程序id

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

測試代碼:

/*
           

編譯運作:

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

運作後結果顯示段錯誤,該程式在主函數内部scanf的時候回崩潰,i前面應該加上&。

這個時候,進入/data/coredump檔案夾可以檢視生成的core

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

然後用gdb調試該core,指令為 gdb core.test.3591 ,顯示如下

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

program terminated with signal 11 告訴我們信号中斷了我們的程式,發生了段錯誤。

這個時候可以敲指令 backtrace(bt) 檢視函數的調用的棧幀和層級關系。

這個一堆問号很多人遇到過,網上有些人說是沒加載符号表,有人說是标準glibc版本不一緻,不糾結這個問題。

可以通過如下指令調試:

gdb 
           

gdb 可執行程式

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

進入gdb環境後,core-file core的名字

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

敲bt指令,這是gdb檢視back trace的指令,檢視函數的調用的棧幀和層級關系。

c# 路徑下的最近檔案夾_Linux下如何使用gdb啟動調試

可以看到最近的棧中存儲的是調用了IO操作,可以看到main函數的26行出錯。

到此為止,就是core檔案配置生成和調試方法。

總結

至此,我們GDB啟動調試方式完畢,和core檔案配置生成和調試方法。後續接着講斷點設定、單步調試等。本人能力有限,歡迎留言補充。

歡迎關注微信公衆号“

程式猿編碼

” ,這裡Linux c/c++ 、Python、Go語言、資料結構與算法、網絡程式設計相關知識,常用的程式員工具。每日00:10之前更新新聞簡報,一份簡報,縱覽天下事!