2010-12-09 72 views
0

我有一些麻煩找出這個..所以有時間尋求幫助。這可能是什麼? [程序錯誤]

OS:OSX,雪豹

GCC:GCC的Xcode的版本4.2.1

庫:GMP,gmpxx

問題:一個功能是正確的,在結束與崩潰:

flx_run(94749) malloc: *** error for object 0x7fff706d1500: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

Program received signal SIGABRT, Aborted. 
0x00007fff835cd886 in __kill() 
(gdb) bt 
#0 0x00007fff835cd886 in __kill() 
#1 0x00007fff8366deae in abort() 
#2 0x00007fff83585a75 in free() 
#3 0x00000001000bca45 in flxusr::gmp__hyphen_0::_init_() 
Previous frame inner to this frame (gdb could not unwind past this frame) 

我沒有調用free()的函數初始化,而且功能不正常運行直至收盤捲曲Ÿ撐..所以碰撞點必須是在本地對象(是嗎?)

有趣的是的析構函數:

一)程序(好像)正常工作,如果靜態鏈接的,只有它如果代碼被內置到* .dylib並動態加載,則會失敗。 b)程序在兩個完全不同的gmp/gmpxx版本中以相同的方式失敗。 [4.3或東西,5.01]

C)靜態和動態鏈接的版本正常工作在Ubuntu LTS 10.5

是我的編譯器生成的代碼,它不是手寫代碼。用戶代碼由頂級驅動程序運行。系統成功運行數百次迴歸測試。然而下面的手寫代碼用於這個特定的測試用例:

namespace flx { namespace gmp { 
string flx_mpf_get_str(mpf_class const &a) 
{ 
    mp_exp_t x; 
    std::string s = a.get_str(x,10,0); 
    char b[100]; 
    std::snprintf(b,100,"e%ld",(long)x); 
    return std::string(".")+s+b; 
} 
}} 

但它看起來很好。該函數的堆棧框架包含多個mpz_class,mpq_class和mpf_class對象。

除了gmp/gmpxx中的bug之外,我能想到的唯一一件事是我的運行時系統或生成的代碼正在破壞內存。未被分配的地址被「釋放」是可疑的(它離堆不遠)。我使用-g標記構建了一個gmp版本,但沒有獲得更多信息(這表明它在gmpxx類析構函數中不是一個不好的自由)。

我需要一些想法!我不知道現在在哪裏看。 THX提前:)

鏈接到源

http://felix-lang.org:1116/ $ /家庭/ skaller /菲利克斯/菲利克斯/建設/釋放優化/測試/ GMP/GMP-0.cpp

元:SO的減價不起作用!所以你必須手工複製。

還不如扔在鏈接到菲利克斯代碼,因爲它是一個有點更具可讀性,有一些好玩的東西在裏面(如用戶定義的語法,如果你去,你可以看到被實例化的類型類庫)

http://felix-lang.org:1116/ $/home/skaller/felix/felix/build/release-optimized/test/gmp/gmp-0.flx

回答

0

你從哪裏得到gmp源代碼?它可能是一個32位版本(至少macports不提供64位來源)。另一方面雪豹是64位(默認情況下)。

我個人用gcc -m32強制所有代碼爲32位。你可以嘗試相同的。

BR,
尤哈

編輯:由動態庫分配How to force /usr/bin/gcc -> /usr/bin/gcc -m32?

+0

gmp src 5.01從gnu,是的,它是64位AFAIK。 – Yttrill 2010-12-11 23:01:04

+0

只是要注意:我特別不想要32位代碼。如果我有我的方式,我會完全從我的系統中取消它。可以在Linux上完成,但在Mac上並不那麼容易。 – Yttrill 2010-12-28 23:27:47