2012-03-24 278 views
1

以下是我想要返回的字符串分配內存時出現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] 
+0

這是C還是C++?你爲什麼要標記它們兩個? – 2012-03-24 19:18:52

+1

Mangled symbols表示C++,對不對?爲什麼標籤C? – 2012-03-24 19:20:23

+0

它是一個C++文件,但代碼在c中(錯誤是) – Raj 2012-03-24 19:20:46

回答

3

到該程序的解決方案是使用Valgrind的工具。

+2

爲了澄清,如果崩潰在'malloc'中,那麼真正的錯誤是在別的地方,Valgrind可以幫助您找到真正的錯誤所在。 – 2012-03-24 19:46:26

+0

我在HP-UX上,並且不支持valgrind!:( – Raj 2012-03-26 07:42:48

1

按照bmargulies的建議,使用Valgrind。 如果你的操作系統不支持valgrind,我會建議Purify,我不相信有任何針對非Linux平臺的免費解決方案。 如果您可以在Windows上重現相同的問題,請使用_CrtCheckMemory調用代碼,這將縮小問題的範圍 - 這不如Purify在Windows上好,但它是免費的。

+0

我不認爲valgrind在這裏有幫助,因爲我正在使用HP-UX! gdb是否有任何支持來進行內存調試?如果是的話,它是如何幫助解決這個問題的? – Raj 2012-03-26 07:49:35

+0

我不想想gdb有什麼可以幫到你的,看看Purify(來自IBM)/ Insure,但是其中的任何一個對於Unix來說都是幾千個,根據預算以及你對它的感受,你可以通過詢問它們來解決你的問題評估許可證,無論哪種情況下,你都必須打電話,談話等等,這不是一個簡單的下載 - 至少不是幾年前當我這樣做的時候(因爲成本較低,我們最終選擇了Purify)。 – Alex 2012-03-26 11:35:48

+0

你可以嘗試把你的代碼與malloc調用一起投入,嘗試縮小問題的範圍,這是我在調試方面唯一可以想到的其他解決方案,它總是重寫代碼的一部分,或者重新讀取它們,或者獲取一個分析工具記憶,還是他甚至可以編寫自己的基本malloc/free - 在每個緩衝區之前和之後分配額外的字節,並定期掃描這些字節以進行更改。 – Alex 2012-03-26 11:48:31