38.Linux驅動調試-根據系統時鐘定位出錯位置

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

當內核或驅動出現僵死bug,導致系統無法正常運行,怎麼找到是哪個函數的位置導致的? 答,通過內核的系統時鐘,因為它是由定時器中斷產生的,每隔一定時間便會觸發一次,所以當CPU一直在某個進程中時,我們便在中斷函數中列印該進程的信息 1.先來回憶下 在之前的第5章內核中斷運行過程:http://www. ...


當內核或驅動出現僵死bug,導致系統無法正常運行,怎麼找到是哪個函數的位置導致的?

答,通過內核的系統時鐘,因為它是由定時器中斷產生的,每隔一定時間便會觸發一次,所以當CPU一直在某個進程中時,我們便在中斷函數中列印該進程的信息

 


 

1.先來回憶下

在之前的第5章內核中斷運行過程:http://www.cnblogs.com/lifexy/p/7506504.html分析過,當內核中斷產生時,會做以下幾步:

  • 1)pc-4(計算返回地址值),然後將各個寄存器值存到sp棧里
  • 2)獲取中斷號,獲取sp地址,然後調用asm_do_IRQ()

1.1其中asm_do_IRQ函數原型如下所示:

asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs);  
                         //irq:中斷號        *regs:發生中斷前的各個寄存器基地址(=sp基地址)

 

1.2其中pt_regs結構體成員如下圖所示,用來保存各個寄存器內容的數組:

 

2.所以本節目的,修改asm_do_IRQ()函數,添加如下內容:

  • 1)判斷irq若等於系統時鐘的irq,然後cnt++
  • 2)若在10s後,獲取的進程沒有改變,便列印:進程名字、PID、(regs-> ARM_pc)-4

(PS: 為什麼要列印PC-4?    因為此時的PC是返回地址,而PC-4才是CPU運行的地址)

 

3.首先來找到系統時鐘的中斷號irq

輸入#cat /proc/interrupt,如下圖所示:

 

其中中斷號來自 linux-2.6.22.6\include\asm-arm\arch-s3c2410\Irqs.h

S3C2410 Timer Tick,就是我們的系統時鐘計數值,在內核中就是jiffies這個全局變數,每隔一段時間+1。

所以S3C2410 Timer Tick的中斷號為30

 

4.接下來便來修改asm_do_IRQ()函數

在asm_do_IRQ()中,添加以下帶紅色的字

asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)

{

         struct pt_regs *old_regs = set_irq_regs(regs);

         struct irq_desc *desc = irq_desc + irq;  

   #ifdef 1

    static pid_t pre_pid;                    //進程號  

    static int cnt=0;                          //計數值

    if(irq==30)          //判斷irq中斷號,是否等於系統時鐘

    {  

        if(pre_pid==current->pid)

        {   

            cnt++;

        }

        else

        {

            cnt=0;   

            pre_pid=current->pid;

        }

        if(cnt==10*HZ)   //超時10s

        {

        cnt=0;

        printk("s3c2410_timer_interrupt : pid = %d, task_name = %s\n",current->pid,current->comm);

        printk("pc = %08x\n",regs->ARM_pc);

        }

}     

#endif

         ... ...

}

1)其中current是一個巨集,為task_struct結構體,表示當前運行的進程信息,該巨集通過get_current()來獲取進程信息,位於include\asm-arm\current.h

current->pid:當前進程的PID號

current->com:表示當前進程的name

2) HZ也是一個巨集,代表每S的頻率,比如每隔10ms加1,那麼HZ就等於100

 

5.測試運行

接下來,我們便安裝一個帶有while(1)死迴圈的驅動,然後通過測試程式,內核便會一直在while(1)死迴圈,進入僵死狀態。

由於修改了asm_do_IRQ()函數後,所以會列印下圖信息:

 

5.1 然後便可以通過pc值=bf0000C,就能查找在哪個函數出錯

(參考:http://www.cnblogs.com/lifexy/p/8006748.html)

 


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

-Advertisement-
Play Games
更多相關文章
  • 變數是指一塊存儲數據的記憶體空間,並且該記憶體區域的數據內容可以發生變化。 變數是必須先聲明後賦值。 基本的語法:數據類型+變數名; 變數名=數據; 簡單的使用技巧:聲明賦值簡寫 Static void Main (srring[] args) { int num1=2,num2=3; string s ...
  • 有的時候,我們要做的事情,就是簡單的重覆某個行為指定的次數。 就比如在這裡重覆輸出100個*號 在這裡,就可以使用一個for迴圈 for(i=0;i<100;i++) //定義一個i 讓它代表次數,重覆的動作就是:輸出*; 重覆次數:100; 重覆後要做的是:輸出*; { Console.Write ...
  • 匿名函數指函數定義體(即代碼塊)本身,使得函數成為所謂的“一等公民”,函數也可以像變數一樣進行賦值定義、傳遞和使用。本文還介紹了函數式編程的各種技巧,如嵌套、遞歸、高階、閉包等,站在函數式編程的頂峰,讓你感嘆“會當凌絕頂,一覽眾山小”! ...
  • Beats 平臺集合了多種單一用途數據採集器。這些採集器安裝後可用作輕量型代理,從成百上千或成千上萬台機器向 Logstash 或 Elasticsearch 發送數據。 一、架構圖 此次試驗基於前幾篇文章,需要先基於前幾篇文章搭建基礎環境。 二、安裝Filebeat 下載並安裝Filebeat 修 ...
  • 學習目標: 1:一但出發,必到達。 2:爭取在半年完成基礎學習。 3:出發目標8K,一到兩年爭取有18K-26K (會不會更高呢?) 學習制度: 五次不完成當日課程退課。 銘哥聯繫:QQ·微信·電話·不回覆黑名單。 班主任發消息:必須回覆表示收到。 必須有:課程筆記·有讓傻瓜都能看得懂的筆記。 課程 ...
  • 1.1 部署LNMP架構說明 1.1.1 LNMP架構內容 01.部署linux系統 02.部署nginx網站服務 03.部署mysql資料庫服務 04.部署php動態解析服務 1.1.2 配置LNMP架構步驟 01.配置Nginx配置文件 02.配置mysql資料庫信息(SQL語句) 03.配置w ...
  • Logstash 是一款強大的數據處理工具,它可以實現數據傳輸,格式處理,格式化輸出,還有強大的插件功能,常用於日誌處理。 一、原理 Input 可以從文件中、存儲中、資料庫中抽取數據,Input有兩種選擇一個是交給Filter進行過濾、修剪。另一個是直接交給Output Filter 能夠動態地轉 ...
  • tomcat企業級Web應用伺服器配置與實戰 環境背景:公司業務經過長期發展,有了很大突破,已經實現盈利,現公司要求加強技術架構應用功能和安全性以及開始向企業應用、移動APP等領域延伸,此時原來開發web服務的php語言已經不適應新的場景,需要上java技術架構,現要求你根據公司需要,實現基於jav ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...