GDB調試指南-啟動調試

来源:https://www.cnblogs.com/bianchengzhuji/archive/2019/01/11/10257347.html
-Advertisement-
Play Games

前言 GDB(GNU Debugger)是UNIX及UNIX-like下的強大調試工具,可以調試ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等語言。本文以C程式為例,介紹GDB啟動調試的多種方式。 哪類程式可被 ...


前言

GDB(GNU Debugger)是UNIX及UNIX-like下的強大調試工具,可以調試ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等語言。本文以C程式為例,介紹GDB啟動調試的多種方式。

哪類程式可被調試

對於C程式來說,需要在編譯時加上-g參數,保留調試信息,否則不能使用GDB進行調試。
但如果不是自己編譯的程式,並不知道是否帶有-g參數,如何判斷一個文件是否帶有調試信息呢?

gdb 文件

例如:

$ gdb helloworld
Reading symbols from helloWorld...(no debugging symbols found)...done.

如果沒有調試信息,會提示no debugging symbols found。
如果是下麵的提示:

Reading symbols from helloWorld...done.

則可以進行調試。

readelf查看段信息

例如:

$ readelf -S helloWorld|grep debug
  [28] .debug_aranges    PROGBITS         0000000000000000  0000106d
  [29] .debug_info       PROGBITS         0000000000000000  0000109d
  [30] .debug_abbrev     PROGBITS         0000000000000000  0000115b
  [31] .debug_line       PROGBITS         0000000000000000  000011b9
  [32] .debug_str        PROGBITS         0000000000000000  000011fc

helloWorld為文件名,如果沒有任何debug信息,則不能被調試。

file查看strip狀況

下麵的情況也是不可調試的:

file helloWorld
helloWorld: (省略前面內容) stripped

如果最後是stripped,則說明該文件的符號表信息和調試信息已被去除,不能使用gdb調試。但是not stripped的情況並不能說明能夠被調試。

調試方式運行程式

程式還未啟動時,可有多種方式啟動調試。

調試啟動無參程式

例如:

$ gdb helloWorld
(gdb)

輸入run命令,即可運行程式

調試啟動帶參程式

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

#include<stdio.h>
int main(int argc,char *argv[])
{
    if(1 >= argc)
    {
        printf("usage:hello name\n");
        return 0;
    }
    printf("Hello World %s!\n",argv[1]);
    return 0 ;
}

編譯:

gcc -g -o hello hello.c

這種情況如何啟動調試呢?需要設置參數:

$ gdb hello
(gdb)run 編程珠璣
Starting program: /home/shouwang/workspaces/c/hello 編程珠璣
Hello World 編程珠璣!
[Inferior 1 (process 20084) exited normally]
(gdb)

只需要run的時候帶上參數即可。
或者使用set args,然後在用run啟動:

gdb hello
(gdb) set args 編程珠璣
(gdb) run
Starting program: /home/hyb/workspaces/c/hello 編程珠璣
Hello World 編程珠璣!
[Inferior 1 (process 20201) exited normally]
(gdb) 

調試core文件

當程式core dump時,可能會產生core文件,它能夠很大程式幫助我們定位問題。但前提是系統沒有限制core文件的產生。可以使用命令limit -c查看:

$ ulimit -c
0

如果結果是0,那麼恭喜你,即便程式core dump了也不會有core文件留下。我們需要讓core文件能夠產生:

ulimit -c unlimied  #表示不限制core文件大小
ulimit -c 10        #設置最大大小,單位為塊,一塊預設為512位元組

上面兩種方式可選其一。第一種無限制,第二種指定最大產生的大小。
調試core文件也很簡單:

gdb 程式文件名 core文件名

具體可參看《linux常用命令-開發調試篇》gdb部分。

調試已運行程式

如果程式已經運行了怎麼辦呢?
首先使用ps命令找到進程id:

ps -ef|grep 進程名

attach方式

假設獲取到進程id為20829,則可用下麵的方式調試進程:

