2013-05-10 11 views
6

ここに私のコードスニペットがあります。new()演算子を使用してメモリを割り当てるときにmudflapがコアダンプをスローする

int main() 
    { 
    int *var = new int(6); 
    cout<<"Hello\n"; 
    delete var; 
    return 0; 
} 

$export MUDFLAP_OPTIONS="-print-leaks -mode-check" 
$g++ test.cpp -fmudflap -lmudflap 
$./a.out 
Segmentation fault (core dumped) 

としてmudflapでコンパイルされた。しかしmudflapオプションでコンパイルされたとき、それはコアダンプをスローしません。 私はmudflapに新しいです。間違った方法でmudflapを使用しているかどうか、親切に伝えてください。

FYI:

$uname -a 
Linux localhost.localdomain 2.6.18-308.4.1.el5 #1 SMP Wed Mar 28 01:54:56 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux 
$g++ -v 
Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux-gnu/4.7.3/lto-wrapper 
Target: x86_64-redhat-linux-gnu 
Configured with: /root/rohit/gcc-4.7.3/configure --prefix=/usr/ 
Thread model: posix 
gcc version 4.7.3 (GCC) 

BTコアダンプのフル

コアは `./a.out」で生成されました。私のコンパイラ(x86版Solarisの場合)にそのまま

Program terminated with signal 11, Segmentation fault. 
[New process 22176] 
#0 0x0000003ca5e075c8 in ??() from /lib64/libgcc_s.so.1 
(gdb) bt ful 
#0 0x0000003ca5e075c8 in ??() from /lib64/libgcc_s.so.1 
No symbol table info available. 
#1 0x0000003ca5e0882b in _Unwind_Backtrace() from /lib64/libgcc_s.so.1 
No symbol table info available. 
#2 0x0000003c96ce5eb8 in backtrace() from /lib64/libc.so.6 
No symbol table info available. 
#3 0x00002b4acf58b417 in __mf_backtrace (symbols=0x6a51db8, guess_pc=0x2b4acf58d351, guess_omit_levels=2) 
    at /root/rohit/gcc-4.7.3/libmudflap/mf-runtime.c:1981 
     pc_array = (void **) 0x6a51e00 
     pc_array_size = 6 
     remaining_size = <value optimized out> 
     omitted_size = Unhandled dwarf expression opcode 0x9f 
     i = <value optimized out> 
#4 0x0000000000000002 in ??() 
No symbol table info available. 
#5 0x0000000000000004 in ??() 
No symbol table info available. 
#6 0x0000000000000000 in ??() 
No symbol table info available. 
+6

警告と同様に、あなたのコードが配列を作成していないことを理解していますか? – BoBTFish

+0

Red Hat 5.4、gcc 4.7.2 – BoBTFish

+1

で問題なく動作しますか?質問にバックトレースを含めることをお勧めしますか?バックトレースを取得するには、 'gdb'(' gdb a.out core')でコアダンプを開き、内部で 'bt'コマンドを使います。 –

答えて

0

あなたのサンプルがコンパイルされますが、実際に、プラットフォームが違いを作るべきではないほど簡単です。書かれているように、コードはどこでもコンパイルして実行する必要があります。 MudFlapにはいくつかの欠点があるようです。

私は私の現在の環境でMudFlapへのアクセス権を持っていますが、ここで完全に問題を回避できることがあります何かしていない:

#include <iostream> 
#include <boost/shared_ptr.hpp> 
using namespace std; 

int main() { 
boost::shared_ptr<int> var (new int(6)); 
cout << "Hello #" << *var << endl; 
return 0; 
} 

私は動的割り当てを「隠し」という野生の推測を作ってるんですスマートポインタの初期化の中でMudFlapをトリックします。

あなたのスニペットは現実世界の問題を単純化したものです。私は単純なバージョンでさえもあなたの環境でコンパイルできない理由を理解していませんが、上記の解決策では、ポインタを削除することを心配する必要はありませんが、実世界のスコープは大きくなります。

さらに、MudFlapは本当にスマートで、RAIIの使用を強制しようとしているかもしれません。おそらく、生ポインタを使用して管理するように指定するための設定があります。どのような場合でも、スマートポインタのアプローチに関係なく、あなたは十分に役立つだろう。

お試しください。

関連する問題