嵌入式Linux開打core dumps調(diào)試功能
1). 簡(jiǎn)介
在Linux下為了調(diào)試應(yīng)用程序可以選擇GDB方式運(yùn)行應(yīng)用程序進(jìn)行調(diào)試,這種方式也可以調(diào)試程序由于接收某些信號(hào)導(dǎo)致的異常退出。不過(guò)當(dāng)不具備直接GDB調(diào)試環(huán)境的情況下,我們也可以使用Core Dumps功能來(lái)調(diào)試程序異常退出的問(wèn)題
Core Dumps(核心轉(zhuǎn)儲(chǔ)),是操作系統(tǒng)當(dāng)應(yīng)用程序進(jìn)程接收到某些如“segmentation fault(段錯(cuò)誤)”或者“illegal instruction(非法指令)”等信號(hào)而退出停止運(yùn)行時(shí),會(huì)將包含當(dāng)時(shí)內(nèi)存和寄存器分配以及進(jìn)程狀態(tài)等信息寫成的一個(gè)文件,這個(gè)文件可以稍后使用gdb進(jìn)行分析來(lái)判定程序異常退出的原因,更多信息請(qǐng)見’man core’。
本文所演示的平臺(tái)來(lái)自于ToradexApalis TK1 ARM嵌入式平臺(tái),這是一個(gè)基于nVidiaTgera K1的ARM處理器,支持四核心Cortex-A15和192 CUDA核心的GPU。
2. 準(zhǔn)備
a).Apalis TK1 ARM核心版配合Apalis Ixora載板,連接調(diào)試串口UART1到開發(fā)主機(jī)方便調(diào)試。
b).Apalis TK1系統(tǒng)使用Toradex LinuxRelease V2.7b1,并安裝了nVidiaJetPack R21.5,具體的下載和更新方法請(qǐng)參考這里。
3). 查看Linux Kernel配置
由于Toradex ARM模塊產(chǎn)品Linux BSP默認(rèn)kernel是沒(méi)有打開的,因此可以在TK1模塊系統(tǒng)上面通過(guò)執(zhí)行下面命令測(cè)試是否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 當(dāng)前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é)果可見,當(dāng)前TK1 kernel配置并未完整支持core dumps功能,需要下載對(duì)應(yīng)kernel源代碼修改配置并重新編譯
./Apalis TK1 V2.7b1kernel源代碼下載以及重新編譯請(qǐng)見這里說(shuō)明。
./如下修改”.config”
------------------------------------
//標(biāo)記為”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
//復(fù)制新的uimage到boot分區(qū)
ubuntu@tegra-ubuntu:~$sudocp ../uimage .
//重啟
ubuntu@tegra-ubuntu:~$sudo reboot
------------------------------------
./重啟后再次查看兩個(gè)配置選項(xiàng)都為”y”配置完成狀態(tài)了
3). User Space打開core dumps功能并測(cè)試
a). User Space打開core dumps 功能
------------------------------------
//開啟core dumps并設(shè)置最大文件大小,或者為無(wú)限大;默認(rèn)為0,意味著未開啟。
ubuntu@tegra-ubuntu:~$ ulimit-c 1024 (or unlimited)
//查看狀態(tài)
ubuntu@tegra-ubuntu:~$ ulimit -a
core file size (blocks, -c) unlimited
……
------------------------------------
b). 默認(rèn)情況下在當(dāng)前目錄下生成名為“core“的文件,每次運(yùn)行會(huì)覆蓋原來(lái)文件,可以通過(guò)下面配置更改生成文件的命名,路徑以及格式
./將生成文件命名為”core.pid”,pid為應(yīng)用程序的進(jìn)程號(hào),目錄還是當(dāng)前目錄
------------------------------------
ubuntu@tegra-ubuntu:~$ sudosh -c "echo 1 >/proc/sys/kernel/core_uses_pid"
------------------------------------
./更進(jìn)一步還可以通過(guò)設(shè)置下面來(lái)配置生成文件的目錄和格式,如下設(shè)置生成文件目錄為“/temp”,格式說(shuō)明如下
------------------------------------
# %p –進(jìn)程號(hào)
# %u –進(jìn)程用戶id
# %g –進(jìn)程用戶組id
# %s –生成core文件時(shí)收到的信號(hào)
# %t –生成core文件的時(shí)間戳(seconds since 0:00h, 1 Jan 1970)
# %h –主機(jī)名
# %e –程序文件名
ubuntu@tegra-ubuntu:~$ sudosh -c "echo "/tmp/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern"
------------------------------------
./另外,如果需要使用”suid”或者”gdui”權(quán)限運(yùn)行程序,需要設(shè)置如下
------------------------------------
ubuntu@tegra-ubuntu:~$ sudosh -c "echo 2 > /proc/sys/fs/suid_dumpable"
------------------------------------
c). 測(cè)試core dumps功能
./編寫下面簡(jiǎn)單程序用于測(cè)試core dumps功能
------------------------------------
#include
int main()
{
int *p = NULL;
std::cout<<*p<
return 0;
}
------------------------------------
./編譯并執(zhí)行,可以看到core dumps功能啟動(dòng)了
------------------------------------
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). 為正常運(yùn)行程序創(chuàng)建core dump
除了為異常退出程序創(chuàng)建core dump方法,頁(yè)可以使用gdb工具包里面的gcore功能為正常運(yùn)行的程序創(chuàng)建core dump,基本語(yǔ)法如下,詳細(xì)情況這里就不多做描述了。
------------------------------------
gcore-o /tmp/… xxx(process ID)
------------------------------------
參考文檔
http://developer.toradex.com/knowledge-base/enable-and-analyze-coredumps-in-linux
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測(cè)試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測(cè)試