这可能是什么? [程序错误]

时间:2010-12-09 16:04:53

标签: macos gdb g++ free gmp

我在解决这个问题时遇到了一些麻烦......所以有时间寻求帮助。

OS:OSX,Snow Leopard

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)

我没有在函数 init 中调用free(),并且函数确实正确运行直到结束大括号..因此崩溃点必须在本地对象的析构函数中(右?)

有趣的是:

a)如果静态链接,程序(似乎)工作正常,只有在代码内置到* .dylib并动态加载时才会失败。

b)程序以两个完全不同的gmp / gmpxx版本以相同的方式失败。 [4.3或者其他和5.01]

c)静态和动态链接版本在Ubuntu 10.5 LTS上运行良好

代码是由我的编译器生成的,它不是手写代码。用户代码由顶级驱动程序运行。系统成功运行了数百个回归测试。但是在这个特定的测试用例中使用了下面的手写代码:

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中的错误之外,我能想到的另一件事是我的运行时系统或生成的代码破坏了内存。未被分配的“被释放”地址是可疑的(它远不在堆中)。我使用-g标志构建了一个gmp版本,但是没有获得更多信息(这表明它在gmpxx类析构函数中没有坏处。)

我需要一些想法!我不知道现在在哪里看。 Thx提前:))

链接到来源

http://felix-lang.org:1116/ $ /家/ skaller /菲利克斯/菲利克斯/建立/释放优化/测试/ GMP / GMP-0.cpp

Meta:SO的降价不起作用!所以你必须手工复制。

也可以投入到Felix代码的链接,因为它更具可读性并且有一些有趣的东西(如用户定义的语法,如果你去图书馆,你可以看到实例化的类型类)

http://felix-lang.org:1116/ $ /家/ skaller /菲利克斯/菲利克斯/建立/释放优化/测试/ GMP / GMP-0.flx

2 个答案:

答案 0 :(得分:0)

你从哪里获得gmp来源?它可能是32位版本(至少macports不提供64位源)。另一方面,Snow Leopard是64位(默认情况下)。

我个人通过gcc -m32将所有代码强制为32位。你可以尝试一样。

BR,
尤哈

修改: How to force /usr/bin/gcc -> /usr/bin/gcc -m32?

答案 1 :(得分:0)

您无法释放动态库分配的内存。也许这就是问题所在。 看看这个答案:Shared libraries memory space