core分析

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, &current->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文件时的常用命令:

在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Linux 中,当一个进程遇到致命错误时,它会生成一个 core 文件,也称为核心转储文件。这个文件包含了进程的内存映像、寄存器状态等信息,可以用于分析进程崩溃的原因。 下面是一些常见的分析 core 文件的方法: 1. gdb 调试器 gdb 是一个强大的命令行调试器,可以用来分析 core 文件。简单的做法是通过命令行运行 `gdb <可执行文件> <core 文件>`,然后使用 gdb 的命令来查看内存、寄存器、堆栈等信息。 2. objdump 工具 objdump 工具可以用来分析 ELF 格式的可执行文件和 core 文件。使用 `objdump -f <core 文件>` 命令可以查看 core 文件的基本信息,使用 `objdump -s <core 文件>` 命令可以查看 core 文件的内存映像。 3. readelf 工具 readelf 工具也可以用来分析 ELF 格式的可执行文件和 core 文件。使用 `readelf -a <core 文件>` 命令可以查看 core 文件的基本信息,使用 `readelf -x <section> <core 文件>` 命令可以查看特定节的内容。 4. addr2line 工具 addr2line 工具可以将内存地址转换为源代码行号。使用 `addr2line -e <可执行文件> <内存地址>` 命令可以查看特定内存地址对应的源代码行号。 以上是一些常见的分析 core 文件的方法,但是对于复杂的程序崩溃,仍然需要耐心分析。同时,还可以使用其他工具和技术,如 Valgrind、strace、perf 等,来进一步分析进程崩溃的原因。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值