$ gdb
(gdb) attach 20829

接下來就可以繼續你的調試啦。

可能會有下麵的錯誤提示:

Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf
ptrace: Operation not permitted.

解決方法,切換到root用戶:
將/etc/sysctl.d/10-ptrace.conf中的

kernel.yama.ptrace_scope = 1

修改為

kernel.yama.ptrace_scope = 0

直接調試相關id進程

還可以是用這樣的方式gdb program pid,例如:

gdb hello 20829  

或者:

gdb hello --pid 20829

已運行程式沒有調試信息

為了節省磁碟空間,已經運行的程式通常沒有調試信息。但如果又不能停止當前程式重新啟動調試,那怎麼辦呢?還有辦法,那就是同樣的代碼,再編譯出一個帶調試信息的版本。然後使用和前面提到的方式操作。對於attach方式,在attach之前,使用file命令即可:

$ gdb
(gdb) file hello
Reading symbols from hello...done.
(gdb)attach 20829

總結

本文主要介紹了兩種類型的GDB啟動調試方式,分別是調試未運行的程式和已經運行的程式。對於什麼樣的程式能夠進行調試也進行了簡單說明。

歡迎留言補充。

微信公眾號【編程珠璣】:專註但不限於分享電腦編程基礎,Linux,C語言,C++,演算法,資料庫等編程相關[原創]技術文章,號內包含大量經典電子書和視頻學習資源。歡迎一起交流學習,一起修煉電腦“內功”,知其然,更知其所以然。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、併發的基礎 線程的基本概念 表示一條單獨的執行流,有自己的程式執行計數器,自己的棧 兩種創建方式:繼承Thread;實現Runnable介面 無論哪種創建方式最後都需要調用start方法啟動線程 synchronized 可用於修飾類的實例方法、靜態方法和代碼塊 多個線程可以同時執行同一個syn ...
  • 背景:需要調用第三方介面,開啟某項任務,用Hutool代替了HttpClient 調用第三方介面,簡單粗暴。 代碼如下:import java.util.Date;import org.apache.commons.lang.time.DateFormatUtils;import cn.hutool ...
  • age = 23 count=0 while count<3: guess_age = int (input("My age:")) if age ==guess_age: print("nice, you got it") break elif age < guess_age: print("gu ...
  • pycharm2018.3版 永久激活 如需轉發,請註明出處:小婷兒的python https://www.cnblogs.com/xxtalhr/p/10258257.html 激活前準備工作 · 激活前請先關閉pycharm · 修改配置文件的時候你需要填寫你的安裝路徑 · 如果出現修改配置文件 ...
  • 1 # ----------- 首字母大寫 ---------- 2 test = "alex is a man" 3 v = test.capitalize() 4 print(v): Alex is a man 1 # ----------- 轉換全部字元串為小寫 ---------- 2 te... ...
  • SpringMVC一.. SpringMVC重要組件介紹 1. DispacherServlet:前端控制器,接收所有請求,(如果配置/不包含jsp) 2. HandlerMapping:解析請求格式,判斷希望要執行哪個方法 3. HandlerAdapter:負責調用具體的方法 4. ViewRe ...
  • 有群友問過,是什麼原因使我開始寫技術公眾號,又是什麼動力讓我堅持寫的。 在我看來,寫作是一件不能敷衍的事,通過寫作來學習,反而要比單純地學習的效果要好。為了寫成一篇“拿得出手”的文章,我要反覆查找資料,閱讀與思考,拆解與整合,最終寫成的時候,也是知識的拼圖成型的時候。 所以,對我來說,寫作是一種咀嚼 ...
  • Python中的常用的系統模塊中部分函數等的整理 random: 隨機數 sys: 系統相關 os: 系統相關的 subprocess: 執行新的進程 multiprocessing: 進程相關 threading: 線程相關 pickle: 將對象轉換成二進位文件 time: 時間 datetim ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...