久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

core dump

 t涂鴉 2011-11-30

1. 在嵌入式系統(tǒng)中,,有時(shí)core dump直接從串口打印出來,,結(jié)合objdump查找ra和epa地址,,運(yùn)用?;厮?,可以找到程序出錯(cuò)的地方,。

2. 在一般Linux系統(tǒng)中,默認(rèn)是不會(huì)產(chǎn)生core dump文件的,,通過ulimit -c來查看core dump文件的大小,,一般開始是0,可以設(shè)置core文件大小,,ulimit -c 1024(kbytes單位)或者ulimit -c unlimited,。

3. core dump文件輸出設(shè)置,一般默認(rèn)是當(dāng)前目錄,,可以在/proc/sys/kernel中找到core-user-pid,,通過

echo "1" > /proc/sys/kernel/core-user-pid使core文件名加上pid號,還可以用

mkdir -p /root/corefile

echo "/root/corefile/core-%e-%p-%t" > /proc/sys/kernel/core-pattern控制core文件保存位置和文件名格式,。

以下是參數(shù)列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加當(dāng)前uid
    %g - insert current gid into filename 添加當(dāng)前gid
    %s - insert signal that caused the coredump into the filename 添加導(dǎo)致產(chǎn)生core的信號
    %t - insert UNIX time that the coredump occurred into filename 添加core文件生成時(shí)的unix時(shí)間
    %h - insert hostname where the coredump happened into filename 添加主機(jī)名
    %e - insert coredumping executable name into filename 添加命令名

4. 用gdb查看core文件:
下面我們可以在發(fā)生運(yùn)行時(shí)信號引起的錯(cuò)誤時(shí)發(fā)生core dump了.編譯時(shí)加上-g
發(fā)生core dump之后, 用gdb進(jìn)行查看core文件的內(nèi)容, 以定位文件中引發(fā)core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在進(jìn)入gdb后, 用bt命令查看backtrace以檢查發(fā)生程序運(yùn)行到哪里, 來定位core dump的文件行.

5. 給個(gè)例子

test.c

 

void a()

{

   char *p = NULL;

   printf("%d/n", *p);

}

 

int main()

{

    a();

    return 0;

}

 

編譯 gcc -g -o test test.c

運(yùn)行 ./test

報(bào)segmentation fault(core dump)

gdb ./test test.core如果生成的是test.core.


開發(fā)過程中,,當(dāng)一個(gè)Linux程序異常退出時(shí),我們可以通過core文件來分析它異常的詳細(xì)原因,。缺省情況下,,Linux在程序異常時(shí)不產(chǎn)生core文件,要想讓程序異常退出時(shí)產(chǎn)生core dump文件,,需要使用ulimit命令更改coredump的設(shè)置:

ulimit -c unlimited 

上面的命令表示在程序異常時(shí)產(chǎn)生core dump文件,,并且不對core dump文件的大小進(jìn)行限制。

上述設(shè)置只是使能了core dump功能,,缺省情況下,,內(nèi)核在coredump時(shí)所產(chǎn)生的core文件放在與該程序相同的目錄中,并且文件名固定為core,。很顯然,,如果有多個(gè)程序產(chǎn)生core文件,或者同一個(gè)程序多次崩潰,,就會(huì)重復(fù)覆蓋同一個(gè)core文件。

我們通過修改kernel的參數(shù),,可以指定內(nèi)核所生成的coredump文件的文件名,。例如,,Easwy使用下面的命令使kernel生成名字為core.filename.pid格式的core dump文件:

echo 'core.%e.%p' > /proc/sys/kernel/core_pattern 

這樣配置后,產(chǎn)生的core文件中將帶有崩潰的程序名,、以及它的進(jìn)程ID,。上面的%e%p會(huì)被替換成程序文件名以及進(jìn)程ID。

可以在core_pattern模板中使用變量還很多,,見下面的列表:

  • %% 單個(gè)%字符
  • %p 所dump進(jìn)程的進(jìn)程ID
  • %u 所dump進(jìn)程的實(shí)際用戶ID
  • %g 所dump進(jìn)程的實(shí)際組ID
  • %s 導(dǎo)致本次core dump的信號
  • %t core dump的時(shí)間 (由1970年1月1日計(jì)起的秒數(shù))
  • %h 主機(jī)名
  • %e 程序文件名

如果在上述文件名中包含目錄分隔符”/“,,那么所生成的core文件將會(huì)被放到指定的目錄中。

需要說明的是,,在內(nèi)核中還有一個(gè)與coredump相關(guān)的設(shè)置,,就是/proc/sys/kernel/core_uses_pid。如果這個(gè)文件的內(nèi)容被配置成1,,那么即使core_pattern中沒有設(shè)置%p,,最后生成的core dump文件名仍會(huì)加上進(jìn)程ID。

對所生成的core dump進(jìn)程分析,,需要使用調(diào)試工具,,例如GDB等??梢詤⒁?a class="link" href="http:///blog/" target="_top" style="color: rgb(68, 161, 208); text-decoration: none; ">Easwy的其它文章,。

原創(chuàng)文章,請閱讀頁腳的許可方式,,轉(zhuǎn)載請注明:轉(zhuǎn)載自易水博客 [ http:///blog/ ]



http://blog.163.com/chujb_chen/blog/static/10571112011410112118895/

core dump 分析  

2011-05-10 11:21:18|  分類: 精品轉(zhuǎn)載|字號 訂閱

源地址:http://www./tech/core_dump_analysis.html
一,、簡介

core dump 又叫核心轉(zhuǎn)儲(chǔ),當(dāng)程序異常退出時(shí)(crashed),,由操作系統(tǒng)把程序當(dāng)前的內(nèi)存狀況存儲(chǔ)在 core 文件中,,叫 core dump。其中可能包括:處理機(jī)狀態(tài),、進(jìn)程狀態(tài),、棧指針等調(diào)試信息。

二,、coredump 文件生成

查看 coredump 文件路徑
sysctl –A | grep kernel.core_pattern 或者 cat /proc/sys/kernel/core_pattern

指定 core dump 文件的生成路徑和格式:

%p – insert pid into filename 添加pid
%u – insert current uid into filename 添加當(dāng)前uid
%g – insert current gid into filename 添加當(dāng)前gid
%s – insert signal that caused the coredump into the filename 添加導(dǎo)致產(chǎn)生core的信號
%t – insert UNIX time that the coredump occurred into filename 添加core文件生成時(shí)的unix時(shí)間
%h – insert hostname where the coredump happened into filename 添加主機(jī)名
%e – insert coredumping executable name into filename 添加命令名
例: core_pattern=/data/coredump/core_%e-%p-%t

查看 core dump 文件大小限制 ulimit -c
ulimit –c 4 設(shè)置允許生成的 coredump 文件最大為 4 K
ulimit –c unlimited 不限制 coredump 文件的大小
-S 設(shè)置軟件資源限制
-H 設(shè)置硬件資源限制
導(dǎo)致生成 coredump 的信號
更多信號量默認(rèn)處理方式,,請查閱:http://www./doc/man-pages/online/pages/man7/signal.7.html

使用 install 替代 cp 更新 so 文件,預(yù)防 coredump

使用 gcore 命令,,強(qiáng)制生成 core dump 文件

Linux 源碼跟蹤(源碼版本:linux-2.6.38.4)
core dump 生成:

// kernel/signal.c
int get_signal_to_deliver(siginfo_t *info
            , struct k_sigaction *return_ka
            , struct pt_regs *regs
            , void *cookie)
//符合 SIG_KERNEL_COREDUMP_MASK 將調(diào)用 coredump 過程
// fs/exec.c
void do_coredump(long signr
            , int exit_code
            , struct pt_regs *regs)

core 文件寫入核心代碼:

//源碼路徑:arch/powerpc/platforms/cell/spufs/coredump.c
static int spufs_dump_write(struct file *file
                                , const void *addr
                                , int nr
                                , loff_t *foffset)
{
    unsigned long limit = rlimit(RLIMIT_CORE);
    ssize_t written;
    if (*foffset + nr > limit)
        return -EIO;
    written = file->;f_op->write(file, addr, nr, &file->f_pos);
    *foffset += written;
    if (written != nr)
        return -EIO;
    return 0;
}

從 第 9 行,,可以看到,core dump 在寫入之前,,會(huì)做一個(gè)判斷,,如果 coredump 數(shù)據(jù)超過設(shè)置,將不會(huì)生成 coredump 文件。

三,、core dump 文件信息

void do_coredump(long signr
        , int exit_code
        , struct pt_regs *regs) {
    struct core_state core_state; //
    struct core_name cn; //
    struct mm_struct *mm = current->mm; //
    struct linux_binfmt * binfmt; //
    const struct cred *old_cred; //
    struct cred *cred; //
    ......
    binfmt = mm->;binfmt; //取得當(dāng)前程序加載器
    if (!binfmt || !binfmt->core_dump)
        goto fail;
    if (!__get_dumpable(cprm.mm_flags))
        goto fail;
    ......
}
// fs/binfmt_elf.c
static int fill_note_info(struct elfhdr *elf
        , int phdrs
        , struct elf_note_info *info
        , long signr
        , struct pt_regs *regs) {
    ......
    fill_prstatus(info->;prstatus, current, signr);
    elf_core_copy_regs(&info->prstatus->pr_reg, regs);
    fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS, ELF_OSABI);
    ......
    //try to dump fpu(浮點(diǎn)運(yùn)算單元)
    elf_core_copy_task_fpregs(current, regs, info->fpu);
    ......
}

