0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用gdb對(duì)core文件進(jìn)行調(diào)試

玩轉(zhuǎn)嵌入式 ? 來源:嵌入式大雜燴 ? 作者:雜燴君 ? 2022-10-26 11:12 ? 次閱讀

嵌入式Linux開發(fā)中,使用gdb對(duì)core文件進(jìn)行調(diào)試是一種有效的定位程序崩潰的方法。

有些知識(shí),在沒用到之前,可以簡單地進(jìn)行了解。實(shí)際用的時(shí)候,再去詳細(xì)地學(xué)習(xí)。最近我在實(shí)際工作中使用了gdb對(duì)core文件進(jìn)行調(diào)試,遇到了一些問題,總結(jié)出來分享給大家。

本文我們來分享幾點(diǎn):

什么是core文件?

前臺(tái)進(jìn)程如何生成core文件?

后臺(tái)進(jìn)程如何生成core文件?

如何調(diào)試core文件?

崩潰棧有用信息有限的可能原因?

什么是core文件?

在Linux下,一個(gè)程序崩潰時(shí),它一般會(huì)在指定目錄下生成一個(gè)core文件。core文件僅僅是一個(gè)內(nèi)存映象(同時(shí)加上調(diào)試信息),主要是用來調(diào)試的。

前臺(tái)進(jìn)程如何生成core文件?

實(shí)際中,我們的程序可以運(yùn)行于前臺(tái),也可以運(yùn)行于后臺(tái)。前、后臺(tái)運(yùn)行程序,生成core文件的方法有些不同。

前臺(tái)進(jìn)程:一般而言,用戶在shell中使用./執(zhí)行的程序都是前臺(tái)程序,前臺(tái)程序可由用戶自己控制,程序運(yùn)行過程中可與用戶進(jìn)行交互,其運(yùn)行優(yōu)先級(jí)相比后臺(tái)程序稍高,前臺(tái)程序運(yùn)行過程中用戶可使用ctrl+c來終止。

core文件配置基本命令:

ulimit-c#查看core文件是否打開
ulimit-a#也可以查看core文件是否打開
ulimit-c0#禁止產(chǎn)生core文件
ulimit-cunlimited#設(shè)置core文件大小為不限制大小
ulimit-c1024#限制產(chǎn)生的core文件的大小不能超過1024KB

core文件的轉(zhuǎn)儲(chǔ)文件目錄和命名規(guī)則是可以設(shè)置的。

通過配置/proc/sys/kernel/core_uses_pid可以控制產(chǎn)生的core文件的文件名中是否添加pid作為擴(kuò)展;

通過配置/proc/sys/kernel/core_pattern可以設(shè)置格式化的core文件保存位置或文件名。

比如:

設(shè)置core文件的文件名中是否添加pid作為擴(kuò)展

echo"1">/proc/sys/kernel/core_uses_pid

設(shè)置格式化的core文件保存位置或文件名

echo"/var/core-%e-%p-%t">/proc/sys/kernel/core_pattern

參數(shù)%e、%p、%t表示的意思如:

%p-insertpidintofilename添加pid
%u-insertcurrentuidintofilename添加當(dāng)前uid
%g-insertcurrentgidintofilename添加當(dāng)前gid
%s-insertsignalthatcausedthecoredumpintothefilename添加導(dǎo)致產(chǎn)生core的信號(hào)
%t-insertUNIXtimethatthecoredumpoccurredintofilename添加core文件生成時(shí)的unix時(shí)間
%h-inserthostnamewherethecoredumphappenedintofilename添加主機(jī)名
%e-insertcoredumpingexecutablenameintofilename添加可執(zhí)行程序名

下面開始進(jìn)行實(shí)操:

查看core文件是否有打開,并設(shè)置core文件大小為不限制大?。?/p>

b324f568-4851-11ed-a3b6-dac502259ad0.png

設(shè)置格式化的core文件保存位置或文件名:

b34cb012-4851-11ed-a3b6-dac502259ad0.png

測試代碼:

#include

