14

valgrind 内から実行されている実行可能ファイルを実行時に識別する方法はありますか? C++ 単体テストのセットがあり、そのうちの 1std::vector::reserveつでstd::bad_alloc. これを valgrind で実行すると、完全に回避され、メモリ リーク (valgrind を使用) と動作 (例外がスローされることを期待) の両方をテストできなくなります。

これを再現する最小限の例を次に示します。

#include <vector>
int main()
{
    size_t uint_max = static_cast<size_t>(-1);
    std::vector<char> v;
    v.reserve(uint_max);
}

valgrind を実行すると、次の出力が得られます。

Warning: silly arg (-1) to __builtin_new()
new/new[] failed and should throw an exception, but Valgrind
   cannot throw exceptions and so is aborting instead.  Sorry.
   at 0x40192BC: VALGRIND_PRINTF_BACKTRACE (valgrind.h:319)
   by 0x401C823: operator new(unsigned) (vg_replace_malloc.c:164)
   by 0x80487BF: std::vector<char, std::allocator<char> >::reserve(unsigned) new_allocator.h:92)
   by 0x804874D: main (vg.cxx:6)

valgrind 内から実行されているときに、問題のあるコードを単純にスキップするように単体テストを変更したいと思います。これは可能ですか?

4

3 に答える 3

25

Valgrind マニュアルのこのページを参照してください。このページには、必要な処理を実行するRUNNING_ON_VALGRINDマクロ (valgrind.h に含まれています) が含まれています。

于 2008-12-13T21:48:22.467 に答える
1

私は valgrind doucmentation を見ましたが、簡単な答えが見つかりませんでした。ただし、次のいくつかのことを試すことができます。

  • 問題のある新しい操作の周りに独自のラッパーを記述し、valgrind がプライベートな新しい機能を開始する前に例外を発生させます。

  • コマンドラインオプション(配管が必要)の代わりに環境変数を使用することを除いて、上記のポスターが提案したように試してください:

    MYAPP_UNIT_TESTS_DISABLED="NEW_MINUS_ONE,FLY_TO_MOON,DEREF_NULL" valgrind myapp
    

次に、関数を簡単に書くことができます

bool unit_test_enabled(const char *testname);

getenv(3) によって返される値に基づいて単体テストを保護します。

于 2008-12-13T19:54:42.447 に答える