मैं सिस्टम फ़ंक्शन open()
पर एक हुक बनाने की कोशिश कर रहा हूं। मैंने इसे निम्नलिखित पंक्तियों के साथ किया है।खुले से हुक से सेगमेंटेशन गलती()
extern int mocked_open(const char* fn, int flags, va_list args);
int open(const char* fn, int flags, ...)
{
int r = -1;
va_list args;
va_start(args, flags);
r = mocked_open(fn, flags, args);
va_end(args);
return r;
}
मैं libwrapper.so में इस संकलन है, जो मैं LD_PRELOAD का उपयोग करके लोड:
मैं निम्नलिखित के साथ एक आवरण पुस्तकालय बनाया।
int mocked_open(const char* fn, int flags, va_list args)
{
if (strncmp(fn, test_device_id, 11) == 0)
{
return mock().actualCall("open").returnValue().getIntValue();
}
else
{
int r = -1;
int (*my_open)(const char*, int, ...);
void* fptr = dlsym(RTLD_NEXT, "open");
memcpy(&my_open, &fptr, sizeof(my_open));
if (flags & O_CREAT)
{
r = my_open(fn, flags, va_arg(args, mode_t));
}
else
{
r = my_open(fn, flags);
}
return r;
}
}
test_device_id
एक सरल स्ट्रिंग ("test_device"), जो मुझे आशा है कि अन्यत्र इस्तेमाल नहीं किया जाता है:
mocked_open()
के कार्यान्वयन के रूप में इस प्रकार है (मैं CPPUtest ढांचे का उपयोग) है।
परीक्षण चलाने के दौरान निष्पादन योग्य एक खंडन गलती के साथ दुर्घटनाग्रस्त हो जाता है। मैंने इसे जीसीसी प्रोफाइलिंग कार्यक्षमता में खोज लिया है, जो .gcda
फ़ाइलों का एक गुच्छा खोलना/बनाना चाहता है और इसके लिए open()
पर कॉल करना चाहता है।
स्ट्रेस (नीचे प्रति सुझाव) के साथ कुछ डिबगिंग के बाद, मैंने पाया कि लाइन r = my_open(fn, flags, va_arg(args, mode_t));
वास्तव में अपराधी है। इसे रिकर्सिवली कहा जा रहा है, या ऐसा लगता है: फ़ंक्शन लौटने के बिना, मुझे इस लाइन में बहुत सी कॉल दिखाई देती हैं। फिर एक segfault। खोला जा रहा फ़ाइल संबंधित .gcda फ़ाइल (प्रोफाइलिंग के लिए) है। वास्तव में, segfault केवल प्रोफाइलिंग प्रोफाइलिंग के साथ होता है।
मुझे लगता है कि आपकी समस्या भिन्न हैंडलिंग http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c – user590028
@ user590028: क्या आप विस्तारित कर सकते हैं? मैंने सोचा कि विविध तर्क प्रबंधन के साथ कुछ गड़बड़ है (जैसा कि मैंने लिखा है), लेकिन क्या ...? – Ludo
आपके परीक्षण-मामलों पर 'ओपन() '' स्ट्रेस' शो' किस प्रकार की कॉल का उपयोग किया जाता है? – alk