intmain(intargc,char**argv)
{
printf("==================segmentationfaulttest==================
");

int*p=NULL;
*p=1234;

return0;
}

運(yùn)行測試程序生成core文件:

b3684ba6-4851-11ed-a3b6-dac502259ad0.png

后臺(tái)進(jìn)程如何生成core文件?

后臺(tái)程序生成core文件的方式與前臺(tái)程序不一樣。這我也是前幾天才知道的,我們?cè)O(shè)備上的程序設(shè)置為開機(jī)自啟動(dòng)運(yùn)行于后臺(tái),程序崩潰時(shí),竟然沒有生成core文件。后來查了些資料才知道后臺(tái)程序打開core文件的方式不同。

后臺(tái)進(jìn)程:后臺(tái)進(jìn)程又叫守護(hù)進(jìn)程,是運(yùn)行在系統(tǒng)后臺(tái)的一種特殊進(jìn)程,它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件,后臺(tái)進(jìn)程最大的特點(diǎn)就是不受終端控制。一般用作系統(tǒng)服務(wù),比如日志管理進(jìn)程rsyslogd,數(shù)據(jù)庫服務(wù)myspld等,當(dāng)然也有一些用戶程序因需要被放在后臺(tái)運(yùn)行,一般被放在/etc/ini.d/文件夾中設(shè)置開機(jī)自啟動(dòng)。

ulimit命令是有作用范圍的,ulimit限制的是當(dāng)前shell進(jìn)程以及其派生的子進(jìn)程,所以通過ulimit修改coresize只是針對(duì)在當(dāng)前shell下啟動(dòng)的子進(jìn)程,而不能影響其他shell下啟動(dòng)的進(jìn)程。

所以當(dāng)我們配置完成生成core dump的參數(shù)后,在當(dāng)前shell直接執(zhí)行的進(jìn)程發(fā)生崩潰時(shí)可以正常生成core,而后臺(tái)開機(jī)自啟動(dòng)的程序則無法生成,而實(shí)際總,嵌入式應(yīng)用程序一般都是開機(jī)自啟動(dòng)的,并且發(fā)送崩潰的時(shí)機(jī)也是不可預(yù)測的,那么使用這種方式就不能正確的去捕捉coredump文件了。

后臺(tái)進(jìn)程要生成core dump文件需在進(jìn)程代碼中開啟core dump功能,如:

左右滑動(dòng)查看全部代碼>>>

//公眾號(hào):嵌入式大雜燴
#include
#include
#include
#include

#defineSHELL_CMD_CONF_CORE_FILE"echo/var/core-%e-%p-%t>/proc/sys/kernel/core_pattern"
#defineSHELL_CMD_DEL_CORE_FILE"rm-f/var/core*"

