2008-12-13 120 views
5

有没有一种方法可以在运行时识别正在从valgrind运行的可执行文件?我有一组C++单元测试,其中一个预期std::vector::reserve抛出std::bad_alloc。当我在valgrind下运行它时,它完全释放,阻止我测试内存泄漏(使用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中运行的。这可能吗?

回答

16

你应该看看Valgrind手册中的this page,它包含一个RUNNING_ON_VALGRIND宏(包含在valgrind.h中),它可以做你想做的事情。

+0

感谢这一点,我一直在使用*研磨多年,但几乎没有触及界面。在autoconf中包含这个宏很容易,当valgrind/valgrind.h存在时,它会在valrgind下运行时自动打开我的调试printfs()和断言:) 再次感谢!很有帮助 – 2009-01-09 07:40:14

0

我看着valgrind文件,没有找到一个简单的答案。但这里有一对夫妇的事情,你可以尝试:

  • 写周围的违规新的操作自己的包装,提高异常的valgrind获得其私人的新功能去之前。

  • 尝试如海报上面所建议的不同之处在于代替命令行选项(要求水暖)使用环境变量:

    MYAPP_UNIT_TESTS_DISABLED="NEW_MINUS_ONE,FLY_TO_MOON,DEREF_NULL" valgrind myapp 
    

然后就可以很容易地编写的函数

bool unit_test_enabled(const char *testname); 

根据getenv(3)返回的值来保护您的单元测试。

相关问题