赞
踩
2、CORE分析
经过上面的铺垫,步入正题:如何进行core文件分析。在这之前,还需要简单介绍一些相关的知识:
2.1、CORE产生原理
应用程序在运行过程中由于各种异常导致退出,在满足一定条件下产生一个core文件。
通常core文件包含了程序运行时内存、寄存器状态、堆栈指针、内存信息以及函数调用堆栈信息。
core就是程序当前工作转改存储生成的一个文件,通过工具分析这个文件,可以辅助定位异常。
异常指针访问等异常会产生信号,内核在收到异常信号时产生core。
int get_signal(struct ksignal *ksig) { ... for (;;) { struct k_sigaction *ka; ... signr = dequeue_signal(current, ¤t->blocked, &ksig->info); ... /* Trace actually delivered signals. */ trace_signal_deliver(signr, &ksig->info, ka); ... if (sig_kernel_coredump(signr)) { if (print_fatal_signals) /*可以通过kernel.print-fatal-signals = 1进行设置,对应的节点是/proc/sys/kernel/print-fatal-signals。*/ print_fatal_signal(ksig->info.si_signo); /*打印当前信号及当前场景的栈信息。*/ proc_coredump_connector(current); do_coredump(&ksig->info); } ... } spin_unlock_irq(&sighand->siglock); ksig->sig = signr; return ksig->sig > 0; }
core关注的信号列表
#define sig_kernel_coredump(sig) siginmask(sig, SIG_KERNEL_COREDUMP_MASK)
#define SIG_KERNEL_COREDUMP_MASK (\
rt_sigmask(SIGQUIT) | rt_sigmask(SIGILL) | \
rt_sigmask(SIGTRAP) | rt_sigmask(SIGABRT) | \
rt_sigmask(SIGFPE) | rt_sigmask(SIGSEGV) | \
rt_sigmask(SIGBUS) | rt_sigmask(SIGSYS) | \
rt_sigmask(SIGXCPU) | rt_sigmask(SIGXFSZ) | \
SIGEMT_MASK )
各信号含义如下
signal.png
2.2、CORE参数配置
coredump文件默认存储位置与可执行文件在同一目录下,文件名默认为core.pid。
可以通过/proc/sys/kernel/core_pattern进行设置。
参数 含义
%p 出Core进程的PID
%u 出Core进程的UID
%s 造成Core的signal号
%t
出Core的时间,从1970-01-0100:00:00开始的秒数
%e 出Core进程对应的可执行文件名
通过echo “core-%e-%p-%s-%t” > /proc/sys/kernel/core_pattern。
还可以改变core存储路径:echo “/sbc/bin/log/core.%p” > /proc/sys/kernel/core_pattern
通过配置coredump_filter可以选择需在coredump的时候,将哪些内容dump到core文件中。
coredump_filter比特位
含义
bit 0 anonymous private memory
bit 1 anonymous shared memory
bit 2 file-backed private memory
bit 3 file-backed shared memory
bit 4 ELF header pages in file-backed private memory areas (it is effective only if the bit 2 is cleared)
bit 5 hugetlb private memory
bit 6
hugetlb shared memory
bit 7 DAX private memory
bit 8 DAX shared memory
coredump_filter的默认值是0x33(SBC额外设置了bit6,即0x73),也即发生coredump时会将所有anonymous内存、ELF头页面、hugetlb private memory内容保存。。
core文件大小设置,建议在进程初始化时通过setrlimit系统调用自定义设置,不是非常推荐ulimit -c的方式设置。
通过以下命令查看进程core limit是否符合预期:
[root@localhost build_sbc_dpdk]# cat /proc/5692/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 1048576 1048576 bytes Max core file size unlimited unlimited bytes #如果此行为0,说明不会产生core Max resident set unlimited unlimited bytes Max processes 256254 256254 processes Max open files 1024 1024 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 256254 256254 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
2.3、CORE文件分析
通过以下命令行查看core文件:gdb [exec file] [core file] # 注意gdb版本建议和编译链一致,否则堆栈回溯时可能不准确。
例如: gdb791 versions_physical_SPLAT_Release_bgw core.3716
分析core文件时的常用命令:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。