今天遇到一个诡异的内存被踩的问题,后来发现是一个全局变量与另一个静态库中的全局变量重名了,

a.c:

#include <stdio.h>int g_ctx = 0;
int g_overlap = 0;int a_store_data(int n)
{g_ctx = n;return 0;
}int a_read_data()
{printf("a_read_data: g_ctx(%d) g_overlap(%d)\n", g_ctx, g_overlap);return 0;
}

b.c:

#include <stdio.h>typedef struct {int a;int b;int c;
} b_s;b_s g_ctx;int b_store_data(int a, int b, int c)
{g_ctx.a = a;g_ctx.b = b;g_ctx.c = c;return 0;
}int b_read_data()
{printf("b_read_data: a(%d) b(%d) c(%d)\n", g_ctx.a, g_ctx.b, g_ctx.c);return 0;
}

main.c:

#include <stdio.h>int main()
{a_store_data(40);b_read_data();b_store_data(1,2,3);a_read_data();return 0;
}

在a.c和b.c中都定义了全局变量g_ctx,反汇编后可以看到:


Disassembly of section .dynsym:...skipping...
00021044 <g_ctx>:21044:       00000000        andeq   r0, r0, r000021048 <g_overlap>:21048:       00000000        andeq   r0, r0, r0

数据段中g_ctx中分配了4个字节,因此在b.c中访问g_ctx时会导致踩内存

因此全局变量尽量都用static进行修饰,加上static 后数据段如下:

Disassembly of section .dynsym:...skipping...21028:       00000000        andeq   r0, r0, r00002102c <object.9137>:...00021044 <g_overlap>:21044:       00000000        andeq   r0, r0, r000021048 <g_ctx>:21048:       00000000        andeq   r0, r0, r00002104c <g_ctx>:...

可以看到数据段中有两个g_ctx

全局变量同名导致踩内存相关推荐

  1. free导致的内存踩踏例子

    free()是C语言中释放内存的主流函数.他的实质是修改一块内存的标记为"空闲",仅此而已.既不会清零内存也不会对内存链表做修改,仅仅是修改标记. free的原型是: void f ...

  2. linux 定位 踩内存_记录一次用户态踩内存问题

    这几天在做总结,把三年前写的一个定位案例,翻了出来.回想起定位这个问题时的场景,领导催得紧,自己对很多东西又不熟悉,所以当时面临的压力还是很大的.现在回想起来感慨还是很多的,我们在遇到任何一个问题,一 ...

  3. linux踩内存怎么定位,问题定位:内存泄漏,踩内存。

    1.内存泄漏 确定现象: linux 内存泄漏,可以查看slabinfo 和另外一个proc下(貌似meminfo),关于内存的信息,可以看到内存是否在不断减少,以及减少的速度. vxworks系统, ...

  4. 踩内存是什么意思啊_面试|搬了这么久的砖,居然还不知道什么“踩内存”

    摘要:你是否在总是听到"内存越界","指针指向了非法地址"等常见问题呢?但是在面试过程中总有一些学术严谨(装13)的面试官给这一类问题取个名字-踩内存.如果你没 ...

  5. mmap函数_分析由 mmap 导致的内存泄漏

    背景 一个程序链接 TCMalloc ,同时调用 mmap / munmap 管理一部分较大的内存 通过 TCMalloc 的统计信息,判断内存泄漏不是由 new / malloc 等常规接口导致的 ...

  6. Go 编程怎么也有踩内存?

    作者 | 奇伢       责编 | 欧阳姝黎 前情概要 有位读者群里抛出过一段自己研究的代码,并附上这么一个问题: 读者朋友贴出的代码截屏: 为了刚好的研究,下面贴出来代码文本: package m ...

  7. 记一次《C语言踩内存》问题定位有感

    踩内存问题,个人认为算是比较容易出现但是有很难定位的问题,被踩者轻者功能瘫痪,重者一命呜呼,直接诱发死机.产生踩内存的的原因也比较多样,比较典型的有如下几种: 数组越界访问 字符串越界操作 直接操作野 ...

  8. 一种踩内存的定位方法(C++)

    在嵌入式应用开发过程中,踩内存的问题常常让人束手无策.使用gdb调试工具,可以大幅加快问题的定位.不过,对于某些踩内存的问题,它的表现是间接的,应用崩溃的位置也是不固定的,这就给问题定位带来了更大的困 ...

  9. 内存泄漏 内存溢出 踩内存 malloc底层实现原理

    本文主要对内存泄漏.内存溢出.内存踩踏[踩内存]以及malloc的底层实现原理进行了总结.话不多说,直接往下看: 参考文章: 内存泄漏与内存溢出: https://blog.csdn.net/ruir ...

最新文章

  1. Thinkphp怎样修改模板标签定界符
  2. 2010Bossie大奖:十佳开源平台和中间件
  3. FreeMarker Eclipse Plugin的安装!
  4. 信息学奥赛一本通(1017:浮点型数据类型存储空间大小)
  5. 在Windows XP 32位系统中安装JDK 1.8
  6. 【恋上数据结构】排序算法前置知识及代码环境准备
  7. java删除文件夹的方法
  8. XP 远程连接window 2008 网络级别身份验证问题解决方法
  9. android判断是华为手机,华为手机怎么辨别真假?华为手机真伪验证多种方法
  10. 多元统计分析 (一):聚类分析
  11. 2009福布斯最具潜力中小企业榜
  12. 2016安卓手机安全隐私之对比与分析
  13. 手机上测试东南西北方向软件,指南针怎么看东南西北(手机指南针怎么看图解)...
  14. 获取指定文件夹下所有的同种类型文档的名字(Python)
  15. 如何检索论文被引用情况
  16. win10开始菜单卡住没反应,其他都没问题 看视频也没问题。
  17. Bomblab(ICS课程回课pku)
  18. 参加最牛逼的运营人年终聚会,是种什么样的体验
  19. MyBatis框架笔记
  20. MySQLdb ImportError: libmysqlclient.so.18 No Such File or Directory

热门文章

  1. 利用遗忘曲线记英语单词 -- 41天
  2. 多功能平均电流型 LED 恒流驱动器Hi7010
  3. 2021年11月-火狐浏览器添加自定义搜索引擎之办法
  4. apache网页中文乱码解决方法
  5. Prometheus(普罗米修斯)
  6. Deep Feedforward Networks(1)
  7. python-视频声音根据语音识别自动转为带时间的srt字幕文件
  8. Arduino UNO + 433无线模块实例
  9. linux minit Python2和python3切换
  10. 【C++】数据类型|数据类型转换|数据表达处理