40.Linux應用調試-使用gdb和gdbserver

来源:http://www.cnblogs.com/lifexy/archive/2017/12/13/8034277.html
-Advertisement-
Play Games

1.gdb和gdbserver調試原理 通過linux虛擬機里的gdb,來向開發板里的gdbserver發送命令,比如設置斷點,運行setp等,然後開發板上的gdbserver收到命令後,便會執行應用程式做相應的動作,來實現調試的功能 和之前學的裸板GDB調試 一樣,只不過之前學的是在win下的,本 ...


1.gdb和gdbserver調試原理

通過linux虛擬機里的gdb,來向開發板里的gdbserver發送命令,比如設置斷點,運行setp等,然後開發板上的gdbserver收到命令後,便會執行應用程式做相應的動作,來實現調試的功能

和之前學的裸板GDB調試 一樣,只不過之前學的是在win下的,本次是在linux里的gdb

1.1同樣,它們都會需要一個帶調試信息的編譯文件.

通過Makefile里的arm-linux-gcc  -g 來的,     -g:表示編譯文件里包含gdb調試信息

1.2為什麼需要調試信息的編譯文件?

比如讀開發板的應用程式里的變數a:

首先gdb通過應用程式的帶調試信息的編譯文件,來找出變數a存的地址位置

然後將地址發送給開發板里的gdbserver,來讀出a地址的值

 

2.安裝gdb和gdbserver

首先進入官網下載gdb-7.4: http://ftp.gnu.org/gnu/gdb/ 

2.1在虛擬機上安裝GDB:  

# tar xjf gdb-7.4.tar.bz2                  //解壓

# cd gdb-7.4/                              //進入gdb-7.4目錄

#./configure --target=arm-linux         
              //GDB需要在pc本機里運行,並調試開發板里的應用程式,所以--target設為arm-linux

#make                                      //編譯

#mkdir    tmp                            

#make install prefix=$PWD/tmp              //安裝到./tmp目錄下

sudo cp tmp/bin/arm-linux-gdb  /bin/       //複製到/bin目錄下

/bin/arm-linux-gdb  -v                     //-v: 確定一下gdb的版本VID,是否是7.4

2.2 在開發板上安裝GDBServer:

cd gdb/gdbserver/                                   //在gdb-7.4目錄下輸入

./configure --target=arm-linux --host=arm-linux              //設GDBServer的工作環境

make             //編譯

出現以下錯誤:

指在linux-arm-low.c里,沒有找到PTRACE_GETSIGINFO 定義

2.3 解決:

1) 

#echo $PATH     //來查看PATH環境變數

找到編譯器gcc位於/work/tools/gcc-3.4.5-glibc-2.3.6/bin

2)

#cd /work/tools/gcc-3.4.5-glibc-2.3.6/    
# grep "PTRACE_GETSIGINFO"  *  -nR

在gcc根目錄下,搜索到在linux/ptrace.h中定義:

 

3)

#vi linux-arm-low.c

添加: #define PTRACE_GETSIGINFO 0x4202

4)最後重新make,生成gdbserver命令文件

然後將gdbserver命令文件,放入我們開發板的根目錄/bin中,便能使用了

cp  gdbserver  /nfs_root/bin/          //nfs_root:開發板的nfs系統根目錄

3.測試程式如下(test_debug.c)

#include <stdio.h>

void  C(int *p)
{
   *p = 0x12;
}

void  B(int *p)
{
  C(p);
}

void  A(int *p)
{
  B(p);
}

void  A2(int *p)
{
  C(p);
}

int  main(int argc, char **argv)
{
  int a;
  int *p = NULL;
  A2(&a);  // A2 > C
  printf("a = 0x%x\n", a);
  A(p);    // A > B > C
  return 0;
}

其中A2(&a)會調用A2()->C(),然後將a賦值為0x12.

A(p)會調用A()->B()->C(),由於p是個空指針,這裡將會出錯.

接下來,我們便以這個應用程式為例.

4.編譯

#arm-linux-gcc -g -o test_debug test_debug.c   //-g:附帶調試信息

5.調試test_debug.c

在開發板上:

首先,需要讓gdbserver建立本地伺服器,以及要測試的哪個文件:

