5

最近、Electric Fence を試していますが、C++ コードでの使用方法がわかりません。

次に例を示します。

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

int main()                                                                                                                                                 
{                                                                                                                                                                                                                                                                                                     
        int *a = new int(10);                                                                                                                              
        delete a;                                                                                                                              
}  

でコンパイルしました

g++ ./test.cpp -o test -lefence -L/home/bor/efence_x86_64/lib -lpthread

また、最初に Electric Fence バナーが表示されず、実行可能ファイルに EF シンボルが見つかりません (nm コマンドを使用)。

しかし、プログラムを次のように変更すると:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

int main()                                                                                                                                                 
{                                                                                                                                                          
        char *p = (char*)malloc(20);                                                                                                                       
        free(p);                                                                                                                                           
        int *a = new int(10);                                                                                                                              
        delete a;
}

すべてが良好です-EFが表示されます。私はそれが問題をちょっと解決することを知っています、私は知っています:)。そもそもなぜ機能しなかったのかを理解しnew()たいmalloc()だけdelete()ですfree()

私がこれに参加した理由は、boostライブラリやその他のいくつかを使用する大きなプロジェクトです。そして、このプログラムはmalloc()orfree()を直接呼び出すことはありません。そして、EFでビルドするときは、EFを最終的な実行可能ファイルにリンクするだけでなく、EFをそれらにリンクしようとするすべてのライブラリを再構築しました。そして、どちらにもEFシンボルが見つかりません。それは正しいアプローチですか?それとも間違っていて、最終的にEFのみを実行可能ファイルにリンクする必要があり、ライブラリはそのままにしておく必要がありますか? しかし、実行可能ファイルに EF シンボルが見つかりません。

4

4 に答える 4

4

コンパイラがコードビハインドをコンパイルしていると想定していますnewが、そのコードは通常、コンパイル済みの RT のどこかに存在します。

newまた、通常はmalloc直接呼び出しません (Windows などの一部のシステムでは、まったく呼び出しませんmalloc) 。割り当てを処理する前後に実行される独自のタスクがいくつかあります。このような場合、グローバルにオーバーロードするという半悪の道をたどり、コードから直接呼び出すように強制する必要があるnew場合があります。deletemallocfree

于 2012-02-29T07:52:34.940 に答える
1

armv5 で電気柵を使用して C++ コードを「デバッグ」する簡単な方法を探している人向け:

リンカー コマンドを静的にコンパイルして変更する必要はありません。私にとっては、電気柵を設置して実行するだけで十分でした:

LD_PRELOAD=libefence.so ./your-buggy-program

(上で引用したのと同じドキュメントから)

于 2016-03-14T11:43:20.427 に答える
1

http://slackbuilds.org/repository/13.1/libraries/electric-fence/の slackware ドキュメントから

In order to debug a program it needs to be linked with Electric Fence's
library or dynamic linking needs to be used; README.Debian explains that
in detail.


If you're using c++, and you and want to statically link your c++
programs, you shouldn't use g++ to link libefence.a, but rather:
gcc -o myprog myprog.o -lstdc++ -lg++ -lefence
(if you use g++, the order is different, and efence's malloc doesn't
get used)

libefencelebefence の動作を変更するさまざまな環境変数を設定する方法を説明するマンページを必ずお読みください。

于 2014-03-13T02:51:23.170 に答える