当前位置: 首页 > news >正文

linux下coredump问题的定位分析方法

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

参考:https://blog.csdn.net/m0_73698480/article/details/130077852

最近定位了一段时间linux下的崩溃问题,又收集了一些思路,特整理记录一下。

常见coredump定位方法是:
首先,关注coredump是否有生成,如果有生成,先使用gdb调试coredump,看看堆栈异常信息,然后再做其它分析。
其次,尝试是否可以重现问题,如果可重现的话,定位也就比较简单了,编译debug版本,-g -O0编译出的版本,使用gdb运行,然后跟踪调测就可以了。

下面重点探讨除上述分析之外的方法,和一些定位经验。

第一关注 运行日志:

1. 程序或服务自身的运行日志

在这个程序或服务本身的运行日志中,我们至少可以得到服务运行崩溃的大致时间;
另外许多时候,基于崩溃前的日志,或许也可以看到一些出现问题的原因,这个具体问题具体分析。

2. 系统日志

对于一个service系统服务来说,如果有打印日志的话,可能会存储在服务的日志中,也可能存储在系统日志中,系统日志的位置位于:
系统日志: 查看系统日志(如 /var/log/messages 或 /var/log/syslog),寻找与应用程序崩溃相关的任何错误或警告消息。

$ ls -l /var/log/messages*
-rw------- 1 root root  46784308 410 16:27 /var/log/messages
-rw------- 1 root root 157145170 317 03:19 /var/log/messages-20240317
-rw------- 1 root root 185431621 324 03:20 /var/log/messages-20240324
-rw------- 1 root root 266501216 331 03:10 /var/log/messages-20240331
-rw------- 1 root root 117807682 47 03:37 /var/log/messages-20240407

第二关注 运行限制和系统运行信息:

1. 文件打开限额

通常缺省的文件打开限额,对于有些服务是不够的
可以使用prlimit查询系统限额,还可以使用prlimt -p $(pid)来查询进程的文件等限额。
NOFILE行就是的文件打开限额。

$ prlimit
RESOURCE   DESCRIPTION                             SOFT      HARD UNITS
AS         address space limit                unlimited unlimited 字节
CORE       max core file size                         0 unlimited 块
CPU        CPU time                           unlimited unlimited 秒数
DATA       max data size                      unlimited unlimited 字节
FSIZE      max file size                      unlimited unlimited 块
LOCKS      max number of file locks held      unlimited unlimited 
MEMLOCK    max locked-in-memory address space     65536     65536 字节
MSGQUEUE   max bytes in POSIX mqueues            819200    819200 字节
NICE       max nice prio allowed to raise             0         0 
NOFILE     max number of open files                1024      4096 
NPROC      max number of processes                 4096    514744 
RSS        max resident set size              unlimited unlimited 页数
RTPRIO     max real-time priority                     0         0 
RTTIME     timeout for real-time tasks        unlimited unlimited 毫秒数
SIGPENDING max number of pending signals         514744    514744 
STACK      max stack size                       8388608 unlimited 字节
2. 系统当前内存和cpu情况

使用top命令可以查询,当前的内存运行情况

$ top
top - 16:30:37 up 52 days,  4:45,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 419 total,   3 running, 416 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.6 us, 11.1 sy,  0.0 ni, 83.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    896.0 total,     59.7 free,    299.9 used,    536.5 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    459.1 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                            1 root      20   0  172636   6532   3768 S   0.0   0.7   2:39.47 systemd                                                                            2 root      20   0       0      0      0 S   0.0   0.0   0:00.15 kthreadd                                                                           3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                                             4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                                                                         
...
3. 文件系统的占用情况

使用df -h查看磁盘的占用情况

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        434M     0  434M   0% /dev
tmpfs           448M     0  448M   0% /dev/shm
tmpfs           448M  1.2M  447M   1% /run
tmpfs           448M     0  448M   0% /sys/fs/cgroup
/dev/vda1        40G   23G   16G  59% /
tmpfs            90M     0   90M   0% /run/user/0
tmpfs            90M     0   90M   0% /run/user/1000

第三关注 系统历史运行信息:

可以借助sar命令(system activity reportor)来获取展示,磁盘的历史占用情况,cpu历史占用情况,内存历史占用情况。

