1.现象描述:
程序在启动时,解析xml文件时出现malloc(): memory corruption (fast): 0x09a5e3e8错误。相同的代码在windows下运行时不会出现错误。
具体错误信息为:
*** glibc detected *** ./test_61850: malloc(): memory corruption (fast): 0x095133e8 ***
======= Backtrace: =========
/lib/libc.so.6[0xa55d96]
/lib/libc.so.6[0xa5684e]
/lib/libc.so.6(realloc+0xe6)[0xa574a6]
../lib/lib61850.so[0x85d1f7]
../lib/libutils.so[0x275c00]
../lib/libexpat.so[0x8d5ea2]
../lib/libexpat.so[0x8d6d81]
../lib/libexpat.so(XML_ParseBuffer+0x7c)[0x8cf83c]
../lib/libexpat.so(XML_Parse+0xd3)[0x8d0cf3]
../lib/libutils.so(dcfg_read+0x188)[0x275e1d]
../lib/lib61850.so(dsscd_read+0xc5)[0x85da2b]
../lib/lib61850.so(StartTasks+0x3c)[0x87bc90]
../lib/lib61850.so(BIO_Init+0x3b)[0x8448b1]
./test_61850[0x804c059]
./test_61850(__gxx_personality_v0+0x17d)[0x80491c5]
./test_61850(__gxx_personality_v0+0x237)[0x804927f]
/lib/libc.so.6(__libc_start_main+0xdc)[0xa00e9c]
./test_61850(__gxx_personality_v0+0x79)[0x80490c1]
======= Memory map: ========
00110000-00112000 r-xp 00000000 08:02 426398 /users/oracle/lib61850/debug/linux-i386/lib/libcharset.so.1
00112000-00113000 rwxp 00001000 08:02 426398 /users/oracle/lib61850/debug/linux-i386/lib/libcharset.so.1
00139000-00140000 r-xp 00000000 08:02 426395 /users/oracle/lib61850/debug/linux-i386/lib/libfmap.so
00140000-00141000 rwxp 00006000 08:02 426395 /users/oracle/lib61850/debug/linux-i386/lib/libfmap.so
00237000-0023e000 r-xp 00000000 08:01 885981 /lib/librt-2.5.so
0023e000-0023f000 r-xp 00007000 08:01 885981 /lib/librt-2.5.so
0023f000-00240000 rwxp 00008000 08:01 885981 /lib/librt-2.5.so
00274000-00278000 r-xp 00000000 08:02 426368 /users/oracle/lib61850/debug/linux-i386/lib/libutils.so
00278000-00279000 rwxp 00003000 08:02 426368 /users/oracle/lib61850/debug/linux-i386/lib/libutils.so
002e7000-002e8000 r-xp 002e7000 00:00 0 [vdso]
003da000-0046a000 r-xp 00000000 08:02 426392 /users/oracle/lib61850/debug/linux-i386/lib/libssacsi.so
0046a000-0046e000 rwxp 0008f000 08:02 426392 /users/oracle/lib61850/debug/linux-i386/lib/libssacsi.so
0046e000-00472000 rwxp 0046e000 00:00 0
0059f000-005a2000 r-xp 00000000 08:02 426396 /users/oracle/lib61850/debug/linux-i386/lib/libnetlog.so
005a2000-005a3000 rwxp 00003000 08:02 426396 /users/oracle/lib61850/debug/linux-i386/lib/libnetlog.so
005f2000-006d1000 r-xp 00000000 08:02 426401 /users/oracle/lib61850/debug/linux-i386/lib/libiconv.so.2
006d1000-006d2000 rwxp 000df000 08:02 426401 /users/oracle/lib61850/debug/linux-i386/lib/libiconv.so.2
0082f000-00894000 r-xp 00000000 08:02 426397 /users/oracle/lib61850/debug/linux-i386/lib/lib61850.so
00894000-00897000 rwxp 00065000 08:02 426397 /users/oracle/lib61850/debug/linux-i386/lib/lib61850.so
00897000-00898000 rwxp 00897000 00:00 0
008cd000-008ef000 r-xp 00000000 08:02 426369 /users/oracle/lib61850/debug/linux-i386/lib/libexpat.so
008ef000-008f0000 --xp 00022000 08:02 426369 /users/oracle/lib61850/debug/linux-i386/lib/libexpat.so
008f0000-008f2000 r-xp 00022000 08:02 426369 /users/oracle/lib61850/debug/linux-i386/lib/libexpat.so
008f2000-008f3000 rwxp 00024000 08:02 426369 /users/oracle/lib61850/debug/linux-i386/lib/libexpat.so
009cc000-009e7000 r-xp 00000000 08:01 885957 /lib/ld-2.5.so
009e7000-009e8000 r-xp 0001a000 08:01 885957 /lib/ld-2.5.so
009e8000-009e9000 rwxp 0001b000 08:01 885957 /lib/ld-2.5.so
009eb000-00b3e000 r-xp 00000000 08:01 885978 /lib/libc-2.5.so
00b3e000-00b40000 r-xp 00153000 08:01 885978 /lib/libc-2.5.so
00b40000-00b41000 rwxp 00155000 08:01 885978 /lib/libc-2.5.so
00b41000-00b44000 rwxp 00b41000 00:00 0
00b46000-00b6d000 r-xp 00000000 08:01 885985 /lib/libm-2.5.so
00b6d000-00b6e000 r-xp 00026000 08:01 885985 /lib/libm-2.5.so
00b6e000-00b6f000 rwxp 00027000 08:01 885985 /lib/libm-2.5.so
00b78000-00b8d000 r-xp 00000000 08:01 885980 /lib/libpthread-2.5.so
00b8d000-00b8e000 r-xp 00015000 08:01 885980 /lib/libpthread-2.5.so
00b8e000-00b8f000 rwxp 00016000 08:01 885980 /lib/libpthread-2.5.so
00b8f000-00b91000 rwxp 00b8f000 00:00 0
2.问题分析
使用gdb test_61850 core
where命令进行跟踪后发现是在paser_fcda_info函数中调用realloc函数时,程序core掉的,增加打印后发现是在多次分配内存之后出现的错误(p_fcda = 9512f80,dsNum = b),怀疑是不是在该函数中对内存进行了非法的操作,造成内存泄露,或内存的非法读写,从而造成程序的core。
核查该函数代码后发现以下两个问题:
line834:
ptr_data = pInfo->doName;
if(ptr_data != NULL){
ptr = (char *)realloc(ptr,(curLen+strlen(ptr_data))*sizeof(char));
memcpy(ptr+curLen,ptr_data,strlen(ptr_data)+1);//多写了一个字节
curLen += strlen(ptr_data);
}
line850:
ptr_data = pInfo->daName;
if(ptr_data != NULL){
ptr = (char *)realloc(ptr,(curLen+strlen(ptr_data))*sizeof(char));
memcpy(ptr+curLen,ptr_data,strlen(ptr_data)+1);//多写了一个字节
curLen += strlen(ptr_data);
}
在memcpy中每次写数据时比实际申请的内容多写了一个字节,该字节并不在系统的内存管理中,并且可能造成将一些有用的数据被覆盖掉,成为造成程序错误的隐患。
3.问题解决
将上述两端代码更改为:
line834:
ptr_data = pInfo->doName;
if(ptr_data != NULL){
ptr = (char *)realloc(ptr,(curLen+strlen(ptr_data)+1)*sizeof(char));
memcpy(ptr+curLen,ptr_data,strlen(ptr_data)+1);//按申请空间写数据
curLen += strlen(ptr_data);
}
line850:
ptr_data = pInfo->daName;
if(ptr_data != NULL){
ptr = (char *)realloc(ptr,(curLen+strlen(ptr_data)+1)*sizeof(char));
memcpy(ptr+curLen,ptr_data,strlen(ptr_data)+1);//按申请空间写数据
curLen += strlen(ptr_data);
}
重新运行程序,该现象消失。
分享到:
相关推荐
使用命令aarch64-linux-gnu-gcc -Wall test.c -o test_lora -DLORADATA_V1 ./libloradec.a -lpthread -lm命令进行编译 一般人下载没用,需要符合国网MQTT协议的无线2.4G或者470M传感器以及对应的接入模组才能在程序...
vc程序开发过程中,堆破坏后往往难以定位到问题,介绍跟踪与调试问题的方法。
iOS 拦截奔溃 使程序不在崩溃 使用Runloop起死回生 拦截崩溃信息 传到服务器
The usual implementation of malloc and free are unforgiving to errors in their callers' code, including cases where the programmer overflows an array, forgets to free memory, or frees a memory block ...
malloc
malloc 作者: Jan Wedekind版权所有: 2010许可证: GPL 概要 这个 Ruby 扩展定义了类 {Hornetseye::Malloc}。 {Hornetseye::Malloc.new} 可以分配内存,使用 {Hornetseye::Malloc#+} 可以做指针操作,{Hornetseye::...
wasm-malloc WebAssembly的malloc / free的简单实现。 堆是一个双链表,如果有必要/可能,将合并或拆分块。 目前,不支持realloc。 malloc / calloc无法正确对齐内存。 由于WebAssembly MVP不支持缩小线性内存,因此...
my_malloc:自己动手写的malloc函数.希望对大家了解内存管理有所帮助
分配C语言中malloc的简单实现。
这是专门设计用于ARM7嵌入式处理器的内存管理库,但它应可在许多其他32位处理器以及16和8位设备上使用。 您甚至可以在较大的项目中使用它,在该项目中单个进程可能要管理大量较小的对象,并且使用系统堆可能会变得...
/* 毫米 我们的设计是维护一个二叉搜索树来管理不同大小的空闲块。 我们使用一个空闲块本身作为树节点。 树中的每个节点也是双向链表的头,其中所有节点的大小相同。 free_tree 中的节点有四个属性 left-child、...
my_malloc C malloc / free函数的自定义实现。
这是对malloc / free的直接替代,它是从头开始设计用于可伸缩服务器软件的。 为什么要使用另一个内存分配器? 这是分配器的优点: 它是线程友好的。 它支持几乎无限数量的并发线程,而不会导致锁定或性能下降。 ...
一个示例程序,用于比较 , malloc()加上和之间的时间差。 时间差异是使用高分辨率计时函数计算的。 该程序设置计时器并构造一系列循环,其中包含调用内存分配功能。 当循环终止时,将计算时间差,并以纳秒精度...
// unsigned char head[54] = {0x42,0x4d,0x36,0x10,0x0e,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0xe0,0x01,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x00,0x00,...
该存储库包含我们的 PPoPP'15 论文Performance Implications of Dynamic Memory Allocators on Transactional Memory Systems 中使用的工具。 它可用于重现我们的结果,并在进行必要的更改后,调查新分配器和/或 (S)...
内存分配 学校项目,其中包括重新编码stdlib函数malloc,realloc和free
我使用系统mmap实现的libc malloc,realloc和free函数 特征 大小分段:将请求分为SMALL,MEDIUM和LARGE,对SMALL和MEDIUM请求使用预分配的区域 释放碎片空间以优化重用 Hexdump分配的内存功能 实现的功能: malloc-...
malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数malloc函数...
《深入理解计算机系统》一书的配套lab之malloc lab。学生用来实现自己的malloc, realloc和free函数。 Students implement their own versions of malloc, free, and realloc. This lab gives students a clear ...