【debug】debug经验|debug排查顺序|没有core文件和日志如何定位?

排查顺序

1、各个组件版本是否匹配。

2、各个组件是否都已经重新加载了最新库/完成重启。(特别当系统进程很多时,确保所以组件都是最新状态)。

3、代码逻辑bug。

错误记录

1、No source file named. or 没有在断点的地方停止

No source file named. Make breakpoint pending on future shared library load

(gdb) b mps_guide_db.c:1699

No source file named mps_guide_db.c.

1)可能是因为调用了动态库,要打断点的文件是动态库的

可以通过 以下方式得到解决:
(gdb) set breakpoint pending on
(gdb) b db_subscr_no_lookup
Function "db_subscr_no_lookup" not defined.
Breakpoint 1 (db_subscr_no_lookup) pending.

原文链接:https://blog.csdn.net/huluedeai/article/details/52225923
 

2)可能是 程序和库 编译的时候没有加-g 或者程序和库经过strip 命令已经将其中的调试信息去掉了

如:

(gdb) b RDMAConnectedSocketImpl.cc:159
No source file named RDMAConnectedSocketImpl.cc.
Make breakpoint pending on future shared library load? (y or [n])

gdb调试时的问题Missing separate debuginfos, use: debuginfo-install glibc-XXX
cd 

/etc/yum.repos.d

vim CentOS-Debuginfo.repo 

enable = 1

yum install glibc

debuginfo-install glibc.x86_64 0:2.17-307.el7.1
 

没有core dump文件和日志如何定位segment/core dump问题?

dmesg + addr2line 

dmesg打印环形缓冲区的内容。这些信息还会实时发送到syslogdklogd(在它们运行时),最终以形式发送给/var/log/messages;什么时候dmesg最有用是捕获之前syslogd和/或klogd开始的启动时消息,以便将它们正确记录。

dmesg:dmesg是(显示或驱动程序)消息。它用于检查或控制内核环形缓冲区。

messages:它包含全局系统消息,包括系统启动期间记录的消息。有几项已登录,/var/log/messages包括mail,cron,daemon,kern,auth等。

步骤:

以后, 在没有core时, 可以优先看:

      1. /var/log/messages

      2. dmesg                                dmesg    /var/log/messages

         dmesg  -Tw  显示时间

        dmesg |less  or dmesg |more   分页查看。 (more 只能向后翻页)

      3. /var/log/dmesg

      4.journalctl -xe 命令(系统日志查询)

       journalctl -k  和 "journalctl --dmesg 只显示系统的内核日志信息。

        -f, --follow
        只显示最新的日志项,并且不断显示新生成的日志项。 此选项隐含了 -n 选项。

Linux日志管理之journalctl ;https://www.cnblogs.com/askword/p/14506430.html

实例:

xxxxxx# ./a.out           #执行程序
Segmentation fault   (注意: 如果我机器上的core开关打开了, 就会提示Segmentation fault(core dumped), 类似提示大家应该见过, 比如Aborted(core dumped))

#查看消息

xxxxxx# cat /var/log/messages | grep -i seg   
Apr  2 15:13:19 yyyyyy kernel: a.out[24764]: segfault at 0 ip 000000000804854f sp 00000000ffc9e7d4 error 6 in a.out[8048000+1000]

#用addr2line查看000000000804854f对应行

xxxxxx# addr2line -e a.out 000000000804854f
/data/home/zzzzzz/test.cpp:7
xxxxxx# 
原文链接:https://blog.csdn.net/stpeace/article/details/68952172

我们知道, 程序segment fault后, 不一定会产生core文件, 如果有core文件, 那还好, 如果没有core或者是坏core, 那该怎么办呢?

       之前我们说过用add2line的方法来定位, 当时用了addr2line和dmesg命令, 今天我们来介绍类似的方法, 以方便在不同场景下多一个思路, 说不定能救命。

原文链接:https://blog.csdn.net/stpeace/article/details/68952172

cat test.cpp 

#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 test

./test

Segmentation fault   (注意: 如果我机器上的core开关打开了, 就会提示Segmentation fault(core dumped), 类似提示大家应该见过, 比如Aborted(core dumped)) 

查看messages日志并过滤出相关记录:

[/var/log]# cat /var/log/messages | grep -i seg 

