2008-12-13 12 views
5

क्या निष्पादन योग्य के रन-टाइम पर पहचान करने का कोई तरीका है valgrind के भीतर से चल रहा है? मेरे पास सी ++ यूनिट परीक्षण का एक सेट है, और उनमें से एक std::bad_alloc फेंकने की अपेक्षा करता है। जब मैं इसे वालग्रिंड के नीचे चलाता हूं, तो यह पूरी तरह से बाहर निकलता है, मुझे मेमोरी लीक (वाल्ग्रिंड का उपयोग करके) और व्यवहार (अपवाद को फेंकने की उम्मीद) दोनों के परीक्षण से रोकता है।मैं कैसे पता लगा सकता हूं कि कोई प्रोग्राम वाल्ग्रिंड के भीतर से चल रहा है या नहीं?

यहाँ एक न्यूनतम उदाहरण है कि reproduces यह है:

#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

आप this page वेलग्रिंड पुस्तिका से पर गौर करना चाहिए, यह एक RUNNING_ON_VALGRIND मैक्रो (valgrind.h से शामिल है) जो करता है कि आप क्या चाहते हैं।

+0

इसके लिए धन्यवाद, मैं वर्षों से * पीसने का उपयोग कर रहा हूं लेकिन इंटरफ़ेस को शायद ही कभी छुआ। वैट्रिंड/valgrind.h मौजूद है, तो valrgind के तहत चलते समय स्वचालित रूप से मेरे डीबग printfs() और assertions चालू करने के लिए स्वच्छता बनाने के लिए आसान है .. फिर से धन्यवाद! बहुत उपयोगी –

0

मैंने वाल्ग्रिंड डॉकमेंटेशन को देखा और उसे आसान जवाब नहीं मिला। लेकिन यहाँ चीजों की एक जोड़ी तुम कोशिश कर सकते हैं:

  • हमलावर नई आपरेशन के आसपास अपने स्वयं के आवरण लिखें और इससे पहले कि valgrind अपने निजी नए कार्य के लिए जा रहा हो जाता है अपवाद बढ़ा। (जो पाइपलाइन की आवश्यकता है) एक कमांड लाइन विकल्प के बजाय सिवाय इसके कि सुझाव ऊपर पोस्टर के रूप में

  • कोशिश एक वातावरण चर का उपयोग करें:

    MYAPP_UNIT_TESTS_DISABLED="NEW_MINUS_ONE,FLY_TO_MOON,DEREF_NULL" valgrind myapp 
    

तो आप आसानी से एक समारोह में लिख सकते हैं

bool unit_test_enabled(const char *testname); 

getenv (3) द्वारा दिए गए मान के आधार पर आपके यूनिट परीक्षण की सुरक्षा के लिए।