watchpoint

前言

內存被踩,通過 watchpoint 找到真兇

實例

以 smsc911x 網卡驅動為基體,進行實驗,和網卡本身功能無關,

在這里插入圖片描述
每執行一次 ifconfig eth0 up,就會調用一次 smsc911x_open(),我在這里設計了一段代碼,當第 3 次執行 ifconfig eth0 up 時,bbb() 函數就會將指針變量 a 賦值為 NULL,這樣在 aaa() 函數中訪問 a 指向的內存時就會發生 crash。

# ifconfig eth0 up
change the value of a to NULL !!!
a = 0x00000000
&a = 0xd78476c7
8<--- cut here ---
Unable to handle kernel NULL pointer dereference at virtual address 00000000
[00000000] *pgd=00000000
Internal error: Oops: 5 [#1] SMP ARM
Modules linked in:
CPU: 0 PID: 123 Comm: ifconfig Not tainted 6.1.44 #14
Hardware name: ARM-Versatile Express
PC is at aaa+0x34/0x48
LR is at aaa+0x30/0x48
pc : [<80655788>]    lr : [<80655784>]    psr: 600a0013
sp : 9b411d20  ip : 0e152000  fp : 00000000
r10: 81834800  r9 : 81015800  r8 : 00001002
r7 : 81015800  r6 : 80d73a10  r5 : 80a83234  r4 : 80d739a0
r3 : 00000000  r2 : 00000000  r1 : 00000000  r0 : 0000000e
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
Control: 10c5387d  Table: 61b84059  DAC: 00000051
Register r0 information: non-paged memory
Register r1 information: NULL pointer
Register r2 information: NULL pointer
Register r3 information: NULL pointer
Register r4 information: non-slab/vmalloc memory
Register r5 information: non-slab/vmalloc memory
Register r6 information: non-slab/vmalloc memory
Register r7 information: slab kmalloc-2k start 81015800 pointer offset 0 size 2048
Register r8 information: non-paged memory
Register r9 information: slab kmalloc-2k start 81015800 pointer offset 0 size 2048
Register r10 information: slab kmalloc-512 start 81834800 pointer offset 0 size 512
Register r11 information: NULL pointer
Register r12 information: non-paged memory
Process ifconfig (pid: 123, stack limit = 0x221691ba)
Stack: (0x9b411d20 to 0x9b412000)
1d20: 81015d80 00000000 81015824 80655808 00000000 9b411d94 0000000e 81015800
1d40: 81834800 80144640 0000000e 9b411d94 81015824 80952860 00001002 8014476c
1d60: 00000000 81015800 00000000 81015824 80952860 00001002 81015800 81834800
1d80: 00000000 8074e6f4 00000000 00000000 81015800 81015800 00000000 45d1466b
1da0: 81015800 81015800 00001043 00000000 00000041 8074eb14 80db44a4 9b411e44
1dc0: 9b411ed4 9b411e24 00000014 45d1466b 81015800 9b411e48 00000000 00001002
1de0: 8183480c 8074eb40 81a59c80 9b411e48 00000000 00000000 8183480c 807f5f34
1e00: ca6f898f 539cfbfe e473426f 00001043 00000000 00000000 00000000 45d1466b
1e20: 9b411e48 00008914 7ee27c84 81bc0000 7ee27c84 00000003 81b98300 81426900
1e40: 76f76000 807f7b14 30687465 00000000 00000000 00000000 00001043 00000000
1e60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
1e80: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
1ea0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 45d1466b
1ec0: 00008914 81426880 7ee27c84 80726534 9b411edf 818308f8 818308c0 00000007
1ee0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
1f00: 00000000 45d1466b 81b84010 00008914 81b98300 7ee27f64 7ee27c84 8029fde4
1f20: 00008914 802a12c8 00555000 9b411fb0 00553000 00553441 00000017 00000254
1f40: 818308c0 00000007 81af1080 80113a34 00000000 45d1466b 00000000 00000000
1f60: 81426880 00000017 00553441 9b411fb0 80d09f3c 80c58044 7ee27e6c 45d1466b
1f80: 76f76000 00546138 7ee27c84 7ee27f64 00000036 801002c4 81af1080 00000036
1fa0: 76f76000 80100060 00546138 7ee27c84 00000003 00008914 7ee27c84 7ee27c18
1fc0: 00546138 7ee27c84 7ee27f64 00000036 7ee27e68 7ee27e6c 76f75ce0 76f76000
1fe0: 00556bdc 7ee27c00 0048ed74 76ed246c 200a0010 00000003 00000000 00000000aaa from smsc911x_open+0x18/0x9c8smsc911x_open from __dev_open+0xc8/0x188__dev_open from __dev_change_flags+0x1b0/0x1c8__dev_change_flags from dev_change_flags+0x14/0x44dev_change_flags from devinet_ioctl+0x264/0x6d0devinet_ioctl from inet_ioctl+0x21c/0x248inet_ioctl from sock_ioctl+0x478/0x588sock_ioctl from vfs_ioctl+0x18/0x34vfs_ioctl from sys_ioctl+0xc10/0xcd4sys_ioctl from ret_fast_syscall+0x0/0x54
Exception stack(0x9b411fa8 to 0x9b411ff0)
1fa0:                   00546138 7ee27c84 00000003 00008914 7ee27c84 7ee27c18
1fc0: 00546138 7ee27c84 7ee27f64 00000036 7ee27e68 7ee27e6c 76f75ce0 76f76000
1fe0: 00556bdc 7ee27c00 0048ed74 76ed246c
Code: e1a01006 e1a00005 ebec5b1a e5943070 (e5931000) 
---[ end trace 0000000000000000 ]---
Segmentation fault

內核的 crash 信息幫我們定位到了問題原因是訪問的指針變量 a 是一個空指針。
那接著如何追蹤是誰將 a 賦值為空了呢?

請忽略 change the value of a to NULL !!! 這句 log,實際項目中沒有神仙會幫你加上這句。

在 aaa 函數處打上斷點

(gdb) b aaa
Breakpoint 1 at 0x80655754: file drivers/net/ethernet/smsc/smsc911x.c, line 1596.

斷點命中后,使用 watch 命令監控指針變量 a,當讀或寫 a 變量時,就會觸發該斷點

Breakpoint 1, aaa () at drivers/net/ethernet/smsc/smsc911x.c:1596
1596	{
(gdb) p a
$1 = (int *) 0x80d73a14 <b>
(gdb) p *a
$2 = 10
(gdb) watch a
Hardware watchpoint 2: a

繼續運行代碼,watchpoint 斷點觸發,提示 a 的值從 0x80d73a14 變為了 0x0。
代碼停留在 smsc911x.c 第 1613 行。

Hardware watchpoint 2: aOld value = (int *) 0x80d73a14 <b>
New value = (int *) 0x0
bbb () at drivers/net/ethernet/smsc/smsc911x.c:1613
1613			printk("change the value of a to NULL !!!\n");

代碼停留位置是即將要執行的行,結合代碼,上一行,第 1612 行 a = NULL; 是剛執行過的代碼,也就是該行代碼將指針變量 a 的值由 0x80d73a14 改為了 0x0,這樣就找到了真兇。

總結

有人可能會有疑問,這有什么啊,也沒看出來 watchpoint 有多強大。
別著急,請大家換一種情景,假如 bbb() 函數在別的文件呢?查找問題難度是不是就升級了。
有小伙伴說,我有搜索啊,全局搜索 a =,不也能找到賦值的地方。是的,不過,如果賦值的地方很多,且右值也是個變量,定位起來是不是難度比較大。
還有,修改變量 a 的代碼有可能不在 kernel 源碼中,可能在某個內核模塊中,這樣定位起來也比較費功夫。
最后,有一種情況是非用 watchpoint 不可的,那就是,代碼并不是顯式修改 a 的值,而是由于某處代碼訪問越界了,誤修改到了 a 的值,這種情況看代碼是看不出來的。比如,代碼 int c[4]; 定義了一個數組,i = 100,使用 c[i] 訪問時就出現了數組越界,c[100],是一個未知地址,說不準就是上面變量 a 所在的內存地址。

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

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

相關文章

數學知識(四)(容斥原理、博弈論)

一、容斥原理 容斥原理公式 一共加或者減的式子個數 &#xff08;一&#xff09;利用容斥原理解決求能被質數整除的數的個數 890計算能被整除的數的個數 因為一共有2^n-1種選法&#xff0c;可以用位運算的方式枚舉&#xff0c;對于得到的每一種選法&#xff0c;根據存在的數…

六、回歸與聚類算法 - 邏輯回歸與二分類

線性回歸欠擬合與過擬合線性回歸的改進 - 嶺回歸分類算法&#xff1a;邏輯回歸模型保存與加載無監督學習&#xff1a;K-means算法 1、應用場景 2、原理 2.1 輸入 2.2 激活函數 3、損失以及優化 3.1 損失 3.2 優化 4、邏輯回歸API 5、分類的評估方法 5.1 精確率和召回率 5.2…

找出作弊的人

文章目錄 題目描述輸入描述輸出描述樣例1解釋:樣例2代碼 題目描述 公司組織了一次考試,現在考試結果出來了&#xff0c;想看一下有沒人存在作弊行為,但是員工太多了,需要先對員工進行一次過濾,再進一步確定是否存在作弊行為。 過濾的規則為:找到分差最小的員工ID對(p1,p2)列表…

【Spring】IoC容器 控制反轉 與 DI依賴注入 配置類實現版本 第四期

文章目錄 基于 配置類 方式管理 Bean一、 配置類和掃描注解二、Bean定義組件三、高級特性&#xff1a;Bean注解細節四、高級特性&#xff1a;Import擴展五、基于注解配置類方式整合三層架構組件總結 基于 配置類 方式管理 Bean Spring 完全注解配置&#xff08;Fully Annotatio…

Kotlin學習 6

1.接口 interface Movable {var maxSpeed: Intvar wheels: Intfun move(movable: Movable): String}class Car(var name: String, override var wheels: Int 4, _maxSpeed: Int) : Movable {override var maxSpeed: Int _maxSpeedget() fieldset(value) {field value}overr…

C語言讀取 ini 配置文件,修改/添加鍵值對

C語言讀取 ini 配置文件&#xff0c;修改/添加鍵值對 C語言讀取 ini 配置文件&#xff0c;對section中的鍵值對進行修改/添加&#xff0c;如果section不存在&#xff0c;則在末尾將新的section/key/value 添加進去。 一、了解什么是INI文件&#xff1f; ini 文件是Initializ…

【大數據】Flink 之部署篇

Flink 之部署篇 1.概述和參考架構2.可重復的資源清理3.部署模式3.1 Application 模式3.2 Per-Job 模式&#xff08;已廢棄&#xff09;3.3 Session 模式 Flink 是一個多用途框架&#xff0c;支持多種不同的混合部署方案。下面&#xff0c;我們將簡要介紹 Flink 集群的構建模塊、…

流動資金貸款管理辦法

流動資金貸款管理辦法 (2024年1月30日國家金融監督管理總局令2024年第2號公布 自2024年7月1日起施行) 第一章 總 則 第一條 為規范銀行業金融機構流動資金貸款業務經營行為&#xff0c;加強流動資金貸款審慎經營管理&#xff0c;促進流動資金貸款業務健康發展&#xff0c;依…

【html學習筆記】3.表單元素

1.文本框 1.1 語法 <input type "text">表示文本框。且只能寫一行 1.2 屬性 使用屬性size 設置文本框大小 <input type"text" size"10">2. 使用屬性value 來設置文本框的默認文字 <input type"text" size"…

Vue狀態管理庫-Pinia

一、Pinia是什么&#xff1f; Pinia 是 Vue 的專屬狀態管理庫&#xff0c;它允許支持跨組件或頁面共享狀態&#xff0c;即共享數據&#xff0c;他的初始設計目的是設計一個支持組合式API的 Vue 狀態管理庫&#xff08;因為vue3一個很大的改變就是組合式API&#xff09;,當然這…

PFA三角燒瓶實驗室PFA錐形瓶本底純凈耐腐蝕性強

PFA三角燒瓶外觀呈平底圓錐狀&#xff0c;下闊上狹&#xff0c;有一圓柱形頸部&#xff0c;上方有一較頸部闊的開口&#xff0c;可用塞子封閉。PFA三角燒瓶也稱PFA錐形瓶&#xff0c;PFA反應瓶&#xff0c;PFA三角燒瓶、PFA依氏燒瓶、PFA錐形燒瓶&#xff0c;PFA鄂倫麥爾瓶等。…

普中51單片機學習(串口通信)

串口通信 原理 計算機通信是將計算機技術和通信技術的相結合&#xff0c;完成計算機與外部設備或計算機與計算機之間的信息交換 。可以分為兩大類&#xff1a;并行通信與串行通信。并行通信通常是將數據字節的各位用多條數據線同時進行傳送 。控制簡單、傳輸速度快&#xff1…

【大模型】finetune 百川2

使用官網例子finetune百川2&#xff0c;微調腳本如下 模型為baichuan_chat_13B_v1 export CUDA_VISIBLE_DEVICES1 hostfile"" deepspeed --hostfile$hostfile baichuan_fineturn/fine-tune/fine-tune.py \--report_to "none" \--data_path "baichu…

2.22號qt

1.使用信號和槽實現多個界面跳轉 1.1準備兩個界面 1.2第一個界面準備signal 1.3第二個界面準備slot 1.4將第一個界面的信號和槽進行連接 2.qss登錄界面升級優化 2.1概念 Qss是Qt程序界面中用來設置控件的背景圖片、大小、字體顏色、字體類型、按鈕狀態變化等屬性&#xff…

【Python】Python實現串口通信(Python+Stm32)

&#x1f389;歡迎來到Python專欄~Python實現串口通信 ☆* o(≧▽≦)o *☆嗨~我是小夏與酒&#x1f379; ?博客主頁&#xff1a;小夏與酒的博客 &#x1f388;該系列文章專欄&#xff1a;Python學習專欄 文章作者技術和水平有限&#xff0c;如果文中出現錯誤&#xff0c;希望…

springboot208基于springboot物流管理系統

基于spring boot物流管理系統設計與實現 摘 要 社會發展日新月異&#xff0c;用計算機應用實現數據管理功能已經算是很完善的了&#xff0c;但是隨著移動互聯網的到來&#xff0c;處理信息不再受制于地理位置的限制&#xff0c;處理信息及時高效&#xff0c;備受人們的喜愛。…

jax可微分編程的筆記

jax可微分編程的筆記 1.1.1 求導的基本概念 所謂的導數是一個從集合F到自身的映射. 有時,我們也將一個從函數到函數的映射稱為一個操作, 這里的操作在物理學中也被稱作一個算符. 但在計算機中的操作符相當于數學中的一個函數,而非從 函數到函數的映射. 應該指出的是,如果我們…

vue小記——this(2)

在Vue的方法中使用普通函數作為回調函數&#xff0c;那么在該回調函數中&#xff0c;this將不會指向Vue實例&#xff0c;而是指向全局對象&#xff08;在瀏覽器中是window&#xff09;。 錯誤 &#xff1a; export default { data() { return { message: Hello Vue! }; …

npm 包發布

name publish必填項&#xff08;version,nameverson構成唯一標識&#xff09;&#xff0c;唯一&#xff0c;所以publish前驗證庫里是否存在該名稱&#xff0c;方式npm info xxx npm ERR! 404 cy_test is not in the npm registry.可以使用。規則&#xff1a;不能以.或者_開頭…

maven工程打包引入本地jar包

1、通過maven生成本地區倉庫包 mvn install:install-file --settings D:\lkx\download\apache-maven-3.6.3\conf\settings.xml -Dfileaspose-cad-21.8.jar -DartifactIdaspose-cad -DgroupIdsystem.core -Dversion21.8 -Dpackagingjar -DgeneratePomtrue # --settings&#xf…