2013-03-24 39 views
-4
  1. 嗨,大家好,我在這裏遇到一個很奇怪的問題。你對 分段錯誤有什麼想法嗎?任何意見,將不勝感激! Thx提前!

測試()爲什麼指針的值在多線程malloc中變化?

{

pMsg_node = found_bakup_msg_node(); 

if(pMsg_node != NULL) { 
    Dprintf("#%s#%d %p\n", __FUNCTION__, __LINE__, pMsg_node); 
    ret = cp_msg_node_data(pMsg_node, pMsg_next); 
} 

}

======================== ===========================================

struct MSG_INFO * found_bakup_msg_node(void) { struct MSG_INFO * msg_node = NULL;

msg_node = (struct MSG_INFO*)malloc(sizeof(struct MSG_INFO)); 
    if(msg_node != NULL) { 
      memset(msg_node, 0x0, sizeof(struct MSG_INFO)); 

      Dprintf("#%s# %p\n", __FUNCTION__, 
          msg_node); 
    } 

    return msg_node; 

}

====================================== ==================

--------------------------- LOG 1 --------------------------------

> header=0x923950  
>found_bakup_msg_node#alloc_bakup_count=1 0x7f6090032f70 //return from malloc() 
>cp_msg_list#561 
> cp_msg_node_data#458 
>cp_msg_node_data#463 0xffffffff90032f70 0x923950 //notice here 
>Segmentation fault 
> [email protected]:/media/work/project/rcd$  

---------- ---------------- LOG 2 --------------------------------

#cp_msg_list#566 
#found_bakup_msg_node#alloc_bakup_count=180 **0x7fe6e000d5b0** 
#cp_msg_node_data#464 **0xffffffffe000d5b0** 0x2154620 
Segmentation fault 
[email protected]:/media/work/project/rcd$ 

+0

OS: UNAME -a Linux的羅賓桌面2.6.32-38-通用#83 Ubuntu的SMP週三1月4日11時12分07秒UTC 2012 x86_64的GNU/Linux的 – user2203111 2013-03-24 18:27:27

+0

GCC -v 使用內置規格。 目標:x86_64-linux-gnu 配置:../src/configure -v --with-pkgversion ='Ubuntu 4.4.3-4ubuntu5.1'--with-bugurl = file:/// usr/share /doc/gcc-4.4/README.Bugs --enable-languages = c,C++,fortran,objc,obj-C++ --prefix =/usr --enable-shared --enable-multiarch --enable-linker-build -id --with-system-zlib --libexecdir =/usr/lib --without-included-gettext --enable-threads = posix --with-gxx-include-dir =/usr/include/C++/4.4。 ..... 線程模型:posix gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5.1) – user2203111 2013-03-24 18:28:21

+1

停止投射malloc()。這是C,而不是C++。它甚至可以幫助你追蹤錯誤。由於我們無法按原樣進行編譯/測試,因此所有片段都要遍歷。如果您可以將代碼縮小到更小,並且仍然有段錯誤,您可以快速找到它。既然你是Linux,你可能應該嘗試-pthread而不是-lpthread。 – 2013-03-24 23:44:57

回答

0

你試過在gdb下運行程序嗎?它通常說明你爲什麼得到了分段錯誤,並且通常學習如何使用gdb是很有用的。

+0

嘗試......,謝謝bgeron!我猜想從addr 0x2154620到addr 0xffffffffe000d5b0的memcpy數據會導致分段錯誤。 – user2203111 2013-03-25 03:59:05

+0

固定。這是因爲Test()在聲明之前調用了found_bakup_msg_node(void),所以默認返回值應該是32位。當返回值大於32位時,系統會自動完成基於最高位的值,如0x0000 0000 1111 1111或0xffff ffff 1111 1111. – user2203111 2013-03-26 03:47:11

+0

@ user2203111如果您發現錯誤,請將其作爲您的問題的答案發布。 – glglgl 2013-04-05 19:44:59