工控網(wǎng)首頁
>

應用設(shè)計

>

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

嵌入式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 測試