2010-12-09 52 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