यह मेरी सूची में अब तक लंबे समय से लंबित है। संक्षेप में - मुझे संशोधित किए बिना dummy()
ऑन रन-टाइम पर mocked_dummy()
चलाने की आवश्यकता है। मुझे सॉफ्टवेयर के प्रवेश बिंदु पर परवाह नहीं है। मैं किसी भी अतिरिक्त फ़ंक्शन को जोड़ सकता हूं (लेकिन /*---- do not modify ----*/
के भीतर कोड संशोधित नहीं कर सकता)।सी में रन-टाइम मॉकिंग?
मुझे इसकी आवश्यकता क्यों है?
कुछ विरासत सी मॉड्यूल के यूनिट परीक्षण करने के लिए। मुझे पता है कि बहुत सारे टूल्स उपलब्ध हैं, लेकिन यदि रन-टाइम मॉकिंग संभव है तो मैं अपना यूटी दृष्टिकोण बदल सकता हूं (पुन: प्रयोज्य घटकों को जोड़ सकता हूं) जिससे मेरा जीवन आसान हो जाता है :)।
प्लेटफार्म/पर्यावरण?
लिनक्स, एआरएम, जीसीसी।
दृष्टिकोण जिसके साथ मैं कोशिश कर रहा हूं?
- मुझे पता है कि जीडीबी ब्रेकपॉइंट्स जोड़ने के लिए जाल/अवैध निर्देशों का उपयोग करता है (gdb internals)।
- कोड स्वयं संशोधित करें।
- अवैध निर्देश के साथ
dummy()
कोड सेगमेंट बदलें, और तत्काल अगले निर्देश के रूप में लौटाएं। - जाल हैंडलर को नियंत्रण स्थानान्तरण।
- ट्रैप हैंडलर एक पुन: प्रयोज्य फ़ंक्शन है जो यूनिक्स डोमेन सॉकेट से पढ़ता है।
mocked_dummy()
फ़ंक्शन का पता पारित किया गया है (मानचित्र फ़ाइल से पढ़ें)।- नकली फ़ंक्शन निष्पादित करता है।
यहां से आगे की समस्याएं हैं। मैंने यह भी पाया कि दृष्टिकोण कठिन है और कोडिंग की अच्छी मात्रा की आवश्यकता है, कुछ असेंबली में भी।
मुझे यह भी पता चला कि जीसीसी के तहत प्रत्येक फंक्शन कॉल hooked/instrumented हो सकता है, लेकिन फिर से बहुत उपयोगी नहीं है क्योंकि फ़ंक्शन का मजाक उड़ाया जाने वाला है, फिर भी इसे निष्पादित किया जाएगा।
क्या कोई अन्य दृष्टिकोण है जिसका मैं उपयोग कर सकता हूं?
#include <stdio.h>
#include <stdlib.h>
void mocked_dummy(void)
{
printf("__%s__()\n",__func__);
}
/*---- do not modify ----*/
void dummy(void)
{
printf("__%s__()\n",__func__);
}
int factorial(int num)
{
int fact = 1;
printf("__%s__()\n",__func__);
while (num > 1)
{
fact *= num;
num--;
}
dummy();
return fact;
}
/*---- do not modify ----*/
int main(int argc, char * argv[])
{
int (*fp)(int) = atoi(argv[1]);
printf("fp = %x\n",fp);
printf("factorial of 5 is = %d\n",fp(5));
printf("factorial of 5 is = %d\n",factorial(5));
return 1;
}
क्या उपर्युक्त कोड संकलित होगा? –
अद्यतन कोड इसलिए यह बनाता है। –
मेरा संदेह इस कथन की ओर अधिक था '#define डमी (m.dummy)' आप प्रीप्रोसेसर को डमी फ़ंक्शन को प्रतिस्थापित करने से कैसे रोकेंगे? –