我在解决这个问题时遇到了一些麻烦。所以是时候寻求帮助了。
操作系统: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)
我没有在函数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 类析构函数中释放它并不是一件坏事)。
我需要一些想法!我不知道现在该往哪里看。提前谢谢:)
链接到源
http://felix-lang.org:1116/$/home/skaller/felix/felix/build/release-optimized/test/gmp/gmp-0.cpp _
Meta:SO的降价不起作用!所以你必须手动复制。
不妨加入到 Felix 代码的链接,因为它更具可读性并且有一些有趣的东西(比如用户定义的语法,如果你去库,你可以看到类型类被实例化)
http://felix-lang.org:1116/$/home/skaller/felix/felix/build/release-optimized/test/gmp/gmp-0.flx _