如何没有core文件时,使用syslog中的打印信息定位程序core的原因

异常打印:

  有时候在生产环境中因为种种原因,进程coredump以后没有生成core文件。但是一般会在syslog中都会有如下的打印,这将是我们分析异常的关键。

 

Mar 26 10:17:37 ywh-virtual-machine kernel: [ 1818.141888] a.out[34255]: segfault at 40 ip 0000560811a8c250 sp 00007ffe890cdb20 error 4 in a.out[560811a8c000+1000]
Mar 26 10:17:37 ywh-virtual-machine kernel: [ 1818.141950] Code: f3 0f 1e fa 55 48 89 e5 be ff ff 00 00 bf 01 00 00 00 e8 9c ff ff ff 5d c3 90 f3 0f 1e fa 55 48 89 e5 48 89 7d f8 48 8b 45 f8 <8b> 40 40 5d c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 41 57

 

错误分析:

segfault at 40 ip 0000560811a8c250 sp 00007ffe890cdb20 error 4 in a.out[560811a8c000+1000]

  1. error 4 :

    error number是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7.
    bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
    bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
    bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址
 
    所以错误error 4,转换成二进制就是:110 ,即bit2=1, bit1=0, bit0=0, 按照上面的解释,我们可以得出程序异常是由于用户态非法读操作造成的。
  
  2. at 40
     这个是指发生错误的内存位置,如果是0表示就是访问了空指针了,也有可能也不是0。如果是通过空指针访问对象成员,这个值可能是成员的偏移量。
     通过使用GDB查看对象成员的偏移地址(需要先通过3. ip 000055c2905b1250 找到异常位置,感觉这里更多的是验证,如果是非法读了正常地址,结合readelf,作用大一些)
    
(gdb) p ((test_core*)0)->c
Cannot access memory at address 0x40

    下文示例程序中通过 get_c() 获取对象成员c的值,成员c的在对象中的偏移量就是 0x40,基本可以确定就是这里非法读了。

    ps:一般比较小的地址都是空指针导致,正常地址都是是比较大的。

   3. ip 000055c2905b1250

    这个就是CPU当前执行的指令地址,也就是这句指令导致core的,可以通过使用addr2line工具解析。

    

addr2line -e a.out 0000555555555250

  我可以知道程序在哪一行崩溃的。如果进程没有带gdb调试信息,我们可以取一个相同版本代码编译一个带gdb的进程,获取行号信息。

 

  4. sp 00007ffe890cdb20

   程序栈指针,可以定位出当前程序在哪个函数中执行时core的。

  

  5.  in a.out[560811a8c000+1000]

  

  6. a.out[34255]
  进程的名字,以及进程的pid。

示例程序:

  程序创建了一个空对象指针,然后通过这个指针调用对象方法,访问对象成员。

#include<iostream>

using namespace std;
class test_core
{
    test_core(void);
    ~test_core();
public:
    void set_c(int c){
        this->c = c;
    };
    int get_c(void){
        return this->c;
    }

private:
    int a;
    int b[15];
    int c;
};
int main() { test_core *p = NULL; p->get_c(); return 0; }

  

 
posted @ 2022-03-26 11:11  核心已转储  阅读(160)  评论(0)    收藏  举报