0

私はこれを理解するのに苦労しています..だから助けを求める時が来ました.

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 の 2 つの完全に異なるバージョンで同じように失敗します。[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/ $/home/skaller/felix/felix/build/release-optimized/test/gmp/gmp-0.cpp

メタ: SO のマークダウンが機能しない! そのため、手動でコピーする必要があります。

Felixコードへのリンクを投げたほうがいいかもしれません.Felixコードはもう少し読みやすく、楽しいものがあります(ユーザー定義の構文や、ライブラリに行くとインスタンス化されている型クラスを見ることができます)

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

4

2 に答える 2

0

動的ライブラリによって割り当てられたメモリの割り当てを解除することはできません。おそらく、ここが問題です。この回答を確認してください:共有ライブラリのメモリ空間

于 2010-12-20T08:33:44.370 に答える
0

gmpソースはどこで入手しましたか?32 ビット バージョンの可能性があります (少なくとも macports は 64 ビット ソースを提供していません)。一方、Snow Leopard は 64 ビット (デフォルト) です。

個人的には、gcc -m32 ですべてのコードを強制的に 32 ビットにしています。同じことを試すことができます。

br、
ユハ

編集: /usr/bin/gcc -> /usr/bin/gcc -m32 を強制する方法は?

于 2010-12-10T14:19:02.990 に答える