Nov 24 04:02:08 i237 syslogd 1.4.1: restart.
Nov 25 13:55:01 i237 kernel: testreg[19978]: segfault at 000000000000000a rip 00000036ed078d50 rsp 00007fffa7125888 error 4
Nov 25 13:58:20 i237 kernel: testreg[20711]: segfault at 00000000000003e8 rip 00000036ed078d70 rsp 00007fff8e28ac98 error 4
Nov 25 16:19:10 i237 kernel: core[17962]: segfault at 0000000000000000 rip 0000000000400677 rsp 00007fff0c53dc30 error 6

(查看文件最后100行的命令:tail -100 /var/log/messages)

最后一个core[17962]即是刚才生成core的进程

执行: addr2line  0000000000400677  -e   可执行程序的路径

addr2line 0000000000400680 -e ./test

(如果上面的命令格式错误可能出现 找不到**,未找到**等错误,请手动输入命令再试一次)

输出:
....../core.cpp:7

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

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

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

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

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

最后百科里借用一个寄存器:

专用寄存器

专用寄存器包括: 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。

journalctl -xe命令(系统日志查询)

journalctl -xe命令(系统日志查询)

journalctl -xe是什么意思
-xe是排查问题时最常用的参数:
-e 从结尾开始看
-x 相关目录(如:问题相关的网址)

journalctl -xe # -x 是目录(catalog)的意思,在报错的信息下会,附加解决问题的网址    -e  pager-end 从末尾开始看
1
结尾看日志,开头看日志
默认从开头,加-r表示倒序

journalctl -r # -r reverse 从尾部看(推荐)
journalctl # 从开头看(一般用不到,因为都是看最新的日志)
1
2
滚屏输出日志
journalctl -f -n 20;  # 
1
时间段的日志
journalctl --since "2020-01-01 20:00:00" --until "2020-02-01 20:15:00"
1
某用户的日志
id root;
journalctl _UID=0 -n 5
1
2
某个服务的日志
journalctl -u httpd.service   # -u  service unit
:https://blog.csdn.net/enthan809882/article/details/104551777/

Linux Performance Analysis and Tools(Linux性能分析和工具)

debug 工具 

strace:跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

pstack用来跟踪进程栈,这个命令在排查进程问题时非常有用,

 性能调优工具Linux performance benchmark tool

linux的错误日志 

/var/log/messages 系统启动后的信息和错误日志

/var/log/secure 与安全相关的日志信息

/var/log/maillog 与邮件相关的日志信息

/var/log/cron 与定时任务相关的日志信息

/var/log/spooler 与UUCP和news设备相关的日志信息

/var/log/boot.log 守护进程启动和停止相关的日志消息

查看资源

系统:

# uname -a # 查看内核/操作系统/CPU信息

# cat /etc/issue

# cat /etc/redhat-release # 查看操作系统版本

# cat /proc/cpuinfo # 查看CPU信息

# hostname # 查看计算机名

# lspci -tv # 列出所有PCI设备

# lsusb -tv # 列出所有USB设备

# lsmod # 列出加载的内核模块

# env # 查看环境变量

资源:

# free -m # 查看内存使用量和交换区使用量

# df -h # 查看各分区使用情况

# du -sh # 查看指定目录的大小

# grep MemTotal /proc/meminfo # 查看内存总量。注意这个显示的单位是kB而不是KB,1kB=1000B,但是实际上应该是KB,1KB=1024B

# grep MemFree /proc/meminfo # 查看空闲内存量

# uptime # 查看系统运行时间、用户数、负载

# cat /proc/loadavg # 查看系统负载

磁盘和分区:

# mount | column -t # 查看挂接的分区状态

# fdisk -l # 查看所有分区

# swapon -s # 查看所有交换分区

# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)

# dmesg | grep IDE # 查看启动时IDE设备检测状况

网络:

# ifconfig # 查看所有网络接口的属性

# iptables -L # 查看防火墙设置

# route -n # 查看路由表

# netstat -lntp # 查看所有监听端口

# netstat -antp # 查看所有已经建立的连接

# netstat -s # 查看网络统计信息

进程:

# ps -ef # 查看所有进程

# top # 实时显示进程状态(另一篇文章里面有详细的介绍)

