九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Linux Core Dump
userphoto

2023.04.25 廣東

關(guān)注

當(dāng)程序運(yùn)行的過(guò)程中異常終止或崩潰,操作系統(tǒng)會(huì)將程序當(dāng)時(shí)的內(nèi)存狀態(tài)記錄下來(lái),保存在一個(gè)文件中,這種行為就叫做Core Dump(中文有的翻譯成“核心轉(zhuǎn)儲(chǔ)”)。我們可以認(rèn)為 core dump 是“內(nèi)存快照”,但實(shí)際上,除了內(nèi)存信息之外,還有些關(guān)鍵的程序運(yùn)行狀態(tài)也會(huì)同時(shí) dump 下來(lái),例如寄存器信息(包括程序指針、棧指針等)、內(nèi)存管理信息、其他處理器和操作系統(tǒng)狀態(tài)和信息。core dump 對(duì)于編程人員診斷和調(diào)試程序是非常有幫助的,因?yàn)閷?duì)于有些程序錯(cuò)誤是很難重現(xiàn)的,例如指針異常,而 core dump 文件可以再現(xiàn)程序出錯(cuò)時(shí)的情景。

Core Dump 名詞解釋

在半導(dǎo)體作為電腦內(nèi)存材料之前,電腦內(nèi)存使用的是 磁芯內(nèi)存(Magnetic Core Memory),Core Dump 中的 Core 沿用了磁芯內(nèi)存的 Core 表達(dá)。圖為磁芯內(nèi)存的一個(gè)單元,來(lái)自 Wikipedia.

在 APUE 一書中作者有句話這樣寫的:

Because the file is named core, it shows how long this feature has been part of the Unix System.

這里的 core 就是沿用的是早期電腦磁芯內(nèi)存中的表達(dá),也能看出 Unix 系統(tǒng) Core Dump 機(jī)制的悠久歷史。

Dump 指的是拷貝一種存儲(chǔ)介質(zhì)中的部分內(nèi)容到另一個(gè)存儲(chǔ)介質(zhì),或者將內(nèi)容打印、顯示或者其它輸出設(shè)備。dump 出來(lái)的內(nèi)容是格式化的,可以使用一些工具來(lái)解析它。

現(xiàn)代操作系統(tǒng)中,用 Core Dump 表示當(dāng)程序異常終止或崩潰時(shí),將進(jìn)程此時(shí)的內(nèi)存中的內(nèi)容拷貝到磁盤文件中存儲(chǔ),以方便編程人員調(diào)試。

Core Dump 如何產(chǎn)生

上面說(shuō)當(dāng)程序運(yùn)行過(guò)程中異常終止崩潰時(shí)會(huì)發(fā)生 core dump,但還沒說(shuō)到什么具體的情景程序會(huì)發(fā)生異常終止或崩潰,例如我們使用 kill -9 命令殺死一個(gè)進(jìn)程會(huì)發(fā)生 core dump 嗎?實(shí)驗(yàn)證明是不能的,那么什么情況會(huì)產(chǎn)生呢?

Linux 中信號(hào)是一種異步事件處理的機(jī)制,每種信號(hào)對(duì)應(yīng)有其默認(rèn)的操作,你可以在 這里 查看 Linux 系統(tǒng)提供的信號(hào)以及默認(rèn)處理。默認(rèn)操作主要包括忽略該信號(hào)(Ingore)、暫停進(jìn)程(Stop)、終止進(jìn)程(Terminate)、終止并發(fā)生core dump(core)等。如果我們信號(hào)均是采用默認(rèn)操作,那么,以下列出幾種信號(hào),它們?cè)诎l(fā)生時(shí)會(huì)產(chǎn)生 core dump:

SignalActionComment
SIGQUIT Core Quit from keyboard
SIGILL Core Illegal Instruction
SIGABRT Core Abort signal from abort
SIGSEGV Core Invalid memory reference
SIGTRAP Core Trace/breakpoint trap

當(dāng)然不僅限于上面的幾種信號(hào)。這就是為什么我們使用 Ctrl+z 來(lái)掛起一個(gè)進(jìn)程或者 Ctrl+C 結(jié)束一個(gè)進(jìn)程均不會(huì)產(chǎn)生 core dump,因?yàn)榍罢邥?huì)向進(jìn)程發(fā)出 SIGTSTP 信號(hào),該信號(hào)的默認(rèn)操作為暫停進(jìn)程(Stop Process);后者會(huì)向進(jìn)程發(fā)出SIGINT 信號(hào),該信號(hào)默認(rèn)操作為終止進(jìn)程(Terminate Process)。同樣上面提到的 kill -9 命令會(huì)發(fā)出 SIGKILL 命令,該命令默認(rèn)為終止進(jìn)程。而如果我們使用 Ctrl+\ 來(lái)終止一個(gè)進(jìn)程,會(huì)向進(jìn)程發(fā)出 SIGQUIT 信號(hào),默認(rèn)是會(huì)產(chǎn)生 core dump 的。還有其它情景會(huì)產(chǎn)生 core dump, 如:程序調(diào)用 abort() 函數(shù)、訪存錯(cuò)誤、非法指令等等。