staticintenable_core_dump(void)
{
intret=-1;
intresource=RLIMIT_CORE;
structrlimitrlim;

rlim.rlim_cur=1?RLIM_INFINITY:0;
rlim.rlim_max=1?RLIM_INFINITY:0;

system(SHELL_CMD_DEL_CORE_FILE);

if(0!=setrlimit(resource,&rlim))
{
printf("setrlimiterror!
");
return-1;
}
else
{
system(SHELL_CMD_CONF_CORE_FILE);
printf("SHELL_CMD_CONF_CORE_FILE
");
return0;
}

returnret;
}

intmain(intargc,char**argv)
{
enable_core_dump();

printf("==================segmentationfaulttest==================
");

int*p=NULL;
*p=1234;

return0;
}

讓程序開機(jī)運(yùn)行于后臺(tái):

在開發(fā)板/etc/init.d/目錄下新建文件S100Test:

#!/bin/sh
cd/home
./test

設(shè)置程序開機(jī)自啟動(dòng)可參考我們往期文章:《淺析程序開機(jī)自啟動(dòng)》

重啟設(shè)備,程序運(yùn)行崩潰時(shí)可生成core文件:

b47c107c-4851-11ed-a3b6-dac502259ad0.pngb6b58d14-4851-11ed-a3b6-dac502259ad0.png

調(diào)試core文件?

把core文件傳到pc端,使用arm-linux-gnueabihf-gdb對(duì)test程序進(jìn)行調(diào)試:

arm-linux-gnueabihf-gdbtest
core-filecore-test-190-119
b7131498-4851-11ed-a3b6-dac502259ad0.pngb7266ab6-4851-11ed-a3b6-dac502259ad0.png

崩潰棧信息有限?

這個(gè)demo比較簡單,可以很快定位到問題。實(shí)際中,我們的程序會(huì)依賴很多動(dòng)態(tài)庫,這時(shí)候在調(diào)試時(shí)需要設(shè)置庫的搜索路徑。

這些庫需要和板子上的庫對(duì)應(yīng)上,最好是用板子里的庫??梢园寻遄永镉玫降膸旆诺絇C上的某個(gè)路徑,假如放到/home/LinuxZn/lib這個(gè)路徑。

我們進(jìn)入gdb時(shí),可以輸入如下命令設(shè)置及查看庫信息:

setsolib-search-path/home/LinuxZn/lib
infosharedlibrary
b7ded1dc-4851-11ed-a3b6-dac502259ad0.png

有時(shí)候,加載庫信息之后,還是看不到有意義的崩潰棧。

有如下兩點(diǎn)需要確認(rèn):

應(yīng)用程序在編譯時(shí)沒有指定-g選項(xiàng),導(dǎo)致可執(zhí)行程序沒有調(diào)試信息。

板子里的libc庫和交叉編譯器所使用的libc庫版本不一致。

如果不一致,可以把交叉編譯器所使用的libc庫更新到板子里。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PID控制
    +關(guān)注

    關(guān)注

    10

    文章

    449

    瀏覽量

    39980
  • Linux開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    6875
  • GDB調(diào)試
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    1427

原文標(biāo)題:分享一種你可能不知道的bug定位方法

文章出處:【微信號(hào):玩轉(zhuǎn)嵌入式,微信公眾號(hào):玩轉(zhuǎn)嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    QEMU+GDB調(diào)試ARM程序

    通過GDB調(diào)試代碼的便利性無需贅言。我們直接以調(diào)試meta-hypervisor為示例進(jìn)行說明。
    的頭像 發(fā)表于 10-08 09:17 ?2771次閱讀

    使用GDB調(diào)試Linux應(yīng)用程序

    本篇講解使用GDB調(diào)試Linux應(yīng)用程序,以下以 `hellowld.c` 為例介紹 GDB調(diào)試入門。
    發(fā)表于 06-27 15:48 ?429次閱讀

    如何生成core文件?如何調(diào)試core文件?

    如何生成core文件?如何調(diào)試core文件?如何在gdb交互中查看所依賴庫是否正確加載?
    發(fā)表于 12-23 08:48

    GDB調(diào)試命令手冊(cè)

    GDB調(diào)試命令手冊(cè),感興趣的可以下載看看。
    發(fā)表于 11-05 16:36 ?9次下載

    GDB調(diào)試命令總結(jié)

    程序,開始調(diào)試的方式gdb program core //用gdb查看core dump文件,跟
    發(fā)表于 04-02 14:31 ?1107次閱讀

    嵌入式Linux的GDB調(diào)試環(huán)境建立

    remote :2345  注意:你的端口號(hào)必須與gdbserver開啟的端口號(hào)一致,這樣才能進(jìn)行通信?! 〗㈡溄雍?,就可以進(jìn)行調(diào)試了。調(diào)試在Host端,跟
    發(fā)表于 04-02 14:33 ?478次閱讀

    段錯(cuò)誤調(diào)試神器 - Core Dump詳解

    core大小為無限.?用gdb查看core文件: 下面我們可以在發(fā)生運(yùn)行時(shí)信號(hào)引起的錯(cuò)誤時(shí)發(fā)生core dump了. 發(fā)生
    發(fā)表于 04-02 14:34 ?1095次閱讀

    Linux應(yīng)用的GDB調(diào)試的原理及過程分析

    GDB調(diào)試是應(yīng)用程序在開發(fā)板上運(yùn)行,然后在PC機(jī)上對(duì)開發(fā)板上得應(yīng)用程序進(jìn)行調(diào)試,PC機(jī)運(yùn)行GDB,開發(fā)板上運(yùn)行GDBServer。在應(yīng)用程序
    發(fā)表于 03-05 09:44 ?3364次閱讀
    Linux應(yīng)用的<b class='flag-5'>GDB</b><b class='flag-5'>調(diào)試</b>的原理及過程分析

    實(shí)例演示GDB的使用

    GDB簡介 GDB(GNU Debugger)是一個(gè)強(qiáng)大的命令行調(diào)試工具。一般的,在Windows下進(jìn)行開發(fā),很少操控命令行調(diào)試,
    的頭像 發(fā)表于 10-19 09:58 ?2596次閱讀
    實(shí)例演示<b class='flag-5'>GDB</b>的使用

    GDB調(diào)試原理是什么?

    沒有用過,那只能說明你的開發(fā)經(jīng)歷還不夠坎坷,還需要繼續(xù)被 BUG吊打。 ? 我們都知道,在使用gcc編譯時(shí),可以使用-g選項(xiàng)在可執(zhí)行文件中嵌入更多的調(diào)試信息,那么具體嵌入了哪些調(diào)試信息?這些調(diào)
    的頭像 發(fā)表于 12-18 15:17 ?5689次閱讀

    嵌入式Linux GDB調(diào)試環(huán)境搭建與使用

    /跳出函數(shù)、設(shè)置斷點(diǎn)、查看變量等等。Ubuntu資源充足,可以直接用gdb調(diào)試程序。嵌入式Linux性能弱,一般PC上運(yùn)行源碼和GDB工具,可執(zhí)行文件在開發(fā)板上運(yùn)行。PC上通過
    發(fā)表于 11-01 17:59 ?8次下載
    嵌入式Linux <b class='flag-5'>GDB</b><b class='flag-5'>調(diào)試</b>環(huán)境搭建與使用

    在ubuntu中調(diào)試GDB

    編譯后會(huì)產(chǎn)生 gdbtest 文件 調(diào)試命令: gdb xxx 會(huì)出現(xiàn)一個(gè) (gdb)的指示符,等待你輸入命令,可用的命令如下: 當(dāng)然不止這些,還有很多,常用的就這幾個(gè)
    的頭像 發(fā)表于 07-27 16:31 ?963次閱讀
    在ubuntu中<b class='flag-5'>調(diào)試</b><b class='flag-5'>GDB</b>

    GDB調(diào)試工具的原理

    了。 1.2 執(zhí)行中進(jìn)程調(diào)試 如果想對(duì)一個(gè)已經(jīng)執(zhí)行的進(jìn)程進(jìn)行調(diào)試,那么就要在gdb這個(gè)父進(jìn)程中調(diào)用ptrace(PTRACE_ATTA
    的頭像 發(fā)表于 11-09 17:04 ?793次閱讀
    <b class='flag-5'>GDB</b><b class='flag-5'>調(diào)試</b>工具的原理

    如何使用GDB調(diào)試工具

    在對(duì)應(yīng)程序目錄中使用下面的命令 gdb test 2、調(diào)試已經(jīng)開始運(yùn)行的程序進(jìn)程 調(diào)試已經(jīng)開始運(yùn)行的程序進(jìn)程,首先先用top命令查看運(yùn)行的程序進(jìn)程的pid如下: 比如我要加載的程序
    的頭像 發(fā)表于 11-09 17:17 ?696次閱讀
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>調(diào)試</b>工具

    如何使用linux下gdb調(diào)試python程序

    GDB: ``` $ sudo apt install gdb ``` 安裝完成后,需要安裝Python調(diào)試符號(hào)。這些符號(hào)文件包含了Python解釋器的
    的頭像 發(fā)表于 01-31 10:41 ?2209次閱讀