linux下常见内存异常查证工具和方法介绍

linux下常见内存异常查证工具和方法介绍

内存异常导致的异常往往很难查证,本文介绍在linux下的各种常见内存异常的查证工具和方法。

1、访问空指针/未初始化指针

这个是最简单的内存异常了,只要能够生成coredump文件,可以快速定位问题代码。

开启coredump

部分环境下默认不会生成coredump,需要运行如下命令:
ulimit -c unlimited //unlimited表示不限制coredump文件大小,也可以指定一个最大文件大小。

定制core文件名

默认的coredump文件名为core,如果想自己定制core文件名,可以运行如下命令:
echo “./core-%e-%p-%t” > /proc/sys/kernel/core_pattern
可以在core_pattern模板中使用变量还很多,见下面的列表:
%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h 主机名
%e 程序文件名

使用gdb定位代码行

问题代码

int main()
{
    int *p=0;
    *p=6;
    return 0;
}

使用gcc -g编译后运行出现异常,通过gdb即可定位出错代码行

[email protected]:/home/zte/test# gcc null.cc -g
[email protected]:/home/zte/test# ./a.out
Segmentation fault (core dumped)
[email protected]:/home/zte/test# gdb a.out core
.......
Core was generated by `./null‘.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000004004fd in main () at null.cc:4
4        *p=6;

2、函数栈溢出

局部变量的写越界可能会破坏函数栈帧导致程序coredump,由于默认不会在越界的第一现场coredump,导致问题查证非常困难。
幸运的是我们可以通过gcc的编译选项-fstack-protector 和 -fstack-protector-all在函数栈被破坏的第一现场就coredump,从而可以方便地定位问题。

示例

int main()
{
    int a=5;
    int *p=&a;
    p[3]=6;
    return 0;
}

上面代码会破坏函数栈,如果我们用gcc直接编译运行,不会抛异常。但是加了编译参数-fstack-protector 和 -fstack-protector-all后,再运行就会抛异常。下面是具体命令执行结果。

[email protected]:/home/zte/test# gcc t.c
[email protected]:/home/zte/test# ./a.out
[email protected]:/home/zte/test# gcc t.c -fstack-protector -fstack-protector-all -g
[email protected]:/home/zte/test# ./a.out
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)

可以进一步用gdb的bt命令定位出问题的函数。

[email protected]:/home/zte/test# gdb a.out core
。。。。。。。。
Core was generated by `./a.out‘.
Program terminated with signal SIGABRT, Aborted.
#0  0x00007f6bcfab5c37 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56    ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007f6bcfab5c37 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007f6bcfab9028 in __GI_abort () at abort.c:89
#2  0x00007f6bcfaf22a4 in __libc_message ([email protected]=1, [email protected]=0x7f6bcfc01d70 "*** %s ***: %s terminated\n")
    at ../sysdeps/posix/libc_fatal.c:175
#3  0x00007f6bcfb8d83c in __GI___fortify_fail (msg=<optimized out>, [email protected]=0x7f6bcfc01d58 "stack smashing detected")
    at fortify_fail.c:38
#4  0x00007f6bcfb8d7e0 in __stack_chk_fail () at stack_chk_fail.c:28
#5  0x00000000004005aa in main () at t.c:7
(gdb) q

3、越界读写动态分配内存/读写已释放动态分配内存

动态分配内存读写越界、读写已释放动态分配内存系统默认可能不会抛异常,我们可以使用electric-fence来使得读写越界内存立刻抛异常,加速问题定位。

安装Electric fence

sudo apt-get install electric-fence

使用Electric fence

下面是越界写代码

#include <stdlib.h>

int main()
{
    int *p = (int*)malloc(sizeof(int));
    p[1] = 6;
    return 0;
}

如果使用gcc直接编译运行,不会抛异常。
我们可以加上参数 -lefence -g编译后运行,就会抛异常。通过gdb的bt打印即可定位到问题代码行。

[email protected]:/home/zte/test# gcc malloc_read_free.cc -lefence -g
[email protected]:/home/zte/test# ./a.out 

  Electric Fence 2.2 Copyright (C) 1987-1999 Bruce Perens <[email protected]>
Segmentation fault (core dumped)

4、动态分配内存重复释放

默认会抛异常,通过gdb和coredump即可定位。

generated by haroopad

时间: 2024-12-09 11:29:53

linux下常见内存异常查证工具和方法介绍的相关文章

Linux下C++内存泄露检测工具