用户:

# w # 查看活动用户

# id # 查看指定用户信息

# last # 查看用户登录日志

# cut -d: -f1 /etc/passwd # 查看系统所有用户

# cut -d: -f1 /etc/group # 查看系统所有组

# crontab -l # 查看当前用户的计划任务

服务:

# chkconfig –list # 列出所有系统服务

# chkconfig –list | grep on # 列出所有启动的系统服务

程序

# rpm -qa                # 查看所有安装的软件包

常用命令整理如下:

查看主板的序列号: dmidecode | grep -i ’serial number’

用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart)

查看CPU信息:cat /proc/cpuinfo [dmesg | grep -i 'cpu'][dmidecode -t processor]

查看内存信息:cat /proc/meminfo [free -m][vmstat]

查看板卡信息:cat /proc/pci

查看显卡/声卡信息:lspci |grep -i ‘VGA’[dmesg | grep -i 'VGA']

查看网卡信息:dmesg | grep -i ‘eth’[cat /etc/sysconfig/hwconf | grep -i eth][lspci | grep -i 'eth']

查看PCI信息:lspci (相比cat /proc/pci更直观)

查看USB设备:cat /proc/bus/usb/devices

查看键盘和鼠标:cat /proc/bus/input/devices

查看系统硬盘信息和使用情况:fdisk & disk – l & df

查看各设备的中断请求(IRQ):cat /proc/interrupts

查看系统体系结构:uname -a

查看及启动系统的32位或64位内核模式:isalist –v [isainfo –v][isainfo –b]

dmidecode查看硬件信息,包括bios、cpu、内存等信息

测定当前的显示器刷新频率:/usr/sbin/ffbconfig –rev \?

查看系统配置:/usr/platform/sun4u/sbin/prtdiag –v

查看当前系统中已经应用的补丁:showrev –p

显示当前的运行级别:who –rH

查看当前的bind版本信息:nslookup –class=chaos –q=txt version.bind

dmesg | more 查看硬件信息

lspci 显示外设信息, 如usb,网卡等信息

lsnod 查看已加载的驱动

lshw

psrinfo -v 查看当前处理器的类型和速度(主频)

prtconf -v 打印当前的OBP版本号

iostat –E 查看硬盘物理信息(vendor, RPM, Capacity)

prtvtoc /dev/rdsk/c0t0d0s 查看磁盘的几何参数和分区信息

df –F ufs –o i 显示已经使用和未使用的i-node数目

isalist –v

对于“/proc”中文件可使用文件查看命令浏览其内容,文件中包含系统特定信息:

Cpuinfo 主机CPU信息

Dma 主机DMA通道信息

Filesystems 文件系统信息

Interrupts 主机中断信息

Ioprots 主机I/O端口号信息

Meninfo 主机内存信息

Version Linux内存版本信息

备注: proc – process information pseudo-filesystem 进程信息伪装文件系统

linux中tomcat修改错误日志路径

linux的错误日志在哪里,;https://blog.csdn.net/weixin_29898627/article/details/116673957

打印当前函数的调用栈

打印当前函数的调用栈_https://blog.csdn.net/qq_33726635/article/details/113046173

 

Linux进程空间地址划分

Linux 64位系统为例。理论上,64bit内存地址可用空间为0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF(16位十六进制数),这是个相当庞大的空间,Linux实际上只用了其中一小部分(256T)。

Linux64位操作系统仅使用低47位,高17位做扩展(只能是全0或全1)。所以,实际用到的地址为空间为0x0000000000000000 ~ 0x00007FFFFFFFFFFF(user space)和0xFFFF800000000000 ~ 0xFFFFFFFFFFFFFFFF(kernel space),其余的都是unused space

user space 也就是用户区由以下几部分组成:代码段,数据段,BSS段,heap,stack

 Linux进程空间地址划分_https://blog.csdn.net/dw147258dw/article/details/125345427

 

Linux重要命令-pstack和pstrace

想知道在Linux下后台程序到底运行到哪里了,卡住了吗,

Linux重要命令-pstack和pstrace_https://blog.csdn.net/lucy123_/article/details/97151932

 

posted on 2022-10-04 01:25  bdy  阅读(79)  评论(0编辑  收藏  举报

导航