工控網(wǎng)首頁(yè)
>

應(yīng)用設(shè)計(jì)

>

嵌入式Linux開(kāi)打core dumps調(diào)試功能

嵌入式Linux開(kāi)打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)等信息寫(xiě)成的一個(gè)文件,這個(gè)文件可以稍后使用gdb進(jìn)行分析來(lái)判定程序異常退出的原因,更多信息請(qǐng)見(jiàn)’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到開(kāi)發(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)有打開(kā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é)果可見(jiàn),當(dāng)前TK1 kernel配置并未完整支持core dumps功能,需要下載對(duì)應(yīng)kernel源代碼修改配置并重新編譯

./Apalis TK1 V2.7b1kernel源代碼下載以及重新編譯請(qǐng)見(jiàn)這里說(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打開(kāi)core dumps功能并測(cè)試

a). User Space打開(kāi)core dumps 功能

------------------------------------

//開(kāi)啟core dumps并設(shè)置最大文件大小,或者為無(wú)限大;默認(rèn)為0,意味著未開(kāi)啟。

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功能

./編寫(xiě)下面簡(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

審核編輯(
王靜
)
投訴建議

提交

查看更多評(píng)論
其他資訊

查看更多

Verdin AM62 LVGL 移植

基于 NXP iMX8MM 測(cè)試 Secure Boot 功能

隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊

Verdin iMX8MP 調(diào)試串口更改

NXP iMX8MM Cortex-M4 核心 GPT Capture 測(cè)試