色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用gdb對core文件進行調試

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

嵌入式Linux開發中,使用gdb對core文件進行調試是一種有效的定位程序崩潰的方法。

有些知識,在沒用到之前,可以簡單地進行了解。實際用的時候,再去詳細地學習。最近我在實際工作中使用了gdb對core文件進行調試,遇到了一些問題,總結出來分享給大家。

本文我們來分享幾點:

什么是core文件?

前臺進程如何生成core文件?

后臺進程如何生成core文件?

如何調試core文件?

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

什么是core文件?

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

前臺進程如何生成core文件?

實際中,我們的程序可以運行于前臺,也可以運行于后臺。前、后臺運行程序,生成core文件的方法有些不同。

前臺進程:一般而言,用戶在shell中使用./執行的程序都是前臺程序,前臺程序可由用戶自己控制,程序運行過程中可與用戶進行交互,其運行優先級相比后臺程序稍高,前臺程序運行過程中用戶可使用ctrl+c來終止。

core文件配置基本命令:

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

core文件的轉儲文件目錄和命名規則是可以設置的。

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

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

比如:

設置core文件的文件名中是否添加pid作為擴展

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

設置格式化的core文件保存位置或文件名

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

參數%e、%p、%t表示的意思如:

%p-insertpidintofilename添加pid
%u-insertcurrentuidintofilename添加當前uid
%g-insertcurrentgidintofilename添加當前gid
%s-insertsignalthatcausedthecoredumpintothefilename添加導致產生core的信號
%t-insertUNIXtimethatthecoredumpoccurredintofilename添加core文件生成時的unix時間
%h-inserthostnamewherethecoredumphappenedintofilename添加主機名
%e-insertcoredumpingexecutablenameintofilename添加可執行程序名

下面開始進行實操:

查看core文件是否有打開,并設置core文件大小為不限制大小:

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

設置格式化的core文件保存位置或文件名:

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

測試代碼:

#include

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

int*p=NULL;
*p=1234;

return0;
}

運行測試程序生成core文件:

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

后臺進程如何生成core文件?

后臺程序生成core文件的方式與前臺程序不一樣。這我也是前幾天才知道的,我們設備上的程序設置為開機自啟動運行于后臺,程序崩潰時,竟然沒有生成core文件。后來查了些資料才知道后臺程序打開core文件的方式不同。

后臺進程:后臺進程又叫守護進程,是運行在系統后臺的一種特殊進程,它獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件,后臺進程最大的特點就是不受終端控制。一般用作系統服務,比如日志管理進程rsyslogd,數據庫服務myspld等,當然也有一些用戶程序因需要被放在后臺運行,一般被放在/etc/ini.d/文件夾中設置開機自啟動。

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

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

后臺進程要生成core dump文件需在進程代碼中開啟core dump功能,如:

左右滑動查看全部代碼>>>

//公眾號:嵌入式大雜燴
#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;
}

讓程序開機運行于后臺:

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

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

設置程序開機自啟動可參考我們往期文章:《淺析程序開機自啟動》

重啟設備,程序運行崩潰時可生成core文件:

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

調試core文件?

把core文件傳到pc端,使用arm-linux-gnueabihf-gdb對test程序進行調試:

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

崩潰棧信息有限?

這個demo比較簡單,可以很快定位到問題。實際中,我們的程序會依賴很多動態庫,這時候在調試時需要設置庫的搜索路徑。

這些庫需要和板子上的庫對應上,最好是用板子里的庫。可以把板子里用到的庫放到PC上的某個路徑,假如放到/home/LinuxZn/lib這個路徑。

我們進入gdb時,可以輸入如下命令設置及查看庫信息:

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

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

有如下兩點需要確認:

應用程序在編譯時沒有指定-g選項,導致可執行程序沒有調試信息。

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

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






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PID控制
    +關注

    關注

    10

    文章

    460

    瀏覽量

    40091
  • Linux開發
    +關注

    關注

    0

    文章

    33

    瀏覽量

    6903
  • GDB調試
    +關注

    關注

    0

    文章

    24

    瀏覽量

    1447

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

