कुछ परियोजनाओं में मैंने सी में किया है, मुझे निम्नलिखित मैक्रोज़ का उपयोग करना पसंद आया है जो पर्ल की चेतावनी और मरने वाले सबराउटिन के समान काम करते हैं:क्या पर्ल के कार्प मॉड्यूल के लिए कोई सी समतुल्य है?
#include <stdio.h>
#include <stdlib.h>
#define warn(...) \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, " at %s line %d\n", __FILE__, __LINE__)
#define die(...) \
warn(__VA_ARGS__); \
exit(0xFF)
क्या कुछ भी पर्ल की कार्प, क्रोक, क्लक, और स्वीकृति सबराउटिन की तरह मौजूद है Carp से? मैं उपयोगकर्ताओं के परिप्रेक्ष्य से त्रुटियों की रिपोर्ट करने के लिए कुछ करना चाहता हूं।
यदि नहीं, तो मुझे पता है कि glibce() और backtrace_symbols() glibc में फ़ंक्शंस हैं जो-गतिशील जीसीसी विकल्प के साथ मुझे फ़ंक्शन नामों और कोड पते के बैकट्रैक के साथ आपूर्ति कर सकते हैं। लेकिन मुझे कुछ बेहतर चाहिए; पर्ल के कॉलर सबराउटिन जैसे कॉल स्टैक में फ़ाइल, लाइन और फ़ंक्शन नामों तक पहुंच के साथ। इसके साथ में मैं अपने सी प्रोग्राम में उपयोग के लिए अपना खुद का libcarp लिखने में सक्षम होगा।
संपादित करें: 200 9 -10 x
मैं कुछ ऐसा बनाने की सोच रहा हूं जो बेसनेम (argv [0]) पर उपलब्ध होने पर gdb का उपयोग करता है, फिर विभिन्न प्रकार के संदेशों को उत्पन्न करने के लिए स्टैक ट्रेस को संसाधित करता है । यह निर्धारित करने में सक्षम होना चाहिए कि क्या मैं डीबग करने योग्य निष्पादन योग्य, या जीडीबी के बिना एक प्रणाली में नहीं हूं, इस मामले में, कार्प और क्लक चेतावनी बन जाएंगे और क्रोक और कबूल हो जाएगा।
Ive ने पहले कभी इस तरह gdb का उपयोग नहीं किया है (Ive केवल शुरुआत में ही मेरे प्रोग्राम के साथ इसे चलाता है, न कि यह पहले से चल रहा है)। लेकिन मुझे ग्लिब (g_on_error_stack_trace और stack_trace) में कुछ फ़ंक्शंस मिले जो कि मैं जो करना चाहता हूं उसके बहुत नज़दीक दिखता है: यह तर्कों के आधार पर एक जीडीबी प्रक्रिया को फोर्क करता है (argv [0]) और प्रक्रिया आईडी, फिर इसके stdin (जिसे एक पाइप पर रीडायरेक्ट किया गया है) "बैकट्रैक" कमांड के बाद "छोड़ें"। इसके बाद यह इसके परिणाम से पढ़ता है और जिस तरह से इसे पसंद करता है उसे पार करता है। यह लगभग वही है जो मुझे करने की ज़रूरत है।
पर्ल, कार्प और क्रोक से अपरिचित लोगों के लिए उदाहरण जो चेतावनी देता है और मर जाता है मैक्रोज़ करता है, केवल वर्तमान उप के कॉलर से फ़ाइल और लाइन के साथ। क्लक और कबूल करें, केवल एक पूर्ण स्टैक ट्रेस के साथ ही करें। (कुछ विवरण सरलीकृत) – ysth
डॉक्स पर: http://perldoc.perl.org/Carp.html – Ether
सच बहु-कथन मैक्रोज़ के लिए, उन्हें अत्यधिक {...} जबकि (0) बनाने के लिए अत्यधिक अनुशंसा की जाती है अपेक्षित के रूप में एक कथन कार्य के रूप में उपयोग करें। – unwind