gdb 入門

gdb 入門

簡介

gdb是GNU開源組織發布的一個強大的Linux下的程序調試工具。

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

1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。

2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)

3、當程序被停住時,可以檢查此時你的程序中所發生的事。

4、你可以改變你的程序,將一個BUG產生的影響修正從而測試其他BUG。

gdb可以調試的對象

gdb 可以調試的語言

Ada, Assembly, C, C++, D, Fortran, Go, Objective-C, OpenCL, Modula-2, Pascal, Rust

gdb 可以調試的文件類型

注意在編譯時需要加上-g選項。gdb可以調試的文件類型有三種:

  1. 二進制文件。

    gdb a.out

  2. core文件。通常,我們在遇到錯誤時得到一個core文件(如果沒有,請通過ulimit -a命令查看core file siez是否為0,若為0,通過ulimit -c unlimited改為unlimited即可)

    gdb a.out core.12345

  3. 運行中的進程,其中[1234]時要調試的進程號

    gdb -p 1234

gdb的常用命令(入門)

本小節僅介紹入門級的常用命令,稍微進階的用法會慢慢補全。

以下索引表解釋常用命令基本的含義,有些細節會在下一小節具體說。

命令(簡寫)含義
help (h)查看命令幫助
run (r)重新開始運行文件
run argv[1] argv[2]調試時命令行傳參
start單步執行,運行程序,停在第一執行語句
list (l)查看源代碼
set設置變量的值
next (n)單步調試(逐過程,函數直接執行)
step (s)單步調試(逐語句,跳入自定義函數內部執行)
braktrace (bt)查看函數的調用的棧幀和層級關系
frame (f)切換函數的棧楨
info (i)查看函數內部局部變量的值
finish結束當前函數,返回到調用點
continue (c)繼續運行(至下一個斷點或程序結束)
print (p)打印值
quit (q)退出gdb
break (b)設置斷點
info breakpoints(i break)查看當前設置的所有斷點
enable/disable breakpoints啟用 / 禁用斷點
delete num(d num)刪除第num個斷點
display追蹤查看具體的變量值
undisplay取消追蹤觀察變量
watch被設置觀察點的變量發生修改時,打印顯示
info watchpoints(i watch)顯示觀察點
x查看內存x/20xw 顯示20個單元,16進制,4字節每單元

幾個常用的命令詳解

list

list 可簡寫為l,可以列出所調試程序的代碼

  1. list linenumber:列出linenumber附近的代碼
  2. list function:列出某個函數附近的源代碼

break

gdb調試時使用break命令來設置斷點,簡寫為b,有如下幾種下斷點地方法:

  1. break function:在進入指定的函數function處打斷點,C++中可以使用class::function或function(type, type)格式來指定函數名稱

    break filename:function:在指定文件的指定函數處打斷點

  2. break linenumber:在指定的行數打斷點

    break filename:linenumber:在指定文件的指定行數打斷點

  3. break +/- offeset:在當前行的前面或后面打斷點

  4. break *address:在程序運行的指定地址出打斷點

  5. break:在下一條命令處停止運行

  6. break .. if condition:在在處理某些循環體中可使用此方法進行調試,其中…可以是上述的break lineNumberbreak +/-offset中的參數,其中condition表示條件,在條件成立時程
    序即停止運行,如設置break if i=100表示當i為100時程序停止運行。

查看斷點時,也可以使用info命令如info breakpoints [n]、info break [n]其中n 表示斷點號來查看斷點信息。

可以通過delete命令刪除所有的斷點

next

使用next命令單步執行程序代碼,next的單步不會進入函數的內部,與next對應的step命令則在單步執行一個函數時進入函數內部,類似于VC++中的step into,其用法為next count,單步跟蹤,如果有函數調用不會進入函數,如果后面不加count表示一條一條的執行,加count表示執行后面的count條指令。

continue

continue:當程序遇到斷點停下來之后,可以執行continue繼續執行到下一個斷點或到程序結束。

print

簡寫為p,可以通過print命令查看參數或程序運行數據

值得注意的是print輸出可以指定顯示變量的輸出格式:

符號輸出格式
x十六進制
d十進制
u十六進制無符號數
o八進制
t二進制
c字符格式
f浮點數格式

print可以輸出東西可多:全局變量,靜態全局變量,局部變量,如果你的局部變量和全局變量發生沖突(也就是重名),一般情況下是局部變量會隱藏全局變量。

  1. 全局變量利用::,例如在1.c中看x:(gdb)p "1.c"::x

  2. 數組(動):p *array@len
    array:數組的首地址,len:數據的長度

  3. 數組(靜):直接p數組名

  4. 所有寄存器的值:info registers

  5. 查看指定的寄存器的值:p $eip

  6. 結構體。如果你想很漂亮的輸出結構體請設置set print pretty on,打開print pretty這個東西,沒錯,輸出很漂亮滴。

disassemble

disassemble function來查看匯編代碼,如下圖示某個main函數的反匯編代碼:

在這里插入圖片描述

我們可以通過反匯編代碼的偏移量來在匯編代碼中打上斷點,比如我們想要在圖中紅色箭頭處打斷點,只需b *main+45

