溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux系統(tǒng)下常用的調(diào)試工具有哪些

發(fā)布時(shí)間:2022-01-24 14:17:39 來(lái)源:億速云 閱讀:218 作者:清風(fēng) 欄目:開(kāi)發(fā)技術(shù)

本文將為大家詳細(xì)介紹“Linux系統(tǒng)下常用的調(diào)試工具有哪些”,內(nèi)容步驟清晰詳細(xì),細(xì)節(jié)處理妥當(dāng),而小編每天都會(huì)更新不同的知識(shí)點(diǎn),希望這篇“Linux系統(tǒng)下常用的調(diào)試工具有哪些”能夠給你意想不到的收獲,請(qǐng)大家跟著小編的思路慢慢深入,具體內(nèi)容如下,一起去收獲新知識(shí)吧。

1.print語(yǔ)句

這是一個(gè)基本的原始的調(diào)試問(wèn)題的方法。 我們可以在程序中插入print語(yǔ)句來(lái)了解控制流和變量值。 雖然這是一個(gè)簡(jiǎn)單的技術(shù), 但它有一些缺點(diǎn)。 程序需要進(jìn)行編輯以添加’print’語(yǔ)句,然后必須重新編譯,重新運(yùn)行來(lái)獲得輸出。 如果要調(diào)試的程序相當(dāng)大,這是一個(gè)耗時(shí)的方法。

2. 查詢

在某些情況下,我們需要弄清楚在一個(gè)運(yùn)行在內(nèi)核中的進(jìn)程的狀態(tài)和內(nèi)存映射。為了獲得這些信息,我們不需要在內(nèi)核中插入任何代碼。 相反,可以用 /proc 文件系統(tǒng)。

/proc 是一個(gè)偽文件系統(tǒng),系統(tǒng)一啟動(dòng)運(yùn)行就收集著運(yùn)行時(shí)系統(tǒng)的信息 (cpu信息, 內(nèi)存容量等)。

Linux系統(tǒng)下常用的調(diào)試工具有哪些

‘ls /proc’的輸出

正如你看到的, 系統(tǒng)中運(yùn)行的每一個(gè)進(jìn)程在/proc文件系統(tǒng)中有一個(gè)以進(jìn)程id命名的項(xiàng)。每個(gè)進(jìn)程的細(xì)節(jié)信息可以在進(jìn)程id對(duì)應(yīng)的目錄下的文件中獲得。

Linux系統(tǒng)下常用的調(diào)試工具有哪些

‘ls /proc/pid’的輸出

解釋/proc文件系統(tǒng)內(nèi)的所有條目超出了本文的范圍。一些有用的列舉如下:

  • /proc/cmdline -> 內(nèi)核命令行

  • /proc/cpuinfo -> 關(guān)于處理器的品牌,型號(hào)信息等

  • /proc/filesystems -> 文件系統(tǒng)的內(nèi)核支持的信息

  • /proc//cmdline -> 命令行參數(shù)傳遞到當(dāng)前進(jìn)程

  • /proc//mem -> 當(dāng)前進(jìn)程持有的內(nèi)存

  • /proc//status -> 當(dāng)前進(jìn)程的狀態(tài)

3. 跟蹤

strace的和ltrace是兩個(gè)在Linux中用來(lái)追蹤程序的執(zhí)行細(xì)節(jié)的跟蹤工具。

strace:

strace攔截和記錄系統(tǒng)調(diào)用及其接收的信號(hào)。對(duì)于用戶,它顯示了系統(tǒng)調(diào)用、傳遞給它們的參數(shù)和返回值。strace的可以附著到已在運(yùn)行的進(jìn)程或一個(gè)新的進(jìn)程。它作為一個(gè)針對(duì)開(kāi)發(fā)者和系統(tǒng)管理員的診斷、調(diào)試工具是很有用的。它也可以用來(lái)當(dāng)做一個(gè)通過(guò)跟蹤不同的程序調(diào)用來(lái)了解系統(tǒng)的工具。這個(gè)工具的好處是不需要源代碼,程序也不需要重新編譯。

使用strace的基本語(yǔ)法是:

strace 命令

strace有各種各樣的參數(shù)。可以檢查看strace的手冊(cè)頁(yè)來(lái)獲得更多的細(xì)節(jié)。

strace的輸出非常長(zhǎng),我們通常不會(huì)對(duì)顯示的每一行都感興趣。我們可以用’-e expr’選項(xiàng)來(lái)過(guò)濾不想要的數(shù)據(jù)。

用 ‘-p pid’ 選項(xiàng)來(lái)綁到運(yùn)行中的進(jìn)程.

用’-o’選項(xiàng),命令的輸出可以被重定向到文件。

Linux系統(tǒng)下常用的調(diào)試工具有哪些

