首页 > 系统相关 >使用GDB检测内存泄漏

使用GDB检测内存泄漏

时间:2022-11-20 19:36:44浏览次数:48  
标签:泄漏 malloc addr void gdb send GDB 内存 expect


使用GDB在malloc和free函数设置断点,并打印分配和释放时的内存地址以及调用栈,然后通过脚本分析分配和释放是否配对来检测是否存在内存泄露以及发生内存泄漏的位置。

mingdu.zheng at gmail dot com

malloc和free的包装,为了方便地设置断点。

#include <stdlib>

void _wrapmalloc_print_addr(const void* addr)
{
(void)addr;
}

void _wrapfree_print_addr(const void* addr)
{
(void)addr;
}

void *wrapmalloc(size_t size)
{
void *p;
p = malloc(size);

if(p)
{
_wrapmalloc_print_addr(p);
}

return p;
}

void wrapfree(const void *p)
{
if(p)
{
_wrapfree_print_addr(p);
}
free((void*)p);
}

自动化脚本,调用GDB,自动输入命令,报告输出到leak.log。

#!/usr/bin/expect -f
set gdb [lindex $argv 0]
set exec [lindex $argv 1]
set target [lindex $argv 2]
set timeout 10000

spawn $gdb $exec -ex $target

expect "(gdb)"
send "monitor reset\r"

expect "(gdb)"
send "load\r"

#expect "(gdb)"
#send "monitor reset\r"

expect "(gdb)"
send "set pagination off\r"

expect "(gdb)"
send "b _wrapmalloc_print_addr\r"

expect "(gdb)"
send "commands\r"
expect ">"
send "silent\r"
expect ">"
send "printf \"malloc,%p\\n\", addr\r"
expect ">"
send "bt 5\r"
expect ">"
send "c\r"
expect ">"
send "end\r"

expect "(gdb)"
send "b _wrapfree_print_addr\r"

expect "(gdb)"
send "commands\r"
expect ">"
send "silent\r"
expect ">"
send "printf \"free,%p\\n\", addr\r"
expect ">"
send "bt 5\r"
expect ">"
send "c\r"
expect ">"
send "end\r"

expect "(gdb)"
send "c\r"

expect eof
exit

内存泄漏分析脚本,检测malloc释放有配对的free,如果没有那么打印该malloc的调用栈,通过调用栈可以找到分配内存的位置。

#!/usr/bin/python

path="leak.log"

t = {}
f = file(path)
l = f.readline()
malloc = False
a = ""
while l != "":
if l.startswith("malloc"):
malloc = True
a = l.split(",")[1]
t[a] = ""
elif l.startswith("free"):
malloc = False
del t[l.split(",")[1]]
else:
if malloc:
t[a] += l

l = f.readline()

for i in t:
print i
print t[i]


标签:泄漏,malloc,addr,void,gdb,send,GDB,内存,expect
From: https://blog.51cto.com/zoomdy/5871666

相关文章

  • Linux设置虚拟内存
    一、虚拟内存介绍背景介绍Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存的......
  • Final Cut Pro渲染文件占用内存太大,一招解决释放更大空间!
    使用FinalCutPro剪辑视频,默认后台渲染,长时间的积累,会有很多无用文件占用宝贵内存,今天来分享解决方法,一起看看吧!方法如下:选中资源库,点击「文件」-「删除生成的资源库文......
  • JVM - 1.内存结构
    1内存结构1.1程序计数器1.1.1作用在执行的过程中,记住下一条jvm指令的执行地址物理上通过寄存器实现1.1.2特性每个线程都有自己的程序计数器-线程私有......
  • C语言将二进制文件写入内存malloc fopen fseek fread
    ///20221118malloc获取文件大小,并读取内存中///voidFuncation3(){//保存读入到内存中的结果//创建一个buffer,用来将打开的文件放入申请的内存中char*......
  • 94:类方法_静态方法_内存分析图示
    ###类方法 类方法是从属于“类对象”的方法。类方法通过装饰器@classmethod来定义,格式如下:  @classmethod  def类方法名(cls[,形参列表]):    函数体要点如下......
  • 93:类属性_内存分析创建类和对象的底层
    类属性是从属于“类对象”的属性,也称为“类变量”。由于,类属性从属于类对象,可以被所有实例对象共享。类属性的定义方式:  class类名:    类变量名=初始值在类中或......
  • 90:实例属性_内存分析
    ###实例属性和实例方法###实例属性实例属性是从属于实例对象的属性,也称为“实例变量”。他的使用有如下几个要点:1.实例属性一般在__init__()方法中通过如下代码定义:  ......
  • LyScript 实现对内存堆栈扫描
    LyScript插件中提供了三种基本的堆栈操作方法,其中push_stack用于入栈,pop_stack用于出栈,而最有用的是peek_stack函数,该函数可用于检查指定堆栈位置处的内存参数,利用这个特性......
  • GDB调试使用的命令
    1、目前线上问题出现内存泄露,怎样使用shell脚本执行gdbattach后breakbtquit等快速执行呢?2、多进程多线程一般会用到那些命令?对于第一个went:以前文章有:gdb快速打......
  • 81:递归函数_函数调用内存分析_栈帧的创建
    ###递归函数递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。递归类似于大家中学数学学习过的“数学归纳法”。每个递归函数必须包含两个部分:1.......