下载安装:http://blog.csdn.net/wanglin754/article/details/7194145 下载地址:http://www.valgrind.org/downloads/current.html#current 安装valgrind tar jxvf valgrind-3.7.0.tar.bz2             注意这里的参数里加了j,表示有bz2属性 cd valgrind-3.7.0 ./configure make make install make

Linux下检测内存泄露的工具 valgrind

参考:http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html 几乎是照抄参考过来的,只不过后面自己调试一下代码. 这里主要介绍Valgrind的一些简单用法.更多详细的使用方法可以访问valgrind的主页:http://www.valgrind.org Valgrind是Julian Seward的作品.Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核,一个软件合成的CPU,和一系列的

Linux下常见的性能分析工具

1.vmstat--Virtual Meomory Statistics,可以对操作系统的内存信息.进程状态.CPU活动等进行监视,但是无法对某个进程进行深入分析 vmstat-n表示在周期性的循环输出,输出的头部信息仅显示一次delay两次的输出间隔时间count按照delay指定的时间间隔统计的次数proces  r列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数,说明cpu不足.  b列表示等待资源的进程数,比如正在等待IO或者内存交换memory  swap表示切换

【调试】Linux下超强内存检测工具Valgrind

[调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Linux下,开放源代码(GPLV2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成. 内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.

Linux下常见服务器模型

Linux下常见服务器模型 到今天在公司呆了8个月,完成从校园人到职场人的转身.出身社会,感触颇多,一切身不由己.在工作中快乐过.焦虑过.失望过,到最后的心凉,这一路下来成长不少.大学毕业设计涉及网络知识,当时学习了一些基础的网络知识,工作不久,转到新的项目组hms做的产品IPTV刚好和网络相关,最近几个月一直在看<linux高性能服务器编程>,在网上也看了不少文章,一直想写篇总结. 基础 图1 c/s架构通信 图1是一个简化的tcp通信过程,左侧为“服务器端”,右侧为“客户端”,tcp协议本

Perf Event :Linux下的系统性能调优工具

Perf Event :Linux下的系统性能调优工具 2011-05-27 10:35 刘 明 IBMDW 字号:T | T Perf Event 是一款随 Linux 内核代码一同发布和维护的性能诊断工具,由内核社区维护和发展.Perf 不仅可以用于应用程序的性能统计分析,也可以应用于内核代码的性能统计和分析.得益于其优秀的体系结构设计,越来越多的新功能被加入 Perf,使其已经成为一个多功能的性能统计工具集 .本文将介绍 Perf 在应用程序开发上的应用. AD:2014WOT全球软件技术

Linux下常见的文本处理命令

众所周知,在Linux下"一切皆文件"的原则,一切配置文件都可以以文本的方式进行编辑.存储.故对文本文件的操作能力,决定着你是否能够在Linux下操纵自如.今天,就写下几个关于Linux下一些常用的文本处理命令. 1.文本文件查看命令:cat.more.less.head.tail 1.1 cat命令:连接并显示,当文本文件有多个时,将其连接并一个一个的完整地显示出来 eg: cat /etc/inittab cat /etc/fstab cat /etc/inittab /etc/f

Linux下各种后门和日志工具详解

攻入Linux系统后,很多入侵者往往就开始得意忘形了.这其中还有一个原因,就是技术性也要求更高了.下面,我们来看看一些常用的经典工具. 1.从这里延伸:后门和连接工具 (1)Httptunnel Tunnel的意思是隧道,通常HTTPTunnel被称之为HTTP暗道,它的原理就是将数据伪装成HTTP的数据形式来穿过防火墙,实际上,它是在HTTP请求中创建了一个双向的虚拟数据连接来穿透防火墙.说得简单点,就是说在防火墙两边都设立一个转换程序,将原来需要发送或接受的数据包封装成HTTP请求的格式骗过

linux下常见解压缩命令

linux下常见的压缩文件格式有tar.gz.tar.gz.tar.bz2.zip等等.对于不同的压缩文件格式有对应的解压缩命令.下面就对此小结一下: 1.后缀为.tar 用 tar –xvf 解压 2.后缀为.gz 用 gzip -d或者gunzip 解压 3.后缀为.tar.gz和*.tgz 用 tar –xzf 解压 4.后缀为.bz2 用 bzip2 -d或者用bunzip2 解压 5.后缀为.tar.bz2用tar –xjf 解压 6.后缀为.Z 用 uncompress 解压 7.后