1. 查看内存历史占用情况
$ sar -r
Linux 4.18.0-348.7.1.el8_5.x86_64 (ls_CxhK1nVN)         04/10/2024      _x86_64_        (1 CPU)
12:00:01 AM kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
12:10:01 AM    112160    483716    805348     87.78     72932    407936    730276     79.59    340308    318996       236
12:20:00 AM    108692    483164    808816     88.15     73016    410768    728728     79.42    340768    322076       376
12:30:01 AM    111088    486360    806420     87.89     73100    411484    727280     79.27    341208    320176       540
12:40:01 AM    101508    484024    816000     88.94     73132    418696    729800     79.54    341844    328008       468
12:50:01 AM     99068    481988    818440     89.20     73180    419052    727280     79.27    342384    330640       184
01:00:01 AM     98516    481724    818992     89.26     73196    419324    727280     79.27    342720    330656       348
01:10:01 AM     98312    481836    819196     89.28     73224    419612    727280     79.27    342988    330716       404
01:20:01 AM     98380    482412    819128     89.28     73240    420096    727280     79.27    343276    330872       388
01:30:00 AM     96780    483460    820728     89.45     73252    422716    722736     78.77    343520    332380       364
01:40:01 AM    255968    484972    661540     72.10     13756    327676    728184     79.37    167148    352508       372
2. 查看cpu历史占用情况
$ sar -u
Linux 4.18.0-348.7.1.el8_5.x86_64 (ls_CxhK1nVN)         04/10/2024      _x86_64_        (1 CPU)
12:00:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
12:10:01 AM     all      0.39      0.08      0.48      0.12      0.00     98.94
12:20:00 AM     all      0.41      0.03      0.33      0.11      0.00     99.13
12:30:01 AM     all      0.35      0.03      0.48      0.11      0.00     99.04
12:40:01 AM     all      0.54      0.03      0.36      0.09      0.00     98.99
12:50:01 AM     all      0.15      0.03      0.20      0.07      0.00     99.56
01:00:01 AM     all      0.11      0.03      0.16      0.06      0.00     99.65
01:10:01 AM     all      0.13      0.02      0.19      0.06      0.00     99.60
3. 查看磁盘历史占用情况
$ sar -d
Linux 4.18.0-348.7.1.el8_5.x86_64 (ls_CxhK1nVN)         04/10/2024      _x86_64_        (1 CPU)
12:00:01 AM       DEV       tps     rkB/s     wkB/s   areq-sz    aqu-sz     await     svctm     %util
12:10:01 AM  dev253-0      6.77      8.25     42.26      7.46      0.00      0.73      0.26      0.18
12:10:01 AM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:10:01 AM    dev7-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:10:01 AM    dev7-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:10:01 AM    dev7-2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:20:00 AM  dev253-0      5.62      0.00     35.80      6.37      0.00      0.69      0.28      0.16
12:20:00 AM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:20:00 AM    dev7-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:20:00 AM    dev7-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:20:00 AM    dev7-2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
4. 指定时间的历史占用情况

因为sar命令通常显示当天的,如果要显示之前日期的,可以基于当前日期往前,显示历史日期的文件数据。
sar命令所查询的就是下面文件的内容信息。01-31代表日期1号到31号,写入时,每天的覆盖写入到对应的日期文件中。

$ ls /var/log/sa/
sa01  sa04  sa07  sa10  sa14  sa17  sa20  sa23  sa26  sa29  sar01  sar04  sar07  sar11  sar14  sar17  sar20  sar23  sar26  sar29
sa02  sa05  sa08  sa12  sa15  sa18  sa21  sa24  sa27  sa30  sar02  sar05  sar08  sar12  sar15  sar18  sar21  sar24  sar27  sar30
sa03  sa06  sa09  sa13  sa16  sa19  sa22  sa25  sa28  sa31  sar03  sar06  sar09  sar13  sar16  sar19  sar22  sar25  sar28  sar31

查看9号的内存信息时,使用如下命令查看

