当使用malloc()和realloc()时出现信号11(SIGSEGV)错误
以下是我想要返回的字符串分配内存时出现Signal 11错误的一段代码。当使用malloc()和realloc()时出现信号11(SIGSEGV)错误
我将不胜感激帮助指出错误在哪里以及如何修复它,谢谢!
1265 static string encode_func(a_type_ptr ptr)
1266 {
1267 char *my_str=(char *)malloc(512);
//some variable declarations
1275 int no_of_array_elements;
1276 while (field_ptr && field_ptr->type) {
1277 field_offset=field_ptr->offset*targ_char_bit;
1278 if (field_offset > current_offset) {
1279 if(sizeof(my_str) < (field_offset-current_offset)) {
1280 my_str = (char*)realloc(my_str, (field_offset-current_offset+1));
1281 }
1282 for(int i = 0; i < (field_offset-current_offset); i ++) {
1283 strcat(my_str, "X");
1284 }
1285 }
//some condition check not relevant to memalloc'ed variables
1299 field_bit_size=get_field_bit_size(field_ptr);
1300 no_of_array_elements=field_bit_size/base_size;
1301 if (uptr != NULL) {
1302 string tmp = encode_func(uptr);
1303 char *sub_my_str = new char[tmp.size()];
1304 strncpy(sub_my_str, tmp.c_str(), sizeof(tmp));
1305 if(strlen(my_str) < strlen(sub_my_str)) {
1306 char *tmp= (char *)realloc(my_str,((strlen(my_str)+no_of_array_elements*strlen(sub_my_str))+1));
1307 if(tmp != NULL)
1308 my_str = tmp;
1309 }
1310 strncat(my_str, sub_my_str, sizeof(sub_my_str));
1311 for(int i = 1; i < no_of_array_elements; i++) {
1312 strncat(my_str, sub_my_str,sizeof(sub_my_str));
1313 }
1314 } else {
1315 char str[25];
1316 sprintf(str, "%ldo", base_size);
1317 if(strlen(my_str) < (no_of_array_elements*strlen(str)))
1318 {
1319 char *tmp = (char *)realloc(my_str,strlen(my_str)+no_of_array_elements*strlen(str)+1);
1320 if(tmp!=NULL)
1321 my_str = tmp;
1322 }
1323 strncat(my_str, str,strlen(str));
1324 for(int i = 1; i < no_of_array_elements; i++)
1325 {
1326 strncat(my_str, str,strlen(str));
1327 }
1328 }
1329 current_offset=field_offset+field_bit_size;
1330 field_ptr=field_ptr->next;
1331 }
1332 struct_size=ptr->size*targ_char_bit;
1333 if(struct_size > current_offset) {
1334 if(strlen(my_str) < (struct_size-current_offset)) {
1335 char *tmp = (char *)realloc(my_str, (struct_size-current_offset+1));
1336 if(tmp != NULL)
1337 my_str = tmp;
1338 }
1339 for(int i=0; i<(struct_size-current_offset); i++) {
1340 strcat(my_str, "X");
1341 }
1342 }
1343 my_str[strlen(my_str)] = '\0';
1344 string str_enc = string(my_str);
1345 return str_enc;
1346 }
这里是我得到的错误:
Signal 11, code 1 (address not mapped to object)
(0) 0x4000000003039b00 term_on_signal + 0xa90 at host_envir.c:2129[./test]
(1) 0xe00000010d0028e0 ---- Signal 11 (SIGSEGV) delivered ----
(2) 0xc00000000023db70 real_malloc + 0x670 at ../../../../../core/libs/libc/shared_em_64/../core/gen/malloc.c:2748 [/usr/lib/hpux64/+++libc.so.1]
(3) 0xc00000000023cc80 _malloc + 0x140 at ../../../../../core/libs/libc/shared_em_64/../core/gen/malloc.c:1863 [/usr/lib/hpux64/libc+++.so.1]
(4) 0xc0000000002484b0 malloc + 0x140 at ../../../../../core/libs/libc/shared_em_64/../core/gen/malloc.c:5069 [/usr/lib/hpux64/libc.+++so.1]
(5) 0x40000000037de6d0 _Z11encode_funcP6a_type + 0x70 at test.C:1267 [./test]
(6) 0x40000000037de9e0 _Z11encode_funcP6a_type + 0x380 at test.C:1303 [./test]
(7) 0x40000000037de9e0 _Z11encode_funcP6a_type + 0x380 at test.C:1303 [./test]
到该程序的解决方案是使用Valgrind的工具。
为了澄清,如果崩溃在'malloc'中,那么真正的错误是在别的地方,Valgrind可以帮助您找到真正的错误所在。 – 2012-03-24 19:46:26
我在HP-UX上,并且不支持valgrind!:( – Raj 2012-03-26 07:42:48
按照bmargulies的建议,使用Valgrind。 如果你的操作系统不支持valgrind,我会建议Purify,我不相信有任何针对非Linux平台的免费解决方案。 如果您可以在Windows上重现相同的问题,请使用_CrtCheckMemory调用代码,这将缩小问题的范围 - 这不如Purify在Windows上好,但它是免费的。
我不认为valgrind在这里有帮助,因为我正在使用HP-UX! gdb是否有任何支持来进行内存调试?如果是的话,它是如何帮助解决这个问题的? – Raj 2012-03-26 07:49:35
我不想想gdb有什么可以帮到你的,看看Purify(来自IBM)/ Insure,但是其中的任何一个对于Unix来说都是几千个,根据预算以及你对它的感受,你可以通过询问它们来解决你的问题评估许可证,无论哪种情况下,你都必须打电话,谈话等等,这不是一个简单的下载 - 至少不是几年前当我这样做的时候(因为成本较低,我们最终选择了Purify)。 – Alex 2012-03-26 11:35:48
你可以尝试把你的代码与malloc调用一起投入,尝试缩小问题的范围,这是我在调试方面唯一可以想到的其他解决方案,它总是重写代码的一部分,或者重新读取它们,或者获取一个分析工具记忆,还是他甚至可以编写自己的基本malloc/free - 在每个缓冲区之前和之后分配额外的字节,并定期扫描这些字节以进行更改。 – Alex 2012-03-26 11:48:31
这是C还是C++?你为什么要标记它们两个? – 2012-03-24 19:18:52
Mangled symbols表示C++,对不对?为什么标签C? – 2012-03-24 19:20:23
它是一个C++文件,但代码在c中(错误是) – Raj 2012-03-24 19:20:46