2008-12-13 17 views
5

Bir yürütülebilir dosyanın çalışma zamanında tanımlanmasının bir yolu var mı? C++ birim testlerinden oluşan bir setim var ve bunlardan biri std::bad_alloc'u atmak için std::vector::reserve bekliyor. Bunu valgrind altında çalıştırdığımda, tümüyle bellek sızıntılarını (valgrind kullanarak) ve davranışları (atılacak istisnayı bekleyerek) test etmemi engelleyen tamamen boşaldı.Bir programın valgrind içinden çalışıp çalışmadığını nasıl algılayabilirim?

Burada çoğalır minimal örnek:

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

valgrind Koşu, bu çıktıyı almak:

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) 
Sadece zaman teşkil eden kod atlamak için benim birim sınama değiştirmek istediğiniz

valgrind içinden koşuyor. Mümkün mü?

cevap

16

Valgrind kılavuzundan this page'a bakmanız gerekir, RUNNING_ON_VALGRIND makrosunu (valgrind.h dahil) içerir.

+0

Bunun için teşekkürler * yıllarca grind kullanıyorum ama arayüze çok fazla dokunmadım. Valm/valgrind.h mevcut ise valgind altında çalışırken hata ayıklama printfs() ve onayları otomatik olarak açar autoconf .. bu makro dahil etmek için kolaylık sağlamak için kolay Tekrar teşekkürler! Çok yararlı –

0

Değerli çiftlere baktım ve kolay bir cevap bulamadım. Ama burada birkaç şey deneyebilirsiniz şunlardır:

  • kusurlu yeni operasyon etrafında kendi sarıcı yaz ve valgrind kendi özel yeni fonksiyon gidiyor dönmeden istisna yükseltmek. (Tesisat gerektirir) yerine bir komut satırı seçeneği dışında önerilen yukarıdaki poster olarak

  • deneyin bir ortam değişkeni kullanabilirsiniz:

    MYAPP_UNIT_TESTS_DISABLED="NEW_MINUS_ONE,FLY_TO_MOON,DEREF_NULL" valgrind myapp 
    

Sonra kolayca bir fonksiyon yazabiliriz

bool unit_test_enabled(const char *testname); 

birim testinizi getenv (3) tarafından döndürülen değere göre korumak için.

İlgili konular