$ sar -f /var/log/sa/sa09 -r
Linux 4.18.0-348.7.1.el8_5.x86_64 (ls_CxhK1nVN)         04/09/2024      _x86_64_        (1 CPU)
12:00:01 AM kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
12:10:01 AM     95244    485752    822264     89.62     72800    426856    727016     79.24    354880    321344       200
12:20:01 AM    129448    486524    788060     85.89     68596    398684    724724     78.99    301844    342100       324
12:30:01 AM    123244    484756    794264     86.57     68720    402044    727016     79.24    329980    317968       232
12:40:01 AM    124768    486904    792740     86.40     68860    402496    727016     79.24    330908    316884       188
12:50:01 AM    124160    486660    793348     86.47     68984    402736    727016     79.24    331208    317040       200
01:00:01 AM    123608    486504    793900     86.53     69108    403008    727016     79.24    331496    317140       248
01:10:01 AM    122840    486192    794668     86.61     69260    403312    727016     79.24    332020    317068       264
01:20:01 AM    122256    485944    795252     86.68     69360    403548    727016     79.24    332312    317172       176
01:30:01 AM    110380    486188    807128     87.97     69564    415448    727016     79.24    340608    321304       448
01:40:01 AM    107620    485568    809888     88.27     69716    417436    727016     79.24    342620    321092       396
01:50:00 AM    106616    485792    810892     88.38     69796    418644    724992     79.02    345120    320092       636
02:00:01 AM    105004    485200    812504     88.56     69872    419572    727016     79.24    345848    320212       760
02:10:01 AM    105820    486688    811688     88.47     69928    420188    727016     79.24    346588    320092       268

一些常见问题项:

1. 关注内存分配、释放异常

使用c、c++写程序,本就要特别关心内存申请释放。
一般来看,重复释放一般都是要崩溃的,这个也是常见的情况。
还有不太常见的情况,因为c++支持重载,new/delete方法被重载了,使用malloc申请的内存,使用delete释放时走了重载,重载的方式可能时使用一些内存分配库做的,那就有问题了。

2. 类或结构体定义有多处定义引发的异常

因为linux下,结构体、类都是缺省导出的,那么,就有可能不同的库都定义了某个结构体,两者的结构体就有符号重复了。
但两个库都是不知道的,两者都是独立编译的。
但运行程序由于依赖两个库,两个库都加载了,那运行时,找类或结构体,就可能找到另一个库的类或结构体了。
这种情况下,运行就很容易发生崩溃了。

3. 新旧库的匹配问题

在linux下,库之间如果版本不匹配的话,该类问题不太容易被发现。
例如运行程序依赖的某个库的版本是比较老的版本,但是头文件有变更,其它库均已变更了;
因为头文件变更,导致部分内存分配大小上会有差异,这种情况问题就千奇百怪了,很大可能崩溃在内存分配处理的位置。
遇到这种内存是足够的,并且没有内存释放异常,却崩溃了,那么可能就要担心一下是不是有库的版本有问题导致。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

相关文章:

linux下coredump问题的定位分析方法

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考:https://blog.csdn.net/m0_73698480/article/details/130077852 最近定位了一段时间linux下的崩溃问题,又收集了一些思路,特整理记录一下。 常见coredump定位方法是&#xff1a…...

第十届蓝桥杯省赛真题(C/C++大学B组)

目录 试题 A: 组队 试题 B: 年号字串 试题 C: 数列求值 试题 D: 数的分解 试题 E: 迷宫 试题 F: 特别数的和 试题 G:完全二叉树的权值 试题 H:等差数列 试题 I:后缀表达式(不一定对) 试题 J:灵能…...

Scrapy 爬取m3u8视频

Scrapy 爬取m3u8视频 【一】效果展示 爬取ts文件样式 合成的MP4文件 【二】分析m3u8文件路径 视频地址:[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html) 【1】找到m3u8文件 这里任务目标很明确 就是找m3u8文件 打开浏览器…...

LVGL简单记录

1、 vs中代码旁边有个小锁删除git 2、Visual Studio 试图编译已删除的文件, 如果这个文件也是你不再需要编译的文件,且已经从文件系统中删除,你需要从 .vcxproj 文件中移除或者注释掉这一行,以停止Visual Studio尝试去编译一个不…...

计算机网络——ARP协议

前言 本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结,讲的非常好。 可以先去看一篇视频,再来参考这篇笔记(或者说直接偷走)。 …...

【C++]C/C++的内存管理

这篇博客将会带着大家解决以下几个问题 1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 1. C/C内存分布 我们先来看下面的一段代码和相关问题 int global…...

