嵌入式Linux開打core dumps調(diào)試功能
1). 簡介
在Linux下為了調(diào)試應用程序可以選擇GDB方式運行應用程序進行調(diào)試,這種方式也可以調(diào)試程序由于接收某些信號導致的異常退出。不過當不具備直接GDB調(diào)試環(huán)境的情況下,我們也可以使用Core Dumps功能來調(diào)試程序異常退出的問題
Core Dumps(核心轉(zhuǎn)儲),是操作系統(tǒng)當應用程序進程接收到某些如“segmentation fault(段錯誤)”或者“illegal instruction(非法指令)”等信號而退出停止運行時,會將包含當時內(nèi)存和寄存器分配以及進程狀態(tài)等信息寫成的一個文件,這個文件可以稍后使用gdb進行分析來判定程序異常退出的原因,更多信息請見’man core’。
本文所演示的平臺來自于ToradexApalis TK1 ARM嵌入式平臺,這是一個基于nVidiaTgera K1的ARM處理器,支持四核心Cortex-A15和192 CUDA核心的GPU。
2. 準備
a).Apalis TK1 ARM核心版配合Apalis Ixora載板,連接調(diào)試串口UART1到開發(fā)主機方便調(diào)試。
b).Apalis TK1系統(tǒng)使用Toradex LinuxRelease V2.7b1,并安裝了nVidiaJetPack R21.5,具體的下載和更新方法請參考這里。
3). 查看Linux Kernel配置
由于Toradex ARM模塊產(chǎn)品Linux BSP默認kernel是沒有打開的,因此可以在TK1模塊系統(tǒng)上面通過執(zhí)行下面命令測試是否kernel已經(jīng)支持Core Dumps
a). 查看Linux kernel配置參數(shù)
------------------------------------
zcat /proc/config.gz | grep CONFIG_ELF_CORE
zcat /proc/config.gz | grep CONFIG_COREDUMP
------------------------------------
c). Apalis TK1 當前V2.7b1版本kernel版本為3.10.40,查看結(jié)果如下
------------------------------------
ubuntu@tegra-ubuntu:~$ zcat /proc/config.gz | grepCONFIG_ELF_CORE
# CONFIG_ELF_CORE is not set
ubuntu@tegra-ubuntu:~$ zcat /proc/config.gz | grepCONFIG_COREDUMP
CONFIG_COREDUMP=y
------------------------------------
d). 下載kernel源代碼修改配置并重新編譯
由上面結(jié)果可見,當前TK1 kernel配置并未完整支持core dumps功能,需要下載對應kernel源代碼修改配置并重新編譯
./Apalis TK1 V2.7b1kernel源代碼下載以及重新編譯請見這里說明。
./如下修改”.config”
------------------------------------
//標記為”y”
->General Setup ->Configure standardkernel features (expert users) ->Enable ELF core dumps
->userspace binary formats ->Enable core dump support
------------------------------------
./重新編譯uImage按照如下方法將其替換到Apalis TK1上面
------------------------------------
//mount Apalis TK1 boot分區(qū)
ubuntu@tegra-ubuntu:~$sudomkdir /media/ubuntu/mmcblk0p1
ubuntu@tegra-ubuntu:~$sudomount -t vfat /dev/mmcblk0p1 /media/ubuntu/mmcblk0p1
//備份uimage
ubuntu@tegra-ubuntu:~$cd /media/ubuntu/mmcblk0p1
ubuntu@tegra-ubuntu:~$sudomv uimage uimage.bak
//復制新的uimage到boot分區(qū)
ubuntu@tegra-ubuntu:~$sudocp ../uimage .
//重啟
ubuntu@tegra-ubuntu:~$sudo reboot
------------------------------------
./重啟后再次查看兩個配置選項都為”y”配置完成狀態(tài)了
3). User Space打開core dumps功能并測試
a). User Space打開core dumps 功能
------------------------------------
//開啟core dumps并設(shè)置最大文件大小,或者為無限大;默認為0,意味著未開啟。
ubuntu@tegra-ubuntu:~$ ulimit-c 1024 (or unlimited)
//查看狀態(tài)
ubuntu@tegra-ubuntu:~$ ulimit -a
core file size (blocks, -c) unlimited
……
------------------------------------
b). 默認情況下在當前目錄下生成名為“core“的文件,每次運行會覆蓋原來文件,可以通過下面配置更改生成文件的命名,路徑以及格式
./將生成文件命名為”core.pid”,pid為應用程序的進程號,目錄還是當前目錄
------------------------------------
ubuntu@tegra-ubuntu:~$ sudosh -c "echo 1 >/proc/sys/kernel/core_uses_pid"
------------------------------------
./更進一步還可以通過設(shè)置下面來配置生成文件的目錄和格式,如下設(shè)置生成文件目錄為“/temp”,格式說明如下
------------------------------------
# %p –進程號
# %u –進程用戶id
# %g –進程用戶組id
# %s –生成core文件時收到的信號
# %t –生成core文件的時間戳(seconds since 0:00h, 1 Jan 1970)
# %h –主機名
# %e –程序文件名
ubuntu@tegra-ubuntu:~$ sudosh -c "echo "/tmp/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern"
------------------------------------
./另外,如果需要使用”suid”或者”gdui”權(quán)限運行程序,需要設(shè)置如下
------------------------------------
ubuntu@tegra-ubuntu:~$ sudosh -c "echo 2 > /proc/sys/fs/suid_dumpable"
------------------------------------
c). 測試core dumps功能
./編寫下面簡單程序用于測試core dumps功能
------------------------------------
#include
int main()
{
int *p = NULL;
std::cout<<*p<
return 0;
}
------------------------------------
./編譯并執(zhí)行,可以看到core dumps功能啟動了
------------------------------------
ubuntu@tegra-ubuntu:~$gcc -g -Wall -o coredump coredump.cpp -lstdc++
ubuntu@tegra-ubuntu:~$ ./coredump
Segmentation fault (core dumped)
------------------------------------
4). 查看core dumps 文件
利用GDB查看core dumps文件
------------------------------------
ubuntu@tegra-ubuntu:~$ gdb --core=/tmp/core-coredump-11-1000-1000-2072-1493286737
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free SoftwareFoundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free tochange and redistribute it.
There is NO WARRANTY, to the extentpermitted by law. Type "showcopying"
and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabihf".
Type "show configuration" for configurationdetails.
For bug reporting instructions, please see:
Find the GDB manual and other documentationresources online at:
For help, type "help".
Type "apropos word" to search forcommands related to "word".
[New LWP 2072]
Core was generated by `./coredump'.
Program terminated with signal SIGSEGV,Segmentation fault.
#0 0x000086c4 in ?? ()
(gdb)
------------------------------------
5). 為正常運行程序創(chuàng)建core dump
除了為異常退出程序創(chuàng)建core dump方法,頁可以使用gdb工具包里面的gcore功能為正常運行的程序創(chuàng)建core dump,基本語法如下,詳細情況這里就不多做描述了。
------------------------------------
gcore-o /tmp/… xxx(process ID)
------------------------------------
參考文檔
http://developer.toradex.com/knowledge-base/enable-and-analyze-coredumps-in-linux
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計算機模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測試