下面舉兩個(gè)例子來(lái)說(shuō)明:

  • 終端下比較 Ctrl+C 和 Ctrl+\

    guohailin@guohailin:~$ sleep 10        #使用sleep命令休眠 10 s
    ^C                           #使用 Ctrl+C 終止該程序,不會(huì)產(chǎn)生 core dump
    guohailin@guohailin:~$ sleep 10
    ^\Quit (core dumped)                #使用 Ctrl+\ 退出程序, 會(huì)產(chǎn)生 core dump
    guohailin@guohailin:~$ ls         #多出下面一個(gè) core 文件
    -rw-------  1 guohailin guohailin 335872 10月 22 11:31 sleep.core.21990
    
  • 小程序產(chǎn)生 core dump

    #include <stdio.h>
    
    int main()
    {
        int *null_ptr = NULL;
        *null_ptr = 10;            //對(duì)空指針指向的內(nèi)存區(qū)域?qū)?會(huì)發(fā)生段錯(cuò)誤
        return 0;
    }
    
    #編譯執(zhí)行
    guohailin@guohailin:~$ ./a.out
    Segmentation fault (core dumped)
    guohailin@guohailin:~$ ls      #多出下面一個(gè) core 文件
    -rw-------  1 guohailin guohailin 200704 10月 22 11:35 a.out.core.22070    
    

Linux 下打開 Core Dump

我使用的 Linux 發(fā)行版是 Ubuntu 13.04,設(shè)置生成 core dump 文件的方法如下:

  • 打開 core dump 功能

    • 在終端中輸入命令 ulimit -c ,輸出的結(jié)果為 0,說(shuō)明默認(rèn)是關(guān)閉 core dump 的,即當(dāng)程序異常終止時(shí),也不會(huì)生成 core dump 文件。
    • 我們可以使用命令 ulimit -c unlimited 來(lái)開啟 core dump 功能,并且不限制 core dump 文件的大小; 如果需要限制文件的大小,將 unlimited 改成你想生成 core 文件最大的大小,注意單位為 blocks(KB)。
    • 用上面命令只會(huì)對(duì)當(dāng)前的終端環(huán)境有效,如果想需要永久生效,可以修改文件 /etc/security/limits.conf文件,關(guān)于此文件的設(shè)置參看 這里 。增加一行:
    # /etc/security/limits.conf
    #
    #Each line describes a limit for a user in the form:
    #
    #<domain>   <type>   <item>   <value>
        *          soft     core   unlimited
    
  • 修改 core 文件保存的路徑

    • 默認(rèn)生成的 core 文件保存在可執(zhí)行文件所在的目錄下,文件名就為 core。
    • 通過(guò)修改 /proc/sys/kernel/core_uses_pid 文件可以讓生成 core 文件名是否自動(dòng)加上 pid 號(hào)。
      例如 echo 1 > /proc/sys/kernel/core_uses_pid ,生成的 core 文件名將會(huì)變成 core.pid,其中 pid 表示該進(jìn)程的 PID。
    • 還可以通過(guò)修改 /proc/sys/kernel/core_pattern 來(lái)控制生成 core 文件保存的位置以及文件名格式。
      例如可以用 echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern 設(shè)置生成的 core 文件保存在 “/tmp/corefile” 目錄下,文件名格式為 “core-命令名-pid-時(shí)間戳”。這里 有更多詳細(xì)的說(shuō)明!

使用 gdb 調(diào)試 Core 文件

產(chǎn)生了 core 文件,我們?cè)撊绾问褂迷?Core 文件進(jìn)行調(diào)試呢?Linux 中可以使用 GDB 來(lái)調(diào)試 core 文件,步驟如下:

  • 首先,使用 gcc 編譯源文件,加上 -g 以增加調(diào)試信息;
  • 按照上面打開 core dump 以使程序異常終止時(shí)能生成 core 文件;
  • 運(yùn)行程序,當(dāng)core dump 之后,使用命令 gdb program core 來(lái)查看 core 文件,其中 program 為可執(zhí)行程序名,core 為生成的 core 文件名。

下面用一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明:

#include <stdio.h>
int func(int *p)
{
    int y = *p;
    return y;
}
int main()
{
    int *p = NULL;
    return func(p);
}

編譯加上調(diào)試信息, 運(yùn)行之后core dump, 使用 gdb 查看 core 文件.

guohailin@guohailin:~$ gcc core_demo.c -o core_demo -g
guohailin@guohailin:~$ ./core_demo 
Segmentation fault (core dumped)

guohailin@guohailin:~$ gdb core_demo core_demo.core.24816
...
Core was generated by './core_demo'.
Program terminated with signal 11, Segmentation fault.
#0  0x080483cd in func (p=0x0) at core_demo.c:5
5       int y = *p;
(gdb)  where
#0  0x080483cd in func (p=0x0) at core_demo.c:5
#1  0x080483ef in main () at core_demo.c:12
(gdb) info frame
Stack level 0, frame at 0xffd590a4:
 eip = 0x80483cd in func (core_demo.c:5); saved eip 0x80483ef
 called by frame at 0xffd590c0
 source language c.
 Arglist at 0xffd5909c, args: p=0x0
 Locals at 0xffd5909c, Previous frame's sp is 0xffd590a4
 Saved registers:
  ebp at 0xffd5909c, eip at 0xffd590a0
(gdb) 

從上面可以看出,我們可以還原 core_demo 執(zhí)行時(shí)的場(chǎng)景,并使用 where 可以查看當(dāng)前程序調(diào)用函數(shù)棧幀, 還可以使用 gdb 中的命令查看寄存器,變量等信息.

參考資料

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
詳談 UNIX 環(huán)境進(jìn)程異常退出
coredump簡(jiǎn)介與coredump原因總結(jié)
什么是Segmentationfault(CoreDump)?+我遇到的實(shí)例問(wèn)題
core dump
linux下產(chǎn)生core文件以及不產(chǎn)生core文件的條件
總線錯(cuò)誤與段錯(cuò)誤
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服