#gdbserver 192.168.2.107:2345 ./test_debug
//192.168.2.107:本地IP地址
//2345:埠號,用來讓gdb來連接用的
//./test_debug:要測試的哪個文件

在虛擬機上:

#/bin/arm-linux-gdb   ./test_debug    // 啟動gdb,指定調試文件為test_debug

#target remote  192.168.2.107:2345    //與gdbserver建立連接

5.1連接成功,便使用gdb命令來調試

常用命令如下所示(參考http://blog.sciencenet.cn/blog-619295-813770.html):

l

列出所有源代碼

break [file]:[row]

打斷點,比如:

break test_debug.c:21     //在test_debug.c文件的第21行處打斷點

info br

查看斷點

 

info file

 

列出當前的文件,共用庫。

 

delete <num>

刪除第幾個斷點,如下圖所示:

 

c

啟動程式運行 

step

單步執行

next  

單步執行,和step不同的是,比如:當前行里有函數調用時,next直接執行下一句,step會進入函數

print a

列印a變數的值

quit

退出gdb

 

6.也可以通過gdb+coredump來調試test_debug.c

當程式運行出錯時,便會生成core文件,並將程式里的運行狀況存到core中,也就是coredump,供給gdb來調試

6.1首先,通過ulimit來查看coredump的資源大小     

ulimit命令(user limit),主要用來限制用戶的各個進程資源.

在開發板里,輸入

 

如上圖所示,可以看到coredump的資源大小為0,也就是說,當程式運行出錯時,不會生成core文件

6.2設置core文件

設置core文件的資源大小為無限制,輸入:

ulimit -c unlimited
 //-c:對應coredump

6.3生成core文件

執行:

#./test_debug

出現段錯誤,並生成core文件,如下圖所示:

 

6.4 進入虛擬機

core拷貝過來,然後執行:

#/bin/arm-linux-gdb ./test_debug ./core

然後輸入bt,便可查看調用關係:

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 最前面的話:Smobiler是一個在VS環境中使用.Net語言來開發APP的開發平臺,也許比Xamarin更方便 控制項說明 WeiXin組件。 效果演示 1. 分享好友 2. 分享朋友圈 圖1 圖2 方法 方法 方法說明 registerApp 應用註冊(只需要註冊一次即可)。 loginWithW ...
  • 各種類型命名規範總結 類型 命名規則 註意事項 實例 類或結構 Pascal 首字元大寫 HttpContext 介面 Pascal 加首碼I IDataAdaper 枚舉名 Pascal 首字元大寫 CommandType 枚舉值 Pascal 首字元大寫 CommandType.Text 事件 ...
  • public class WebServiceHelper { /// /// Soap協議Post方法 /// /// WebService地址 /// 傳入Soap協議格式數據 /// public static string SendToReturn(Uri _ur... ...
  • 一、前言 通常我們的項目會包含許多對外的介面,這些介面都需要文檔化,標準的介面描述文檔需要描述介面的地址、參數、返回值、備註等等;像我們以前的做法是寫在word/excel,通常是按模塊劃分,例如一個模塊包含n個介面,就形成一個文檔,然後再用版本控制管理。這樣做的缺點是: 1.不夠直觀,每次打開文檔 ...
  • 返回總目錄 本小節目錄 Replace Inheritance with Delegation(以委托取代繼承) Replace Delegation with Inheritance(以繼承取代委托) 11Replace Inheritance with Delegation(以委托取代繼承) 概 ...
  • 昨天有寫過一個單例模式的練習。《單例模式(C#)》 寫得較為複雜,今天再使用另外的方法來實現: class Au { private static readonly Au instance = new Au(); public static Au Instance { get { return in ...
  • 在C#中,我們對集合的數據,可以創建一個索引器的方法來訪問集合。如: class AS { public string[] Autos = { "德系","歐系","美系","日系","韓系"}; public string this[int index] { get { return Autos[ ...
  • 1.cat 顯示檔案內容,此命令是從檔案的開始依次顯示 加上-n或者-b可以顯示行號,如下 參數-n和-b的區別在於: -n是所有行都顯示行號,包括空白行。 -b是非空白行顯示行號。 2.tac 同cat一樣,只是tac是從檔案的末行開始向前依次顯示 不管是cat還是tac常用於查看內容較少的檔案, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...