strace過(guò)濾成只有系統(tǒng)調(diào)用的輸出

ltrace:

ltrace跟蹤和記錄一個(gè)進(jìn)程的動(dòng)態(tài)(運(yùn)行時(shí))庫(kù)的調(diào)用及其收到的信號(hào)。它也可以跟蹤一個(gè)進(jìn)程所作的系統(tǒng)調(diào)用。它的用法是類(lèi)似與strace。

ltrace command

‘-i’ 選項(xiàng)在調(diào)用庫(kù)時(shí)打印指令指針。

‘-S’ 選項(xiàng)被用來(lái)現(xiàn)實(shí)系統(tǒng)調(diào)用和庫(kù)調(diào)用

所有可用的選項(xiàng)請(qǐng)參閱ltrace手冊(cè)。

Linux系統(tǒng)下常用的調(diào)試工具有哪些

ltrace捕捉’STRCMP’庫(kù)調(diào)用的輸出

4. Valgrind

Valgrind是一套調(diào)試和分析工具。它的一個(gè)被廣泛使用的默認(rèn)工具——’Memcheck’——可以攔截malloc(),new(),free()和delete()調(diào)用。換句話說(shuō),它在檢測(cè)下面這些問(wèn)題非常有用:

  • 內(nèi)存泄露

  • 重釋放

  • 訪問(wèn)越界

  • 使用未初始化的內(nèi)存

  • 使用已經(jīng)被釋放的內(nèi)存等。

它直接通過(guò)可執(zhí)行文件運(yùn)行。

Valgrind也有一些缺點(diǎn),因?yàn)樗黾恿藘?nèi)存占用,會(huì)減慢你的程序。它有時(shí)會(huì)造成誤報(bào)和漏報(bào)。它不能檢測(cè)出靜態(tài)分配的數(shù)組的訪問(wèn)越界問(wèn)題。

為了使用它,首先請(qǐng)下載并安裝在你的系統(tǒng)上??梢允褂貌僮飨到y(tǒng)上的包管理器來(lái)安裝。

使用命令行安裝需要解壓縮和解包下載的文件。

 tar -xjvf valgring-x.y.z.tar.bz2 (where x.y.z is the version number you are trying to install)

進(jìn)入新創(chuàng)建的目錄(的valgrind-XYZ)內(nèi)運(yùn)行以下命令:

 ./configure
 make
 make install

讓我們通過(guò)一個(gè)小程序(test.c)來(lái)理解valgrind怎么工作的:

 #include 
 void f(void)
 
 {
 int x = malloc(10 * sizeof(int));
 
 x[10] = 0;
 }
 
 int main()
 {
 f();
 return 0;
 }

編譯程序:

 gcc -o test -g test.c

現(xiàn)在我們有一個(gè)可執(zhí)行文件叫做’test’。我們現(xiàn)在可以用valgrind來(lái)檢測(cè)內(nèi)存錯(cuò)誤:

 valgrind –tool=memcheck –leak-check=yes test

這是valgrind呈現(xiàn)錯(cuò)誤的輸出:

Linux系統(tǒng)下常用的調(diào)試工具有哪些

valgrind顯示堆溢出和內(nèi)存泄漏的輸出

正如我們?cè)谏厦婵吹降南ⅲ覀冋谠噲D訪問(wèn)函數(shù)f未分配的內(nèi)存以及分配尚未釋放的內(nèi)存。

5. GDB

GDB是來(lái)自自由軟件基金會(huì)的調(diào)試器。它對(duì)定位和修復(fù)代碼中的問(wèn)題很有幫助。當(dāng)被調(diào)試的程序運(yùn)行時(shí),它給用戶控制權(quán)去執(zhí)行各種動(dòng)作, 比如:

  • 啟動(dòng)程序

  • 停在指定位置

  • 停在指定的條件

  • 檢查所需信息

  • 改變程序中的數(shù)據(jù) 等。

你也可以將一個(gè)崩潰的程序coredump附著到GDB并分析故障的原因。

GDB提供很多選項(xiàng)來(lái)調(diào)試程序。 然而,我們將介紹一些重要的選擇,來(lái)感受如何開(kāi)始使用GDB。

如果你還沒(méi)有安裝GDB,可以在這里下載:GDB官方網(wǎng)站。

編譯程序:

為了用GDB調(diào)試程序,必須使用gcc的’-g’選項(xiàng)進(jìn)行編譯。這將以操作系統(tǒng)的本地格式產(chǎn)生調(diào)試信息,GDB利用這些信息來(lái)工作。

下面是一個(gè)簡(jiǎn)單的程序(example1.c)執(zhí)行被零除用來(lái)顯示GDB的用法:

 #include
 int divide()
 {
 int x=5, y=0;
 return x / y;
 }
 
 int main()
 {
 divide();
 }

