का उपयोग करके डिबगिंग लाइब्रेरी मैं यह देखने के लिए लिख रहा हूं कि आपने कभी भी उस विचार के कार्यान्वयन के बारे में देखा है या सुना है जिसे मैं वर्णन करना चाहता हूं।printf() स्ट्रिंग टेबल "डीकोडर रिंग"
मुझे एक एम्बेडेड लक्ष्य के लिए एक प्रिंटफ-शैली डीबगिंग लाइब्रेरी विकसित करने में रूचि है। लक्ष्य बेहद दूरस्थ है, और मेरे और लक्ष्य के बीच कॉमम्स बैंडविड्थ बजट बेहद तंग है, इसलिए मैं डिबगिंग संदेशों को एक बहुत ही कुशल प्रारूप में प्राप्त करने में सक्षम होना चाहता हूं।
अक्सर, डिबग बयान कुछ इस प्रकार दिखाई निम्नलिखित:
myDebugLibraryPrintf("Inside loop, processing item %d out of %d.\n", i, numItems);
बेशक
, जब इस पाठ में विस्तार किया गया है, स्ट्रिंग मुद्रित की तरह "अंदर पाश कुछ, 10 \ से बाहर प्रसंस्करण आइटम 5 एन ", कुल ~ 42 बाइट्स या तो। इस कथन द्वारा मुद्रित 9 0% से अधिक डेटा स्थैतिक, शाब्दिक - संकलित समय पर ज्ञात है। बेशक, संकलन समय पर केवल "5" और "10" ज्ञात नहीं हैं।
मैं जो करना चाहता हूं वह केवल उन दो पूर्णांक (42 के बजाय 8 बाइट्स) भेजने में सक्षम हो सकता है। एक बार मुझे वह डेटा प्राप्त हो जाने के बाद, मेरे पास कुछ प्रकार की "डिकोडर रिंग" होगी जो मुझे प्राप्त डेटा को "पुन: स्थापित" करने और मेरे स्थान पर पूर्ण डीबग संदेश प्रिंट करने देती है।
मैं स्वचालित रूप से (बिल्ड प्रक्रिया के हिस्से के रूप में) "डिकोडर रिंग" उत्पन्न करता हूं, प्रत्येक myDebugLibraryPrintf() कथन समय पर एक अद्वितीय आईडी देता है, और एक तालिका उत्पन्न करता है जो उन अद्वितीय आईडी को मूल स्वरूप तारों पर मानचित्रित करता है । फिर, किसी भी समय myDebugLibraryPrintf() को लक्ष्य पर बुलाया जाता है, यह अद्वितीय आईडी और "%d"
, "%f"
, आदि प्रारूप प्रारूप में दिखाई देने वाले varargs मानों को प्रसारित करता है, लेकिन प्रारूप स्ट्रिंग स्वयं प्रसारित नहीं होती है। (शायद मैं अभी "%s"
आइटमों को अभी अस्वीकार कर दूंगा ...) मेरे स्थान पर वापस, हमारे पास एक प्रोग्राम होगा जो तालिका में अद्वितीय आईडी देखता है, उचित प्रारूप स्ट्रिंग पाता है, और मूल डीबग को पुनर्निर्माण के लिए इसका उपयोग करता है संदेश।
मुझे लगता है कि किसी के पास शायद यह विचार था और मुझे लगता है कि समुदाय में किसी ने ऐसा कुछ देखा होगा (या यहां तक कि एक ओपन-सोर्स लाइब्रेरी के बारे में भी पता है)।
प्रतिबंध:
स्पष्ट करने के लिए, मैं ++ यहां सी/सी के साथ काम कर रहा हूँ, और मैं printf की एक 100% -Complete प्रतिस्थापन कार्यान्वयन में कोई दिलचस्पी नहीं है() - गैर तरह बातें शाब्दिक प्रारूप तार,
%s
(स्ट्रिंग) प्रारूप विनिर्देशक, या%*.*d
के साथ varargs सूची में चौड़ाई या परिशुद्धता डालने जैसे अधिक उन्नत प्रारूप विनिर्देशकों को समर्थित होने की आवश्यकता नहीं है।मैं चाहता हूं कि निर्माण प्रक्रिया के हिस्से के रूप में स्ट्रिंग तालिका स्वचालित रूप से जेनरेट की जाए ताकि डीबग जोड़ने से पारंपरिक printf() जोड़ने से कोई और काम न हो। यदि न्यूनतम प्रयास की आवश्यकता से अधिक कोई भी आवश्यक है, तो मेरी परियोजना पर कोई भी इसका उपयोग नहीं करेगा।
स्ट्रिंग तालिका उत्पन्न करने के लिए निर्माण प्रक्रिया के हिस्से के रूप में अतिरिक्त कार्य करना काफी अधिक माना जाता है। सौभाग्य से, मेरे पास इस स्रोत का उपयोग करने में रुचि रखने वाले सभी स्रोत कोड का नियंत्रण है, और मेरे पास निर्माण प्रक्रिया के भीतर बहुत लचीलापन है।
धन्यवाद!
क्या आप प्रस्तावित नहीं किए हों डेटा संपीड़न का एक सरल रूप है। आप शायद अपने आप को बहुत समय और प्रयास बचा सकते हैं, और अभी भी लाभ के 90 +% प्राप्त कर सकते हैं, बस अपने प्रोग्राम के डीबग आउटपुट को लिंक पर भेजने से पहले gzip के माध्यम से फ़िल्टर करके, और दूसरी तरफ गनज़िप के माध्यम से इसे फ़िल्टर करके। gzip/gunzip स्वचालित रूप से प्रतीक तालिकाओं का निर्माण करेगा और आपके प्रोग्राम के आउटपुट को बाधित किए बिना मैन्युअल टोकनिंग योजना के तरीके के बिना आपके लिए संपीड़न करेगा। –
क्या यह सी या सी ++ है? (टैग संपादक असहमत प्रतीत होते हैं) – AShelly
@ जेरेमी फ्राइज़नर: सहकर्मियों के साथ मेरी चर्चाओं में, संपीड़न एक विकल्प के रूप में भी आया है, और ऐसा लगता है कि यह एक अच्छा विकल्प हो सकता है - हालांकि, ऐसा लगता है कि यह एक खिंचाव जैसा लगता है। इससे तुलनात्मक लाभ मिलता है। उदाहरण में मैंने दिया, मैं 8 बाइट्स में 42 बाइट्स लायक जानकारी प्रभावी ढंग से भेजने में सक्षम था - 80% की एक स्पेस बचत। क्या इस तरह के डेटा पर वास्तव में 80% की स्पेस बचत हासिल कर सकते हैं? (मुझे पता लगाने के लिए एक प्रयोग करने की ज़रूरत है।) बेशक, अगर gzip एक ही बचत प्राप्त नहीं कर पाता है, तो भी मैं कम जटिलता के नाम पर सापेक्ष अक्षमता को स्वीकार करने के इच्छुक हो सकता हूं। – jeremytrimble