我們可以通過disassemble /m function指令,來將C/C++源代碼和其反匯編一起顯示,這樣會更加直觀:

在這里插入圖片描述

backtrace

可以簡寫為bt,功能為顯示函數的棧。

當你的程序調用了一個函數,函數的地址,函數參數,函數內的局部變量都會被壓入“棧”(Stack)中。你可以用這條命令來查看當前的棧中的所有信息。

在遞歸時可以很方便地查看棧上各個遞歸函數的棧幀:
在這里插入圖片描述

圖中的Delete函數會被遞歸調用,功能時刪除二叉搜索樹種的某個節點,具體功能不重要,這里是為了展示遞歸函數多層遞歸時通過backtrace來查看棧幀信息。

顯示棧頂的幾個層的信息:bt n

顯示棧底下的幾層信息:bt -n

但是,如果要查看某一層的信息,你需要在切換當前的棧,一般來說,程序停止時,最頂層的棧就是當前棧,如果你要查看棧下面層的詳細信息,首先要做的是切換當前棧。這就要用到下面的frame命令。

frame

可以簡寫為f,n是一個從0開始的整數,是棧中的層編號。比如:frame 0,表示棧頂,即當前函數的棧幀,frame 1,表示棧的第二層,即調用當前函數的函數的棧幀。

up n:表示向棧的上面移動n層,可以不打n,表示向上移動一層。

down n:表示向棧的下面移動n層,可以不打n,表示向下移動一層。

info f:會打印出更為詳細的當前棧層的信息。

在這里插入圖片描述

layout

用于分割窗口,可以一邊查看代碼,一邊測試。如下圖是layout src的窗口展示:

在這里插入圖片描述

命令及參數功能
layout src顯示源代碼窗口
layout asm顯示匯編窗口
layout regs顯示源代碼/匯編和寄存器窗口
layout split顯示源代碼和匯編窗口
layout next顯示下一個layout
layout prev顯示上一個layout

另外我們可以通過一些功能鍵調整窗口選項:

Ctrl + L,刷新窗口
Ctrl + x,再按1:單窗口模式,顯示一個窗口
Ctrl + x,再按2:雙窗口模式,顯示兩個窗口
Ctrl + x,再按a:回到傳統模式,即退出layout,回到執行layout之前的調試窗口。

Ref

https://www.gnu.org/software/gdb/

https://blog.csdn.net/awm_kar98/article/details/82840811

http://blog.chinaunix.net/uid-29611934-id-5168746.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532715.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532715.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532715.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

視頻監控系統中的平臺服務器,【視頻監控主機 網絡視頻集中管理平臺服務器】 - 太平洋安防網...

完善的管理功能管理系統內所有設備的接入及設備權限。設備狀態監視。系統資源及用戶權限分配及系統搶權管理。電子地圖。實現系統內視頻流的管理和轉發控制。可通過WEB遠程管理。強大的報警事件管理功能系統具備完善的報警及處理功能,能根據預先編寫事件 處理預案對…

Linux下的CUDA多版本管理

Linux下的CUDA多版本管理 關于CUDA、cuDNN等的簡介和安裝可參考:顯卡、顯卡驅動、CUDA、CUDA Toolkit、cuDNN 梳理。 CUDA多版本 有時我們會在一臺機器上同時看到多個版本的CUDA,比如nvcc -V和nvidia-smi的輸出就可能會不同: 在我們實驗室…

電腦顯示無法連接sql服務器,他人的電腦為什么無法連接我電腦上的sql sever服務器...

如果SQL2005連接不上,并且服務器上所有與防火相關的東西都關閉了,還是連接不上。進行如下操作:一、為 SQL 啟用遠程連接1. 單擊“開始”,依次指向“程序”、“Microsoft SQL Server 2005”和“配置工具”,然后單擊“SQL Server 外…

ONNX初探

ONNX初探 轉載自:https://blog.csdn.net/just_sort/article/details/112912272 0x0. 背景 最近看了一些ONNX的資料,一個最大的感受就是這些資料太凌亂了。大多數都是在介紹ONNX模型轉換中碰到的坑點以及解決辦法。很少有文章可以系統的介紹ONNX的背景…

服務器修改地址,服務器修改管理地址

服務器修改管理地址 內容精選換一換在彈性云服務器上安裝完成后輸入公網IP,無法連接目的虛擬機,端口無法訪問工具。源端網絡未連通目的端。目的端安全組未開放8084端口。目的端網絡ACL禁用了8084端口。登錄源端服務器后,在源端服務器中ping 目…

ONNX再探

ONNX再探 本文轉自:https://blog.csdn.net/just_sort/article/details/113802330 這篇文章從多個角度探索了ONNX,從ONNX的導出到ONNX和Caffe的對比,以及使用ONNX遭遇的困難以及一些解決辦法,另外還介紹了ONNXRuntime以及如何基于…

圖像卷積及其計算(特征圖尺寸、參數量、計算量)

圖像卷積及其計算(特征圖尺寸、參數量、計算量) 卷積前后特征圖尺寸的計算 定義參數如下: 輸入特征圖尺寸: WWWWWW卷積核尺寸: FFFFFF步長: SSS填充的像素數:PPP 則有輸出特征圖尺寸為 NNNN…