深入理解计算机网络分层结构

一、 为什么要分层? 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次,每个层次负责特定的功能。这样做有以下几个好处: 模块化设计:每个层次都有清晰定义的功能和接口,使得网络系统更易于设…...

亚马逊云科技CTO带你学习云计算降本增效秘诀

2023亚马逊云科技一年一度的重磅春晚--Re:invent上有诸多不同话题的主题Keynote,这次小李哥带大家复盘来自亚马逊CTO: Wener博士的主题演讲: 云架构节俭之道1️⃣节俭对于云计算为什么重要? ▶️企业基础设施投入大,利用好降本策略可以减少巨…...

快速上手Vue

目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面&#xff1a;基于数据渲染出用户看到的页面 渐进式&#xff1a;Vue相关生态&#xff1a;声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…...

java 目录整理

Java知识相关目录主要参考黑马程序员 风清扬老师的视屏,参考链接为 Java_黑马刘意(风清扬)2019最新版_Java入门视频_Java入门_Java编程_Java入门教程_黑马教程_黑马程序员_idea版_哔哩哔哩_bilibili 1、java 基础 java基本认识?java跨平台原理?jdk、jre、jvm的联系? 链接:…...

使用Python的Pillow库进行图像处理书法参赛作品

介绍&#xff1a; 在计算机视觉和图像处理领域&#xff0c;Python是一种强大而流行的编程语言。它提供了许多优秀的库和工具&#xff0c;使得图像处理任务变得轻松和高效。本文将介绍如何使用Python的wxPython和Pillow库来选择JPEG图像文件&#xff0c;并对选中的图像进行调整和…...

docker 容器指定utf-8编码

在运行 Docker 容器的时候&#xff0c;如果容器内应用需要使用 UTF-8 编码来正常处理中文&#xff0c;你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如&#xff0c;设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8&#xff1a…...

单例模式以及常见的两种实现模式

单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”&#xff0c;按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例&#xff0c;如果创建出了多个实例&#xff0c;就会编译报错。而不会创建出多个实…...

Java hashCode() 和 equals()的若干问题解答

Java hashCode() 和 equals()的若干问题解答 本章的内容主要解决下面几个问题&#xff1a; 1 equals() 的作用是什么&#xff1f; 2 equals() 与 的区别是什么&#xff1f; 3 hashCode() 的作用是什么&#xff1f; 4 hashCode() 和 equals() 之间有什么联系&#xff1f; …...

高级IO——React服务器简单实现

3.4Reactor服务器实现 1.connect封装 ​ 每一个连接都要有一个文件描述符和输入输出缓冲区&#xff0c;还有读、写、异常处理的回调方法&#xff1b; ​ 还包括指向服务器的回指指针&#xff1b; class connection; class tcpserver;using func_t std::function<void(s…...

Qt使用插件QPluginLoader 机制开发

简介&#xff1a; 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。 Qt 提供了2种APIs来创建插件&#xff1a; 一种高级API&#xff0c;用于为Qt本身编写插件&#xff1a;自定义数据库驱动程序&#xff0c;图像格…...

双子座 Gemini1.5和谷歌的本质

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

二百三十、MySQL——MySQL表的索引

1 目的 梳理一下目前MySQL维度表的索引情况&#xff0c;当然网上也有其他博客专门讲MySQL索引的&#xff0c;我这边只是梳理一下目前的索引状况而已 2单列索引 2.1 索引截图 2.2 建表语句 3 联合索引 3.1 索引截图 3.2 建表语句 4 参考的优秀博客 http://t.csdnimg.cn/ZF7…...

并发编程之ThreadLocal使用及原理

ThreadLocal主要是为了解决线程安全性问题的 非线程安全举例 public class ThreadLocalDemo {// 非线程安全的private static final SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static Date parse(String strDate) throws ParseExc…...

软件测试 测试开发丨Pytest结合数据驱动-yaml,熬夜整理蚂蚁金服软件测试高级笔试题

编程语言 languages: PHPJavaPython book: Python入门: # 书籍名称 price: 55.5 author: Lily available: True repertory: 20 date: 2018-02-17 Java入门: price: 60 author: Lily available: False repertory: Null date: 2018-05-11 yaml 文件使用 查看 yaml 文件 pych…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...