目录
1、No source file named. or 没有在断点的地方停止
没有core dump文件和日志如何定位segment/core dump问题?
排查顺序
1、各个组件版本是否匹配。
2、各个组件是否都已经重新加载了最新库/完成重启。(特别当系统进程很多时,确保所以组件都是最新状态)。
3、代码逻辑bug。
4、不要去猜测,要去看日志。
5、查看链接的库对没对。(有没有还是链接了旧的库)
错误记录
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
查看是不是链接了错误的库(旧库)
查看进程加载的库和资源占用
ps -aux |pingpong 查进程ID
lsof -p 1957209 查加载的库和资源占用:
[root@node11 ~]# ps -aux |grep pingpong
root 1957209 0.0 0.0 11708 1968 pts/0 S+ 23:22 0:00 fi_pingpong -d mlx5_1 -p verbs;ofi_rxm -e rdm -v
root 1961354 0.0 0.0 6412 2296 pts/2 S+ 23:22 0:00 grep --color=auto pingpong
[root@node11 ~]# lsof -p 1957209
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
fi_pingpo 1957209 root cwd DIR 253,0 187 134289536 /home
fi_pingpo 1957209 root rtd DIR 253,0 247 128 /
fi_pingpo 1957209 root txt REG 253,0 50040 815 /usr/bin/fi_pingpong
fi_pingpo 1957209 root mem REG 253,0 54392 67564400 /usr/lib64/libnuma.so.1.0.0
fi_pingpo 1957209 root mem REG 253,0 108136 67109001 /usr/lib64/libgcc_s-11-20220127.so.1
fi_pingpo 1957209 root mem REG 253,0 2389488 67111325 /usr/lib64/libc.so.6
fi_pingpo 1957209 root mem REG 253,0 15936 67111327 /usr/lib64/libdl.so.2
fi_pingpo 1957209 root mem REG 253,0 15952 67111333 /usr/lib64/libpthread.so.0
fi_pingpo 1957209 root mem REG 253,0 16648 67111335 /usr/lib64/librt.so.1
fi_pingpo 1957209 root mem REG 253,0 443384 67713500 /usr/lib64/libpsm2.so.2.2
fi_pingpo 1957209 root mem REG 253,0 552152 67111912 /usr/lib64/libnl-route-3.so.200.26.0
fi_pingpo 1957209 root mem REG 253,0 146872 67111904 /usr/lib64/libnl-3.so.200.26.0
fi_pingpo 1957209 root mem REG 253,0 138856 67112779 /usr/lib64/libibverbs.so.1.14.37.2
fi_pingpo 1957209 root mem REG 253,0 109752 67453439 /usr/lib64/librdmacm.so.1.3.35.0
fi_pingpo 1957209 root mem REG 253,0 1363688 67713565 /usr/lib64/libfabric.so.1.17.0_bak
fi_pingpo 1957209 root mem REG 253,0 909264 67111321 /usr/lib64/ld-linux-x86-64.so.2
fi_pingpo 1957209 root 0u CHR 136,0 0t0 3 /dev/pts/0
fi_pingpo 1957209 root 1u CHR 136,0 0t0 3 /dev/pts/0
fi_pingpo 1957209 root 2u CHR 136,0 0t0 3 /dev/pts/0
fi_pingpo 1957209 root 3u IPv4 597221140 0t0 TCP *:47592 (LISTEN)
查看bin依赖的lib
ldd exe_nam
原文链接:https://blog.csdn.net/bandaoyu/article/details/113697346
没有core dump文件和日志如何定位segment/core dump问题?
dmesg + addr2line
dmesg
打印环形缓冲区的内容。这些信息还会实时发送到syslogd
或klogd
(在它们运行时),最终以形式发送给/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命令(系统日志查询)
更多更详细的:【linux】日志和journalctl 管理查看日志
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内核及系统日志
内核及系统日志有系统服务rsyslog
统一管理,根据其主配置文件/etc/rsyslog.conf
中的设置决定将内核消息及各种系统程序消息记录到什么位置.
messages #系统公共常规日志,记录内核消息,包括启动,IO/网络/程序错误日志
dmesg #内核启动时的日志,开机时在屏幕显示,该命令查看本地系统启动时的硬件和内核缓冲信息
/var/log/secure #是系统安全日志,记录用户远程登录,认证过程中的事件信息
/var/log/cron #是计划任务日志
/var/log/maillog #记录进入或发出系统的电子邮件活动
/var/log/boot.log #记录系统启动的软件日志信息
/var/log/wtmp #记录系统所有登录和推出记录,使用last命令查看
/var/log/btmp #记录错误登录的日志信息,使用lastb命令查看
/var/log/lastlog #记录最近成功登录和最后的失败登录事件,使用lastlog命令查看
/var/log/messages 系统启动后的信息和错误日志
/var/log/dmesg 缓存内核中的日志转存到该文件
syslog 守护程序将内核消息转储到 /var/log/dmesg,因此你也可以使用该日志文件:
$ cat /var/log/dmesg
# 查看系统常规日志
tail -f messages
tail /var/log/messages
# 持续查看OS日志
tail -f /var/log/messages
# 查看内核启动时的内容
tail -f dmesg
#查看系统安全日志
tail -f secure
#查看系统计划任务日志
tail --f /var/log/cron
dmesg 打印缓冲区内核日志
dmesg
查看内核日志
dmesg
命令用于打印和控制内核环形缓冲区(内核日志缓存空间)。
内核对系统资源(例如:
CPU
、I/O
设备、物理内存和文件系统)的访问、在引导过程中以及系统运行时,将各种消息(日志)写入内核环形缓冲区。内核环形缓冲区(物理内存)具有固定的大小,一旦缓冲区已满,较旧的日志记录将被覆盖。
dmesg
命令用于打印和控制内核环形缓冲区。对于检查内核启动消息和调试与硬件相关的问题很有用。dmesg 从
/proc/kmsg
虚拟文件中读取内核生成的消息。该文件提供了到内核环形缓冲区的接口,并且只能由一个进程打开。如果系统上正在运行syslog
进程,并且你尝试使用cat
或less
命令读取文件,则命令将挂起。
syslog
守护程序将内核消息转储到/var/log/dmesg
,因此你也可以使用该日志文件:$ cat /var/log/dmesg
$ dmesg 打印(缓冲区中的)内核日志
$ dmesg --color=always 保留彩色输出地打印(缓冲区中的)内核日志
格式化 dmesg 输出:
$ dmesg -H (--human),以更人更容易读的格式输出
$ dmesg -T (--ctime),打印人类可读的时间戳
也可以使用 --time-format <format> 选项设置,可以是 ctime,reltime,delta,notime或 iso。例如:要使用增量格式,你可以输入: $ dmesg --time-format=delta
$ dmesg --follow 实时的输出
过滤 dmesg 输出
你可以将 dmesg
输出限制为给定的设施和等级。dmesg
支持以下类型:
- kern-内核消息
- user-用户级消息
- mail-邮件系统
- daemon-系统守护程序
- auth-安全/授权消息
- syslog-内部 syslogd 消息
- lpr-行式打印机子系统
- news-网络新闻子系统
-f(--facility <list>)
选项允许你将输出限制为特定的设备,该选项接受一个或多个逗号分隔的功能。
例如,要仅显示内核和系统守护程序消息,可以使用:
$ dmesg -f kern,daemon
每条日志消息都与一个显示消息重要性的日志级别相关联,dmesg
支持以下日志级别:
- emerg-系统无法使用
- alert-必须立即采取措施
- crit-紧急情况
- err-错误条件
- warn-警告条件
- notice-正常但重要的条件
- info-信息性
- debug-调试级消息
-l(--level <list>)
选项允许你将输出限制为定义的级别,该选项接受一个或多个逗号分隔的级别。以下命令仅显示错误和严重消息:
$ dmesg -l err,crit
清除环形缓冲区
-C(--clear)
选项可让您清除环形缓冲区:
$ sudo dmesg -C
只有 root
或具有 sudo
特权的用户才能清除缓冲区。
要在清除之前打印缓冲区内容,请使用 -c(--read-clear)
选项:
$ sudo dmesg -c
如果要在清除文件之前将当前 dmesg
日志保存到文件中,你可以将输出重定向到文件:
$ dmesg > dmesg_messages
查看资源
系统:
# 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
pstack和strace(pstrace)查看系统调用
想知道在Linux下后台程序到底运行到哪里失败的or卡住了吗,卡在哪里
Linux重要命令-pstack和pstrace_https://blog.csdn.net/lucy123_/article/details/97151932http://t.csdn.cn/pyxIDLinux重要命令-pstack和pstrace_https://blog.csdn.net/lucy123_/article/details/97151932
打印当前函数的调用栈
int backtrace(void** buffer, int size);
函数作用:用于获取当前线程的调用堆栈。
参数解释:
buffer:它是一个指针数组,函数获取的当前线程的调用堆栈将会被存放在buffer中。在buffer中的指针实际是从堆栈中获取的返回地址,每一个堆栈 框架有一个返回地址。
size:用来指定buffer中可以保存多少个void*元素。
函数返回值:实际获取的指针个数,最大不超过size大小。
原文链接:https://blog.csdn.net/qq_33726635/article/details/113046173
Linux服务巡检常用命令
(摘自:Linux内核及系统日志
Linux系统需要定期巡检,以检查服务器软硬件使用情况,相当于对人的体检,确保可以及时发现问题、解决问题,降低损失,常用的巡检命令如下:who -b # 查看上次重启时间
uname -a # 查看内核/操作系统/CPU信息
head -n 1 /etc/issue # 查看操作系统版本
cat /proc/cpuinfo # 查看CPU信息
hostname # 查看计算机名
lspci -tv # 列出所有PCI设备
lsusb -tv # 列出所有USB设备
lsmod # 列出加载的内核模块
env # 查看环境变量
free -m # 查看内存使用量和交换区使用量
swapon -s # 查看所有交换分区
df -h # 查看各分区使用情况
du -sh < 目录名> # 查看指定目录的大小
grep MemTotal /proc/meminfo # 查看内存总量
grep MemFree /proc/meminfo # 查看空闲内存量
uptime # 查看系统运行时间、用户数、负载
cat /proc/loadavg # 查看系统负载
mount | column -t # 查看挂接的分区状态
fdisk -l # 查看所有分区
hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
dmesg | grep IDE # 查看启动时IDE设备检测状况
ifconfig # 查看所有网络接口的属性
iptables -L # 查看防火墙设置
route -n # 查看路由表
netstat -lntp # 查看所有监听端口
netstat -antp # 查看所有已经建立的连接
netstat -s # 查看网络统计信息
ps -ef # 查看所有进程
top # 实时显示进程状态id < 用户名> # 查看指定用户信息cut -d: -f1 /etc/passwd # 查看系统所有用户
cut -d: -f1 /etc/group # 查看系统所有组
crontab -l # 查看所有用户的定时任务