• 使用系统日志定位coredump


    1.message系统日志配置

    1.1 在debian系linux系统中对应的是/etc/rsyslog.conf和rsyslogd。

    通过查看rsyslog.conf文件,发现所有的配置文件都在/etc/rsyslog.d/文件夹下。

    # /etc/rsyslog.conf Configuration file for rsyslog. 
    # 
    # For more information see 
    # /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html 
    # 
    # Default logging rules can be found in /etc/rsyslog.d/50-default.conf 
    … … 
    # 
    # Include all config files in /etc/rsyslog.d/ 
    # 
    $IncludeConfig /etc/rsyslog.d/*.conf

    用vim打开/etc/rsyslog.d/50-default.conf文件增加一行内容如下:

    *.info;mail.none;authpriv.none;cron.none /var/log/messages

    重启系统,再来查看系统日志

    1.2 在centos系配置/etc/syslog.conf。

    /etc/syslog.conf文件中的一项配置记录由“选项”(selector)和“动作”(action)两个部分组成,两者间用tab制表符进 行分隔(使用空格间隔是无效的)。而“选项”又由一个或多个形如“类型.级别”格式的保留字段组合而成,各保留字段间用分号分隔。如下行所示:

    类型.级别 [;类型.级别] `TAB` 动作

    类型

    保留字段中的“类型”代表信息产生的源头,可以是:

    auth 认证系统,即询问用户名和口令

    cron 系统定时系统执行定时任务时发出的信息

    daemon 某些系统的守护程序的syslog,如由in.ftpd产生的log

    kern 内核的syslog信息

    lpr 打印机的syslog信息

    mail 邮件系统的syslog信息

    mark 定时发送消息的时标程序

    news 新闻系统的syslog信息

    user 本地用户应用程序的syslog信息

    uucp uucp子系统的syslog信息

    local0..7 种本地类型的syslog信息,这些信息可以又用户来定义

    * 代表以上各种设备

    级别

    保留字段中的“级别”代表信息的重要性,可以是:

    emerg 紧急,处于Panic状态。通常应广播到所有用户;

    alert 告警,当前状态必须立即进行纠正。例如,系统数据库崩溃;

    crit 关键状态的警告。例如,硬件故障;

    err 其它错误;

    warning 警告;

    notice 注意;非错误状态的报告,但应特别处理;

    info 通报信息;

    debug 调试程序时的信息;

    none 通常调试程序时用,指示带有none级别的类型产生的信息无需送出。如*.debug;mail.none表示调试时除邮件信息外其它信息都送出。

    “动作”域指示信息发送的目的地。可以是:

    /filename 日志文件。由绝对路径指出的文件名,此文件必须事先建立;

    @host 远程主机; @符号后面可以是ip,也可以是域名,默认在/etc/hosts文件下loghost这个别名已经指定给了本机。

    user1,user2 指定用户。如果指定用户已登录,那么他们将收到信息;

    * 所有用户。所有已登录的用户都将收到信息。

    日志文件由系统日志和内核日志监控程序syslogd 与klogd 控制, 在/etc/syslog.conf 文件中配置这两个监控程序默认活动。

    日志文件按/etc/syslog.conf 配置文件中的描述进行组织。以下是/etc/syslog.conf 文件的内容:

    # Log all kernel messages to the console.
    # Logging much else clutters up the screen.
    #kern.* /dev/console
    # Log anything (except mail) of level info or higher.
    # Don't log private authentication messages!
    *.info;mail.none;authpriv.none;cron.none /var/log/messages
    # The authpriv file has restricted access.
    authpriv.* /var/log/secure
    # Log all the mail messages in one place.
    mail.* -/var/log/maillog
    # Log cron stuff
    cron.* /var/log/cron
    # Everybody gets emergency messages
    *.emerg *
    # Save news errors of level crit and higher in a special file.
    uucp,news.crit /var/log/spooler
    # Save boot messages also to boot.log
    local7.* /var/log/boot.log

    以通过syslogd –h察看帮助信息,以确定当前的syslogd版本。

    当不支持syslog.conf配置时,直接使用命令参数,输入以下命令启动syslogd:

    syslogd -n -m 0 -L -R 192.190.1.88

    其中-n选项表示进程在前台运行。

    -m选项指定循环间隔时间。

    -L选项表示在进行远程日志记录的同时,本地也进行记录。如果不加该选项,则只进行远程日志记录。

    -R表示进行远程日志记录,将syslog日志发送到目标服务器上。这里假定目标服务器为的IP地址为192.190.1.88。如果不指定端口,默认使用UDP端口514。所以要确保服务器上该端口没用被占用。

    启动后,所有的日志信息都会发往服务器的UDP端口514。

    当支持syslog.conf配置时,只需修改该配置文件即可。在文件中增加以下语句:

    *.* @192.190.1.88

    以上配置表示将所有syslog的日志发往服务器192.190.1.88,使用默认的UDP端口。由于syslog.conf配置相对比较灵活,可以设置 屏蔽一些不需要的信息,以及设置指定的端口等等。请参考syslog.conf的有关命令,自行研究。然后启动syslogd即可进行远程记录。

    2.有时写c/c++程序,运行后出现core, 如果有core文件则可以gdb方便的定位问题,

    可是,当core文件找不到(或被删除)时如何定位?

    #include <iostream>
    
    int main(int argc, char **argv)
    {
        int *p = NULL;
        for(int i = 0; i < 15; i++)
        {
            p[i] = i;
        }
        return 0;
    }

    g++ -g test.cpp -o xtest

    ./test

    Segmentation fault

    Jun 10 16:41:14 localhost kernel: xtest[11446]: segfault at 0 ip 0000000000400680 sp 00007ffe81bcfac0 error 6 in xtest[400000+1000]

    #addr2line 0000000000400680 -e ./xtest

    输出:

    test.cpp:8 (discriminator 2)

    这样我们可以初步定位到位core.cpp第8行的问题,回到程序中看是非法地址的赋值

    这个命令本身就是把地址转成名称和行号的只是我们对于这个地址需要在message日志中看rip地址才能得到

    另外,error 后的数字转换到二进制依次对应描述如下:

    bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
    bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
    bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址

    所以从这个error 6也可以知道原因是 用户程序操作访问越界

    专用寄存器

    专用寄存器包括: RIP、RSP和RFLAGS以及段寄存器CS、DS、ES、SS、FS和GS。

    RIP(指令指针)RIP寻址代码段存储区内的下一条指令。当微处理器工作在实模式下时,这个寄存器是IP(16位);当80386及更高型号的微处理器工作于保护模式下时,则是EIP(32位)。注意,8086、8088和80286不包含EIP寄存器,而且只有80286及更高型号的微处理器可以工作于保护模式。指令指针指向程序的下一条指令,用于微处理器在程序中顺序地寻址代码段内的下一条指令。指令指针也可由转移指令或调用指令修改。在64位模式中,RIP包含40位地址总线,可用于寻址1TB平展模式地址空间。

    RSP(堆栈指针)RSP寻址一个称为堆栈的存储区。通过这个指针存取堆栈存储器数据,具体操作将在本书后面讲解访问堆栈存储器数据的指令时再进行说明。这个寄存器作为16位寄存器被引用时,为SP;如果作为32位寄存器,则是ESP。

  • 相关阅读:
    bzoj1036树的统计Count
    bzoj 2049 洞穴勘测
    PHP可变参数
    PHP可变参数
    读取数量不定的输入数据
    读取数量不定的输入数据
    字符导致的不便
    字符导致的不便
    Welcome to the world of Java! ^O^ cmd + notepad + HelloWorld
    Welcome to the world of Java! ^O^ cmd + notepad + HelloWorld
  • 原文地址:https://www.cnblogs.com/guxuanqing/p/14871745.html
Copyright © 2020-2023  润新知