[转帖]程序运行崩溃(segfault)的排查方法

程序运行,崩溃,segfault,排查,方法 · 浏览次数 : 0

小编点评

**C++程序运行挂了,关键是“segment fault”不显示** **解决方案:** 1. **编译时加上 debug选项(-g):** 在编译时使用 `-g` 选项,例如: ``` g++ -g a.out ``` 2. **在程序挂掉后,在终端通过指令 dmesg#或者dmesg | grep 你的程序名 在系统日志中查找到相关的信息。** 3. **使用 addr2line -e a.out xxxxxxxx 的格式来对三个地址进行解析,其中 “xxxxxxxx” 是地址的十六进制表示。** 4. **成功解析后,打印出代码行号,分析问题所在。** **示例:** ```bash $ g++ -g a.out $ dmesg # 发现程序挂了,终端输出以下信息: a.out[2374]: segfault at 7f0ed0bfbf70 ip 00007f0edd646fe7 sp 00007f0ed3603978 error 4 a.out[7f0edd514000+1b6000] at(位置),ip(instruction pointer 指令指针),sp(stack pointer 堆指针),后面跟的都是地址。 addr2line -e a.out xxxxxxxx 7f0ed0bfbf70 $ echo "代码行号:7f0ed0bfbf70" ``` **注意:** * `addr2line` 是一个工具,需要安装。 * 可以使用 `valgrind` 等工具进行性能分析,但可能需要付费。 * 如果问题是动态库,需要使用 `dmesg` 或其他工具获取地址。

正文

这篇博文记录的非常详细:https://blog.csdn.net/zhaohaijie600/article/details/45246569

我的笔记:

写的C++程序老是运行两三天就挂了,关键是挂的时候连“segment fault”都不显示。动用了gdb、valgrind还是没办法,最后还是根据系统的日志定位到了问题。

首先,最好是在编译时加上debug选项(-g)。

程序挂掉后,在终端通过指令

  1. dmesg
  2. #或者
  3. dmesg | grep 你的程序名

在系统日志中查找到相关的信息。


随便写个例子:

a.out[2374]: segfault at 7f0ed0bfbf70 ip 00007f0edd646fe7 sp 00007f0ed3603978 error 4 a.out[7f0edd514000+1b6000]

at(位置),ip(instruction pointer 指令指针),sp(stack pointer 堆指针),后面跟的都是地址。

对这三个地址分别执行

addr2line -e a.out xxxxxxxx
这里的“xxxxxxxx”就是上面的“7f0ed……”,前面的0可以省略,三个地址都试一下。如果成功了,终端会打印出来这个地址对应的代码行(前面提到编译时要加-g)。


这里的“error 4”是什么意思?把它更换成二进制表示,就是:100。说明是用户态内存访问越界了

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

然后就去找问题啦。如果是自己代码的问题,上面执行“addr2line”的时候就直接把出错的代码行号都给出来了;如果是动态库的问题,可以借鉴上面链接博客里的经验。

</article>

与[转帖]程序运行崩溃(segfault)的排查方法相似的内容:

[转帖]程序运行崩溃(segfault)的排查方法

这篇博文记录的非常详细:https://blog.csdn.net/zhaohaijie600/article/details/45246569 我的笔记: 写的C++程序老是运行两三天就挂了,关键是挂的时候连“segment fault”都不显示。动用了gdb、valgrind还是没办法,最后还是

[转帖]踩内存问题分析工具

序 踩内存问题,大家都知道,是一个比较难分析的问题。 踩内存问题被发现,通常是程序崩溃的时候,能够生成coredump分析,知道是哪个内存被踩了,但通常是很难分析出是哪段代码出现了踩内存的问题。 本文会介绍几种分析踩内存问题的工具,有些工具是最近发现的,我还没有大量使用过,所以只是个简单的介绍,各位

[转帖]【Python】计算程序运行时间的方法总结

一、第一种方法 利用time包: import time def test(): start_time = time.time() # 记录程序开始运行时间 s = 0 for i in range(1000000): s += 1 end_time = time.time() # 记录程序结束运行

[转帖]使用MAT命令行工具生成堆dump分析文件

https://www.cnblogs.com/hellxz/p/use_mat_linux_command_line_generate_reports.html 写作目标 Java程序运行过程中,难免会出现 OOM,往往是在 JVM 启动参数中添加出现 OOM 时输出堆 dump(又名:堆转储、堆

[转帖]flamegraph(火焰图)性能分析

`https://www.cnblogs.com/HadesBlog/p/13877761.html` 使用perf工具以及flamegraph可以将调试的程序运行栈以及在每个函数中停留的时间以火焰图的形式展现出来。 perf工具可以在内核源码tools/perf中编译安装。 make && mak

[转帖]Linux 性能优化和内核观测 - CPU 篇(一)

https://blog.51cto.com/hongchen99/5840053 简介 中央处理器(central processing unit,简称 CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。所有的计算机程序都运行在CPU之上,在大多数情况下CPU都是性能分析

[转帖]JVM系列之:关于即时编译器的那些事

本文为《深入学习 JVM 系列》第十六篇文章 我们在前文学习 Java 是如何执行的这篇文章中有提及即时编译器,这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码,直接运行在底层硬件之上。 那么问题来了,既然在 Ho

[转帖]【JVM】类文件结构

Class文件的定义 一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在class文件中,中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序。 注:Java虚拟机规范规定,Class文件格式采用类似C语言结构体的伪结构来存储数据,这种结构只有两种数据类型:

[转帖]【初探】java性能火焰图的生成

https://www.cnblogs.com/hama1993/p/10580581.html 一、前言 开始之前,你需要准备的环境: Linux系统机器或者虚拟机一台,里面需要安装的软件:git、jdk、perl。 二、简单介绍 java性能分析火焰图的所做的事情就是能够分析出java程序运行期

[转帖]【初探】java性能火焰图的生成

https://www.cnblogs.com/hama1993/p/10580581.html 一、前言 开始之前,你需要准备的环境: Linux系统机器或者虚拟机一台,里面需要安装的软件:git、jdk、perl。 二、简单介绍 java性能分析火焰图的所做的事情就是能够分析出java程序运行期