文章出處:【微信號:玩轉嵌入式,微信公眾號:玩轉嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    QEMU+GDB調試ARM程序

    通過GDB調試代碼的便利性無需贅言。我們直接以調試meta-hypervisor為示例進行說明。
    的頭像 發表于 10-08 09:17 ?2909次閱讀

    使用GDB調試Linux應用程序

    本篇講解使用GDB調試Linux應用程序,以下以 `hellowld.c` 為例介紹 GDB調試入門。
    發表于 06-27 15:48 ?462次閱讀

    如何生成core文件?如何調試core文件

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

    GDB調試命令手冊

    GDB調試命令手冊,感興趣的可以下載看看。
    發表于 11-05 16:36 ?9次下載

    GDB調試命令總結

    程序,開始調試的方式gdb program core //用gdb查看core dump文件,跟
    發表于 04-02 14:31 ?1150次閱讀

    嵌入式Linux的GDB調試環境建立

    remote :2345  注意:你的端口號必須與gdbserver開啟的端口號一致,這樣才能進行通信。  建立鏈接后,就可以進行調試了。調試在Host端,跟
    發表于 04-02 14:33 ?518次閱讀

    段錯誤調試神器 - Core Dump詳解

    core大小為無限.?用gdb查看core文件: 下面我們可以在發生運行時信號引起的錯誤時發生core dump了. 發生
    發表于 04-02 14:34 ?1164次閱讀

    Linux應用的GDB調試的原理及過程分析

    GDB調試是應用程序在開發板上運行,然后在PC機上對開發板上得應用程序進行調試,PC機運行GDB,開發板上運行GDBServer。在應用程序
    發表于 03-05 09:44 ?3419次閱讀
    Linux應用的<b class='flag-5'>GDB</b><b class='flag-5'>調試</b>的原理及過程分析

    實例演示GDB的使用

    GDB簡介 GDB(GNU Debugger)是一個強大的命令行調試工具。一般的,在Windows下進行開發,很少操控命令行調試
    的頭像 發表于 10-19 09:58 ?2691次閱讀
    實例演示<b class='flag-5'>GDB</b>的使用

    GDB調試原理是什么?

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

    嵌入式Linux GDB調試環境搭建與使用

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

    在ubuntu中調試GDB

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

    GDB調試工具的原理

    了。 1.2 執行中進程調試 如果想對一個已經執行的進程進行調試,那么就要在gdb這個父進程中調用ptrace(PTRACE_ATTA
    的頭像 發表于 11-09 17:04 ?935次閱讀
    <b class='flag-5'>GDB</b><b class='flag-5'>調試</b>工具的原理

    如何使用GDB調試工具

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

    如何使用linux下gdb調試python程序

    GDB: ``` $ sudo apt install gdb ``` 安裝完成后,需要安裝Python調試符號。這些符號文件包含了Python解釋器的
    的頭像 發表于 01-31 10:41 ?2577次閱讀
    主站蜘蛛池模板: 天天色天天干天天| 国产看午夜精品理论片| 亚洲中文字幕手机版| 日韩视频中文字幕精品偷拍| 国产白丝JK被疯狂输出视频| X8X8拨牐拨牐X8免费视频8午夜| 亚洲视频在线观看地址| 无码专区久久综合久综合字幕 | 一个人的视频在线观看免费观看| 午夜亚洲WWW湿好大| 无套内射CHINESEHD熟女| 伸进同桌奶罩里摸她胸作文| 色色激情网| 无码专区久久综合久综合字幕| 神马伦理不卡午夜电影| 色婷婷激情AV精品影院| 色欲狠狠躁天天躁无码中文字幕| 十七岁日本免费完整版BD| 午夜神器18以下不能进免费| 成人性生交片无码免费看| 超碰人人澡人人胔| 成人无码在线超碰视频| 白洁在线观看| xxx性欧美在线观看| 高清视频在线观看SEYEYE| 国产精品第1页| 韩国女人高潮嗷嗷叫视频| 久久99精品国产自在自线| 蜜桃传媒在线观看| 琪琪的色原网站| 污文啊好棒棒啊好了| 亚洲精品久久YY5099| 诱人的秘书BD在线观看| 97人人爽人人爽人人人片AV| 扒开粉嫩的小缝末成年小美女| 成人精品综合免费视频| 国产女人视频免费观看| 久久99热狠狠色AV蜜臀| 欧美熟妇VIVOE精品| 午夜精品国产自在现线拍| 印度性hd18|