質問

私は最近電気フェンスを試してきましたが、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

そして、私は最初に電気フェンスのバナーが表示されず、実行可能ファイルで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(), 、いや?

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

役に立ちましたか?

解決

コンパイラがコードビハインドをコンパイルしていると仮定しています new, 、しかし、そのコードは一般的にプリコンパイルされたRTのどこかにあります。

new また、一般的に呼び出すことはありません malloc 直接(Windowsのようないくつかのシステムでは、それは呼び出されません malloc すべてで)、それは持っています 独自のいくつかのタスク それは割り当てを処理する前と後に、実行されます。このようなもののために、あなたはグローバルに過負荷の半邪悪なルートを行かなければならないかもしれません newdelete それを直接呼び出すように強制するには mallocfree あなたのコードから。

他のヒント

Slackware Docs ATの

> http://slackbuilds.org/repository/13.1/lepository/13.1 / libraries/電気 -

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)
.

セット方法を説明するlibefenceマンページを必ず読んでください レベファンスの行動を変える様々な環境変数

ARMv5の電気柵でC ++コードを「デバッグ」する迅速な方法を探している人:

リンカコマンドを静的にコンパイルして変更する必要はありません。私のために電気柵を取り付けるのに十分だった:

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

(上記のものと同じドキュメントから)

あなたのコードに "mallocs"が含まれている場合にのみ、 "ldd"コマンドでbuildバイナリに "-libefence"が表示されます。それ以外の場合、 "mallocs"が "mallocs"がない場合は "-Libefence"ライブラリがbuild-binaryのlinked-libraryリストに表示されないかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top