linux驅動除錯 段錯誤之oops資訊分析

2021-09-03 01:48:39 字數 912 閱讀 5079

1. 分析coredump列印資訊

2. 確定發生錯誤的函式

看發生錯誤的地方的函式和pc

pc is at segment_test_open+0x14/0x1c [segdrv]

看pc值:

pc : [<7f000014>]    lr : [<800d958c>]    psr: 20070013

看backtrace:

[<7f000014>] (segment_test_open [segdrv]) from [<800d958c>] (chrdev_open+0xa4/0x178)

[<800d958c>] (chrdev_open) from [<800d3e1c>] (do_dentry_open.isra.17+0x110/0x294)

一、直接確定發生錯誤的函式

看到這句 「pc is at segment_test_open+0x14/0x1c [segdrv]」,出現錯誤時我們最關注的就是pc值,因為它就是發生錯誤

的指令的位址,這裡我們可以看到錯誤發生在函式 segment_test_open 的0x14處,0x1c代表這個函式的總長度(彙編**)

二、根據pc值確定發生錯誤的函式

有時候不會直接告訴你發生在哪個函式,而是只把pc值告訴你

如果發生的錯誤函式是屬於驅動模組的

# arm-none-linux-gnueabi-objdump -d first_drv.ko > first_drv.dis

如果發生的錯誤函式是屬於核心的

這個時候和發生在模組裡類似,不過這裡要反彙編整個核心:

# arm-none-linux-gnueabi-objdump -d vmlinux > vmlinux.dis

在gdb下鍵入命令 : list *atmel_tasklet_func+(lr行的提示)

Linux段錯誤除錯

1.單步除錯 編譯時加上 g,然後用gdb除錯,自然就知道出現段錯誤的地方在哪。2.利用core檔案來進行除錯 用ulimit c來檢視core檔案的最大值,如果是0就不會產生core檔案。此時可用ulimit c 1000將core檔案的最大值設定為1000k。ulimit c 1000只會影響當...

段錯誤除錯

1 gdb除錯 1 第一步是使用帶有除錯標誌 debugging flags 的方式編譯這段 如下 gcc g segfault.c 2 執行可執行程式 gdb a.out 進入gdb模式 gdb run 執行程式 starting program home dgawd cpsc 363 a.out...

段錯誤除錯

核心轉儲core dumped 概念 當 個程序要異常終止時,可以選擇把程序的使用者空間記憶體資料全部儲存到磁碟上,檔名通常是core,這叫做core dump。也叫核心轉儲,幫助開發者進行除錯,在程式崩潰時把記憶體資料dump到硬碟上,讓gdb識別 乙個程序允許產生多大的core檔案取決於程序的 ...