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檔案取決於程序的 ...