我正在处理我的应用程序的不良行为......我最近将我的 g++-4.1 升级到 g++-4.8,并且我遇到了一些类实例的私有成员和主源中全局定义的一些变量之间的内存重叠.
用 gdb 捕获写入并查看变量指针,我可以清楚地看到它们共享相同的内存地址。
激活 4.8 中引入的 -fsanitize=address 我可以看到相同的结果。
==================================================== ================ ==5160== 错误:AddressSanitizer:全局缓冲区溢出地址 0x00000079750c 在 pc 0x4ba54f bp 0x7ffc0dc35df0 sp 0x7ffc0dc35de8 在 0x00000079750c 线程 T0 写入大小 1 #0 0x4ba54e (/opt/softplc/softplc+0x4ba54e) #1 0x4bd988 (/opt/softplc/softplc+0x4bd988) #2 0x4c1ea1 (/opt/softplc/softplc+0x4c1ea1) #3 0x4ba7c5 (/opt/softplc/softplc+0x4ba7c5) #4 0x409116 (/opt/softplc/softplc+0x409116) #5 0x511cfc (/opt/softplc/softplc+0x511cfc) #6 0x7fce6124de54 (/lib/x86_64-linux-gnu/libc-2.19.so+0x21e54) #7 0x409c24 (/opt/softplc/softplc+0x409c24) 0x00000079750c 位于大小为 8 的全局变量“loopcounteryyyyyyy (softplc.cpp)”(0x797520) 左侧 20 个字节处 'loopcounteryyyyyyy (softplc.cpp)' 是 ascii 字符串'' 0x00000079750c 位于大小为 8 的全局变量“tod (softplc.cpp)”(0x7974e0) 右侧 36 个字节处 'tod (softplc.cpp)' 是 ascii 字符串'' 错误地址周围的影子字节: 0x0000800eae50:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0000800eae60: 00 00 记录器线程 PID= 5160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0000800eae70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0000800eae80: 00 00 00 00 00 00 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eae90: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 => 0x0000800eaea0: f9[f9]f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaeb0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaec0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaed0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaee0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaef0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 影子字节图例(一个影子字节代表 8 个应用程序字节): 可寻址:00 部分可寻址:01 02 03 04 05 06 07 堆左红区:fa 堆右红区:fb 释放的堆区域:fd 堆栈左红区:f1 堆栈中间红区:f2 堆栈右红区:f3 堆栈部分红区:f4 返回后的堆栈:f5 作用域后的堆栈使用:f8 全球红区:f9 全局初始化顺序:f6 被用户中毒:f7 ASan 内部:fe ==5160== 正在中止
代码非常庞大,当我尝试剪切部分代码以隔离问题时,重叠区域会向上移动以消失。
无论如何,一切都是静态定义的,没有实例定义运行时,所以,我认为,重叠是编译器或 gcclib 的一种错误,或者我不知道还有谁在同一地址上分配了两个不同的项目. 问题是:我可以通过哪些其他方式调查并生成更多有用的信息以跟踪此“错误”的原因?