警告背后的use after free

问题背景

工模测试出现自动重启。

分析过程

用GAT解开db,并结合对应的vmlinux(该文件必须和db一致,具体请看FAQ06985),利用工具E-Consulter分析(也可以参考FAQ13941),分析里几个db发现都是内存踩坏,随机踩,这种情况要么是软件引入的,要么是硬件故障。

做以下调查:

  1. 单体复现还是多台机器出现?
  2. 什么时候出现?之前是否就存在?
  3. 复现概率?

反馈的结果:

  1. 多台机器出现。
  2. 最近才出现。
  3. 基本上1、2小时即可打出来。

这种情况,最快的是回溯版本,因此建议如下:

  1. 检查会复现和不会复现的版本对比,细分版本验证,找出引起问题的改动。
  2. 在所有版本导入如下修改,用于抓取内存乱踩故障,加速定位问题:FAQ14614 如何用MMU保护buddy system?
  3. 检查2个版本的patch。

在第2步导入,同时切换eng版本,再次抓到问题点,E-Consulter工具分析结果如下:

== 异常报告v1.4(仅供参考) ==
详细描述: 断言失败{主动调用BUG()/BUG_ON()},请结合崩溃进程调用栈检查相关代码
异常时间: 4182.704223秒, Thu Apr 14 19:00:59 CST 2016

== CPU信息 ==
崩溃CPU信息:
CPU8: 进程名: hps_main, 进程标识符(pid): 208, 中断: 关
本地调用栈:
vmlinux object_err(s=0xFFFFFFC04E601180, page=0xFFFFFFBE016F9618, object=0xFFFFFFC029065400) + 104 <mm/slub.c:738>
vmlinux free_debug_processing(s=0xFFFFFFC04E601180, page=0xFFFFFFBE016F9618, object=0xFFFFFFC029065400, addr=-274874499176, flags=0xFFFFFFC06A5AB418) + 792 <mm/slub.c:1163>
vmlinux __slab_free(s=0xFFFFFFC04E601180, page=0xFFFFFFBE016F9618, x=0xFFFFFFC029065400, addr=-274874499176) + 696 <mm/slub.c:2632>
vmlinux slab_free() + 528 <mm/slub.c:2778>
vmlinux kfree(x=0xFFFFFFC029065400) + 720 <mm/slub.c:3443>
vmlinux kobject_cleanup() + 160 <lib/kobject.c:631>
vmlinux kobject_release(kref=0xFFFFFFC065FC8A90) + 172 <lib/kobject.c:654>
vmlinux kref_sub() + 24 <include/linux/kref.h:74>
vmlinux kref_put() + 24 <include/linux/kref.h:99>
vmlinux kobject_put(kobj=0xFFFFFFC065FC8A58) + 56 <lib/kobject.c:671>
vmlinux cpufreq_cpu_put(policy=0xFFFFFFC065FC8980) + 12 <drivers/cpufreq/cpufreq.c:239>
vmlinux cpufreq_cpu_put() + 36 <drivers/cpufreq/cpufreq.c:2197>
vmlinux cpufreq_get_policy(policy=0xFFFFFFC06A5AB5F8) + 92 <drivers/cpufreq/cpufreq.c:2195>
vmlinux cpu_hotplug_handler(nb=cpu_hotplug, val=2, data=8) + 236 <drivers/misc/mediatek/sched/rq_stats.c:490>
vmlinux notifier_call_chain() + 132 <kernel/notifier.c:124>
vmlinux __raw_notifier_call_chain(nr_to_call=-1, nr_calls=0) + 8 <kernel/notifier.c:445>
vmlinux __cpu_notify() + 24 <kernel/cpu.c:260>
vmlinux cpu_notify(val=2, v=8) + 32 <kernel/cpu.c:268>
vmlinux _cpu_up(cpu=8, tasks_frozen=0) + 520 <kernel/cpu.c:630>
vmlinux _cpu_up_profile() + 2
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 堆使用后释放错误(heap use after free)是指在程序中使用了已经被释放的堆内存。这种错误通常会导致程序崩溃或者出现不可预测的行为。为了避免这种错误,程序员需要在使用完堆内存后及时释放它,并且在释放后不再使用该内存。 ### 回答2: heap use after free是一种常见的内存使用错误,它指的是在使用堆内存时,释放了某个内存块,但后续又继续使用了该内存块。这种错误可以导致程序崩溃、数据损坏,甚至是安全漏洞。 通常,堆内存的分配和释放是由程序员负责的。在程序中,当需要动态分配一块内存时,通常使用malloc()函数,在使用完该内存块之后,需要通过free()函数来释放该内存块。但是,如果程序员在释放内存块之后,依然在程序中继续使用该内存块,则会发生heap use after free错误。 具体来说,当程序释放内存块时,操作系统会将该内存块标记为可用的状态,但是并不会真正销毁该内存块,这意味着该内存块中原有的数据可能还存在,但已经不再属于该内存块。如果程序员在已经释放了内存块的情况下,继续使用该内存块,则可能会覆盖该内存块原有的数据,导致数据损坏。此外,由于已经释放的内存块可能会被操作系统重复利用,这也可能会导致堆内存中存在未预期的数据。 为了避免heap use after free错误,程序员可以采取一些措施。首先,应该在使用内存块之前检查该内存块是否已经被释放,以确保不会继续使用已经释放的内存块。其次,在释放内存块之后,可以将指向该内存块的指针设置为NULL,以避免意外地继续使用该内存块。此外,可以使用一些内存检测工具,如Valgrind等,来帮助检测和排除heap use after free错误。 ### 回答3: Heap use after free(堆溢出)是一种常见的内存管理错误,它会导致程序崩溃或者安全漏洞。 当程序中使用malloc()、realloc()、calloc()等动态分配内存的函数后,程序会在堆区域内分配内存,同时也会记录该块内存的大小和地址等信息。而当程序中释放该块内存时,通过free()函数将其返回给操作系统并将相关记录清空,但是在程序中,如果继续使用已经释放的内存,就会导致Heap use after free错误。 通常,程序员在使用free()函数释放内存后,应该将指向该内存的指针设置为NULL,以避免后续误用该指针。否则,指针会指向之前释放的内存地址,后续再次访问该指针就会导致程序崩溃或者执行错误的操作。 堆溢出还可能是一些恶意程序攻击的手段。攻击者在程序中制造类似的堆溢出漏洞,以便在运行时利用该漏洞来执行恶意代码。这种攻击被称为堆溢出攻击(Heap Overflow Attack)。 对于企业和个人开发者来说,避免Heap use after free错误可以通过以下几个方面来做到。 1. 了解内存分配释放的细节,在编写程序时注意不要出现内存泄露、重复释放等问题。 2. 使用内存分配和释放函数时,必须正确地管理内存指针,不要造成内存泄露或者重复释放的问题。 3. 使用编译器的内存检查工具进行内存检查,如Valgrind、Clang、GCC等。 4. 在编写程序时,可以使用一些内存管理工具和库,如Boost库、STL库等。这些工具和库可以帮助程序员进行内存管理和错误检测,减少代码错误的可能性。 总之,了解和避免Heap use after free错误是编写高质量、可靠和安全的程序的必要条件之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值