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中找 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
4. 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模板中使用變量還很多,,見下面的列表:
如果在上述文件名中包含目錄分隔符”/“,,那么所生成的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è)置 ============================================== 問題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ò)...) the signal "SIGPIPE " ended your program. 我只知道有兩種可能 很多信號默認(rèn)的處理就是退出 初學(xué)者大部分的原因都是訪問了不該訪問的內(nèi)存,,這里面絕大多數(shù)又是因?yàn)樵L問零地址或內(nèi)存溢出 |
|