圖解自監督學習(CV)

圖解自監督學習(CV) 譯自:https://amitness.com/2020/02/illustrated-self-supervised-learning/ 作者:Amit Chaudhary 注:譯者在某些地方對原文的表述做了調整,使其適合漢語的閱讀習慣,并在…

機器學習中的歸納偏置

機器學習中的歸納偏置 帶著偏見看世界,否則你根本沒有看待世界的方式。 本文主要參考整理自知乎問題:如何理解Inductive bias? No-Free-Lunch(NLF)定理指出學習是不可能的,除非有先驗知識。通常情況下&…

編譯型與解釋型、動態語言與靜態語言、強類型語言與弱類型語言概念辨析

編譯型與解釋型、動態語言與靜態語言、強類型語言與弱類型語言概念辨析 轉自:https://blog.csdn.net/u010533843/article/details/76215487 編譯型和解釋型 我們先看看編譯型,其實它和匯編語言是一樣的:也是有一個負責翻譯的程序來對我們的…

Linux環境變量詳解

Linux環境變量詳解 環境變量是操作系統環境設置的變量,適用于整個系統的用戶進程。 環境變量分類 按照權限分類 系統級:系統級的環境變量是每個登錄到系統的用戶都要讀取的系統變量用戶級:用戶級的環境變量則是該用戶使用系統時加載的環境…

[分布式訓練] 單機多卡的正確打開方式:PyTorch

[分布式訓練] 單機多卡的正確打開方式:PyTorch 轉自:https://fyubang.com/2019/07/23/distributed-training3/ PyTorch的數據并行相對于TensorFlow而言,要簡單的多,主要分成兩個API: DataParallel(DP&am…

上學期C語言復習

C語言&#xff1a;面向過程例&#xff1a;完成兩個單元內容的交換 &#xff1a; #include<stdio.h> //定義一個完成兩個數據交換的函數 //void swap(int m,int n) void swap(int*m,int* n) { int temp;//臨時單元 temp*m; *m*n; *ntemp; } int main() {int a5,b10; print…

[分布式訓練] 單機多卡的正確打開方式:Horovod

[分布式訓練] 單機多卡的正確打開方式&#xff1a;Horovod 轉自&#xff1a;https://fyubang.com/2019/07/26/distributed-training4/ 講完了單機多卡的分布式訓練的理論、TensorFlow和PyTorch分別的實現后&#xff0c;今天瓦礫講一個強大的第三方插件&#xff1a;Horovod。 …

【c語言數據結構筆記】1.2 數據結構

1.2數據結構 數據元素并獨立 結構實體關系 形式定義&#xff08;D&#xff0c;S&#xff09; 其中D是數據元素的有限集&#xff0c;S是D上關系的有限集 eg&#xff1a;12位數&#xff1a;132423451233 分成三組四位數 次序關系<a1,a2><a2,a3> 遵守次序關系 eg&…

使用Apex進行混合精度訓練

使用Apex進行混合精度訓練 轉自&#xff1a;https://fyubang.com/2019/08/26/fp16/ 你想獲得雙倍訓練速度的快感嗎&#xff1f; 你想讓你的顯存空間瞬間翻倍嗎&#xff1f; 如果我告訴你只需要三行代碼即可實現&#xff0c;你信不&#xff1f; 在這篇博客里&#xff0c;瓦礫…

【數據結構1.3筆記】研究內容

1.3研究內容 數據結構&#xff08;D&#xff0c;S&#xff09; {邏輯結構&#xff1a; {物理結構&#xff08;存儲結構&#xff09; {數據的運算 1.邏輯結構 1 集合&#xff1a;集合&#xff0c;沒有邏輯關系 2 線性結構 “一對一” 3樹形結構 層次關系 4圖形結構 練習&…

Linux下的LD_PRELOAD環境變量與庫打樁

Linux下的LD_PRELOAD環境變量與庫打樁 LD_PRELOAD是Linux系統的一個環境變量&#xff0c;它可以影響程序的運行時的鏈接&#xff08;Runtime linker&#xff09;&#xff0c;它允許你定義在程序運行前優先加載的動態鏈接庫&#xff0c;一方面&#xff0c;我們可以以此功能來使…

2019年藍橋杯第一題

第一題 標題&#xff1a;組隊&#xff08;本題總分&#xff1a;5 分&#xff09; 作為籃球隊教練&#xff0c;你需要從以下名單中選出 1 號位至 5 號位各一名球員&#xff0c; 組成球隊的首發陣容。 每位球員擔任 1 號位至 5 號位時的評分如下表所示。請你計算首發陣容 1 號位…

深度學習編譯:MLIR初步

深度學習編譯MLIR初步 深度模型的推理引擎 目前深度模型的推理引擎按照實現方式大體分為兩類&#xff1a;解釋型推理引擎和編譯型推理引擎。 解釋型推理引擎 一般包含模型解析器&#xff0c;模型解釋器&#xff0c;模型優化器。 模型解析器負責讀取和解析模型文件&#xff…