在 Linux 下,,core dump 文件格式一般為 ELF。分析 core dump 文件信息,,可以從 do_coredump 程序開始(內(nèi)容太多,,再補(bǔ))。

四,、定位問題

gdb 調(diào)試工具

附帶參數(shù) gdb –args you_prog prog_params
進(jìn)程加載的 so 引發(fā) coredump,,需要計(jì)算 so 的加載地址。
系統(tǒng)參數(shù) /proc/sys/kernel/random_va_space 為 1 ,,表示隨機(jī) mmap 位置,,增加 buffer 溢出攻擊難度;另一方面,,可能會(huì)影響調(diào)試,, core 后重啟, so 加載地址可能已經(jīng)變化……
addr2line

valgrind (推薦使用)

valgrind –leak-check=full your_prog
五,、參考資料

內(nèi)存檢查性能分析工具 http://www.
http:///binutils/docs-2.21/
http://www.
http://www./doc/man-pages/online/pages/man7/signal.7.html

問題:1. 生成的core   dump保存路徑在哪里,怎么設(shè)置 

============================================== 
default   it 's   in   the   initial   directory   of   your   running   the   program


問題2.我的多線程程序在通過socket   連接同其它進(jìn)程通訊,,在對方進(jìn)程退出或shutdown   時(shí)也幾乎同時(shí)退出??墒俏业某绦驔]有輸出任何在程序正常退出時(shí)肯定會(huì)顯示的提示信息而直接退出,,也沒有產(chǎn)生   core   dump   文件,不知道這是什么原因,。 請問哪位知道:   進(jìn)程異常退出時(shí)   Unix   在什么情況下會(huì)不產(chǎn)生   core   dump   文件,? 

產(chǎn)生   core   dump   文件,一般是程序異常中止(堆棧返回錯(cuò)誤,內(nèi)存訪問出錯(cuò)...) 
是否產(chǎn)成core   dump文件,程序可以控制,產(chǎn)生的core   dump文件的大小,程序也可以控制,命令也可設(shè)置; 
需要root權(quán)限;

the   signal   "SIGPIPE "   ended   your   program.

我只知道有兩種可能 
一種是產(chǎn)生core的一個(gè)信號被忽略了,,進(jìn)程收到信號就直接退出,。 
另一種是文件可以產(chǎn)生,但沒法寫到硬盤上,,空間不夠,,沒有權(quán)限等等原因。

很多信號默認(rèn)的處理就是退出

初學(xué)者大部分的原因都是訪問了不該訪問的內(nèi)存,,這里面絕大多數(shù)又是因?yàn)樵L問零地址或內(nèi)存溢出




    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多