Linux系統(tǒng)下常用的調(diào)試工具有哪些

展示GDB用法的例子

調(diào)用 GDB:

通過(guò)在命令行中執(zhí)行’gdb’來(lái)啟動(dòng)gdb:

Linux系統(tǒng)下常用的調(diào)試工具有哪些

調(diào)用 gdb

調(diào)用后, 它將等待終端命令并執(zhí)行,直到退出。

如果一個(gè)進(jìn)程已經(jīng)在運(yùn)行,你需要將GDB連接到它上面,可以通過(guò)指定進(jìn)程ID來(lái)實(shí)現(xiàn)。假設(shè)程序已經(jīng)崩潰,要分析問(wèn)題的原因,則用GDB分析core文件。

啟動(dòng)程序:

一旦你在GDB里面,使用’run’命令來(lái)啟動(dòng)程序進(jìn)行調(diào)試。

給程序傳參數(shù):

使用’set args’給你的程序傳參數(shù),當(dāng)程序下次運(yùn)行時(shí)將獲得該參數(shù)。’show args’將顯示傳遞給程序的參數(shù)。

檢查堆棧:

每當(dāng)程序停止,任何人想明白的第一件事就是它為什么停止,以及怎么停在那里的。該信息被稱為反向跟蹤。由程序產(chǎn)生每個(gè)函數(shù)調(diào)用和局部變量,傳遞的參數(shù),調(diào)用位置等信息一起存儲(chǔ)在堆棧內(nèi)的數(shù)據(jù)塊種,被稱為一幀。我們可以使用GDB來(lái)檢查所有這些數(shù)據(jù)。 GDB從最底層的幀開(kāi)始給這些幀編號(hào)。

  • bt: 打印整個(gè)堆棧的回溯

  • bt 打印n個(gè)幀的回溯

  • frame : 切換到指定的幀,并打印該幀

  • up : 上移’n’個(gè)幀

  • down : 下移’n’個(gè)幀 ( n默認(rèn)是1)

檢查數(shù)據(jù):

程序的數(shù)據(jù)可以在里面GDB使用’print’命令進(jìn)行檢查。例如,如果’x’是調(diào)試程序內(nèi)的變量,’print x’會(huì)打印x的值。

檢查源碼:

源碼可以在GDB中打印。默認(rèn)情況下,’list’命令會(huì)打印10行代碼。

  • list : 列出’linenum’行周?chē)脑创a

  • list : 從’function’開(kāi)始列出源碼

  • disas : 顯示該函數(shù)機(jī)器代碼

停止和恢復(fù)程序:

使用GDB,我們可以在必要的地方設(shè)置斷點(diǎn),觀察點(diǎn)等來(lái)停止程序。

  • break : 在’location’設(shè)置一個(gè)斷點(diǎn)。當(dāng)在程序執(zhí)行到這里時(shí)斷點(diǎn)將被擊中,控制權(quán)被交給用戶。

  • watch : 當(dāng)’expr’被程序?qū)懭攵宜闹蛋l(fā)生變化時(shí)GDB將停止

  • catch : 當(dāng)’event’發(fā)生時(shí)GDB停止

  • disable : 禁用指定斷點(diǎn)

  • enable : 啟用指定斷點(diǎn)

  • delete : 刪除 斷點(diǎn)/觀察點(diǎn)/捕獲點(diǎn)。 如果沒(méi)有傳遞參數(shù)默認(rèn)操作是在所有的斷點(diǎn)

  • step: 一步一步執(zhí)行程序

  • continue: 繼續(xù)執(zhí)行程序,直到執(zhí)行完畢

退出 GDB:

用’quit’命令還從GDB中退出。

GDB還有更多的可用選項(xiàng)。里面GDB使用help選項(xiàng)了解更多詳情。

Linux系統(tǒng)下常用的調(diào)試工具有哪些

在GDB中獲得幫助

Linux有哪些版本

Linux的版本有:Deepin、UbuntuKylin、Manjaro、LinuxMint、Ubuntu等版本。其中Deepin是國(guó)內(nèi)發(fā)展最好的Linux發(fā)行版之一;UbuntuKylin是基于Ubuntu的衍生發(fā)行版;Manjaro是基于Arch的Linux發(fā)行版;LinuxMint默認(rèn)的Cinnamon桌面類(lèi)似Windows XP簡(jiǎn)單易用;Ubuntu則是以桌面應(yīng)用為主的Linux操作系統(tǒng)。

感謝您能讀到這里,小編希望您對(duì)“Linux系統(tǒng)下常用的調(diào)試工具有哪些”這一關(guān)鍵問(wèn)題有了從實(shí)踐層面最深刻的體會(huì),具體使用情況還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想閱讀更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI