【问题标题】:What could this be? [program bug]这可能是什么? [程序错误]
【发布时间】:2010-12-09 16:04:52
【问题描述】:

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

操作系统: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

【问题讨论】:

    标签: macos gdb g++ free gmp


    【解决方案1】:

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

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

    br,
    朱哈

    编辑: How to force /usr/bin/gcc -> /usr/bin/gcc -m32?

    【讨论】:

    • gmp src of 5.01 from gnu,是的,它是 64 位 AFAIK。
    • 请注意:我特别不想要 32 位代码。如果我有我的方式,我会从我的系统中完全禁止它。可以在 Linux 上完成,但在 Mac 上却不那么容易。
    【解决方案2】:

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

    【讨论】:

    • 那个答案对我来说听起来很假。对 C 来说肯定是假的。
    • 该答案仅适用于 Windows。
    • 答案是假的,但它是一个合理的“线索”:它似乎与共享库中创建的对象的释放有关,我不相信苹果会得到这个对:)
    猜你喜欢
    • 2018-03-10
    • 2021-07-26
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2016-04-06
    • 2020-10-16
    相关资源
    最近更新 更多