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 4月 10 16:27 /var/log/messages
-rw------- 1 root root 157145170 3月 17 03:19 /var/log/messages-20240317
-rw------- 1 root root 185431621 3月 24 03:20 /var/log/messages-20240324
-rw------- 1 root root 266501216 3月 31 03:10 /var/log/messages-20240331
-rw------- 1 root root 117807682 4月 7 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定位方法是:…...
第十届蓝桥杯省赛真题(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是一个用于 构建用户界面 的 渐进式 框架 构建用户界面:基于数据渲染出用户看到的页面 渐进式:Vue相关生态:声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…...
java 目录整理
Java知识相关目录主要参考黑马程序员 风清扬老师的视屏,参考链接为 Java_黑马刘意(风清扬)2019最新版_Java入门视频_Java入门_Java编程_Java入门教程_黑马教程_黑马程序员_idea版_哔哩哔哩_bilibili 1、java 基础 java基本认识?java跨平台原理?jdk、jre、jvm的联系? 链接:…...
使用Python的Pillow库进行图像处理书法参赛作品
介绍: 在计算机视觉和图像处理领域,Python是一种强大而流行的编程语言。它提供了许多优秀的库和工具,使得图像处理任务变得轻松和高效。本文将介绍如何使用Python的wxPython和Pillow库来选择JPEG图像文件,并对选中的图像进行调整和…...
docker 容器指定utf-8编码
在运行 Docker 容器的时候,如果容器内应用需要使用 UTF-8 编码来正常处理中文,你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如,设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8:…...
单例模式以及常见的两种实现模式
单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”,按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例,如果创建出了多个实例,就会编译报错。而不会创建出多个实…...
Java hashCode() 和 equals()的若干问题解答
Java hashCode() 和 equals()的若干问题解答 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equals() 之间有什么联系? …...
高级IO——React服务器简单实现
3.4Reactor服务器实现 1.connect封装 每一个连接都要有一个文件描述符和输入输出缓冲区,还有读、写、异常处理的回调方法; 还包括指向服务器的回指指针; class connection; class tcpserver;using func_t std::function<void(s…...
Qt使用插件QPluginLoader 机制开发
简介: 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。 Qt 提供了2种APIs来创建插件: 一种高级API,用于为Qt本身编写插件:自定义数据库驱动程序,图像格…...
双子座 Gemini1.5和谷歌的本质
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
二百三十、MySQL——MySQL表的索引
1 目的 梳理一下目前MySQL维度表的索引情况,当然网上也有其他博客专门讲MySQL索引的,我这边只是梳理一下目前的索引状况而已 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…...
软考数据库---2.SQL语言
主要记忆:表、索引、视图操作语句;数据操作;通配符、转义符;授权;存储过程;触发器 这部分等等整理一下: “”" 1、 数据定义语言。 SQL DDL提供定义关系模式和视图、 删除关系和视图、 修改关系模式的…...
基于顺序表实现通讯录
上篇我们讲了顺序表是什么,和如何实现顺序表。这篇文章我们将基于顺序表来实现通讯录。 文章目录 前言一、基于顺序表是如何实现的二、通讯录的头文件和实现文件三、通讯录的实现3.1 定义通讯录结构3.2 初始化通讯录3.3 销毁通讯录3.4 通讯录添加数据3.5 查找联系人…...
咸鱼之王_手游_开服搭建架设_内购修复无bug运营版
视频演示 咸鱼之王_手游_开服 游戏管理后台界面 源码获取在文章末尾 源码获取在文章末尾 源码获取在文章末尾 或者直接下面 https://githubs.xyz/y28.html 1.安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…...
【JSON2WEB】14 基于Amis的CRUD开发30分钟速成
【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…...
Java入门教程||Java 变量
Java 变量 Java教程 - Java变量 变量由标识符,类型和可选的初始化程序定义。变量还具有范围(可见性/生存期)。 Java变量类型 在Java中,必须先声明所有变量,然后才能使用它们。变量声明的基本形式如下所示࿱…...
基于Java的校园快递一站式服务系统 (源码+文档+包运行)
一.系统概述 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本校园快递一站式服务系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞…...
通讯录的实现(顺序表版本)
我们知道通讯录是基于顺序表的前提下,要写好通讯录我们就要深入了解好顺序表。我们先来看看什么是顺序表。(注意今天代码量有点多,坚持一下)。冲啊!兄弟们! 顺序表的简单理解 对于顺序表,我们首…...
利用Sentinel解决雪崩问题(一)流量控制
1、解决雪崩问题的常见方式有四种: 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待;舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离;熔断降级:由断路器统计业务…...
二叉树总结
递归返回值 1、如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。 2、如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 3、如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,…...
接口优化技巧
一、背景 针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案 二、接口优化方案总结 1.批处理 批量思想:批量操作数据库&a…...
网站如何做吸引人的项目/汕头seo托管
书上的代码已完全不可参考,只好按知识点从网上查资料一个一个实例 了。 <!DOCTYPE html> <html> <head><title>ExtJs</title><meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><link…...
linode wordpress 教程/国内新闻最新
Linux系统下可以直接复制SQL语句进行导入,但是这个方法容易出现导入失败的现象,我们可以直接导入sql文件,可以大大提高成功率。在导入sql文件前,先说一下MySQL的常用命令。MySQL的登陆与退出登陆MySQL:mysql -u用户名 …...
爱情动做网站推荐/免费测试seo
2019独角兽企业重金招聘Python工程师标准>>> 当设置了父元素的宽度,子元素设置宽度为100%后再在加上子元素上添加padding或margin值就会溢出。举个例子: <!-- 示例 --><!-- html --> <div class"parent"><div…...
桑拿网站只做/高级搜索百度
一般我们下载SCI论文先在kopernio中查找,这个插件确实很方便。万一查找不到的话再去sci-hub上进行下载。 一、Kopernio插件 Kopernio是基于chrome浏览器的一款免费插件,通过人工智能技术使得用户可一键访问其所在机构订购的期刊论文,大大节省…...
泰安网站设计/今天发生了什么重大新闻
转载自:http://msdn.microsoft.com/zh-cn/library/system.badimageformatexception%28vvs.100%29.aspx BadImageFormatException 类 当动态链接库 (DLL) 或可执行程序的文件映像无效时引发的异常。 解决办法: DLL 或可执行文件作为 64 位程序集加载&…...
优秀设计师的个人网站/竞猜世界杯
godlovelian 梦想还是要有的,万一实现了呢 博客园首页新随笔联系管理订阅 随笔- 34 文章- 2 评论- 2 json数组和List集合转换总结 //方法一,将json解析后赋给单独的元素 String jstr"{json:jsonvalue,bool:true,int:1,double:20.5}"; JSONObject jsonJS…...