2012-05-20 8 views
7

मैं लिखा है दो सरल कार्यक्रमों के बावजूद काम नहीं कर रहा:gdb को execv का पालन कैसे करें? "फ़ॉलो-कार्यकारी-मोड"

int main(int ac, char **argv) { 
    execv("/home/me/Desktop/execvtest2", argv); 
} 

और

int main(int ac, char **argv) { 
    execv("/home/me/Desktop/execvtest1", argv); 
} 

मैं उन्हें अनुसार outputfiles को जीसीसी जी के साथ संकलित किया है। मैं जीसीसी (उबंटू/लिनारो 4.4.4-14ubuntu5.1) 4.4.5 का उपयोग कर उबंटू 10.10 चला रहा हूं।

जब मैं जीएनयू जीडीबी (जीडीबी) 7.2-उबंटू के साथ पहला प्रोग्राम डीबग कर रहा हूं, तो मैं पहले execv कथन तक कदम उठा सकता हूं, लेकिन फिर दो फाइलें चलती रहती हैं। भले ही मैं फॉलो-एक्जिक-मोड को नए पर सेट करता हूं, फिर भी मैं दूसरे प्रोग्राम में नहीं जा सकता। जब मैं कैच निष्पादन सेट करता हूं, तो gdb execv को प्रत्येक कॉल पर रुक जाता है (कुछ दूसरे प्रोग्राम के लिए लिंक किए गए स्रोत के बिना कैसे, और मैं gdb को छोड़ने में सक्षम नहीं हूं, क्योंकि यह लटकता है !?), लेकिन मैं सक्षम नहीं हूं कॉल को "नए" में कॉल करने के लिए (जैसा कि प्रोक प्रक्रिया को बदलता है) निम्न कार्यक्रम।

तो यह कैसे किया जा सकता है? नई प्रक्रिया में कदम उठाने का एक तरीका होना चाहिए? क्या मुझसे कुछ गलत हो रही है?

चीयर्स

+0

कौन सा ओएस, जिसका उपयोग आप कर रहे हैं? – alk

+0

मैंने अभी 'gcc' संस्करण' (डेबियन 4.4.5-8) 4.4.5' का उपयोग करके इसका परीक्षण किया है, लाइन 2 पर ब्रेक पॉइंट सेट करें और दो निष्पादन योग्य में 'gdb' अच्छी तरह से तोड़कर देखें। – alk

+0

बीटीडब्ल्यू: इस परीक्षण के लिए इस्तेमाल किया गया 'जीसीसी' (ऊपर वर्णित संस्करण के साथ) किसी भी तरह से 'फॉलो-एक्जिक-मोड' के बारे में नहीं है। – alk

उत्तर

5

आप "पकड़" आदेश का उपयोग कर सकते हैं। इससे आपको कुछ ब्रेक पॉइंट डालने का मौका मिलेगा, जब आप

+0

मुझे आश्चर्य है कि इस एवर को और वोट नहीं मिला। एक जादू की तरह काम करता है! – andreee

2

मैं अपनी कक्षाओं में से किसी एक के लिए कुछ भी कर रहा हूं। यह थोड़ा सा हैशिश है और यदि आप पंजीकरण मूल्यों जैसी चीज़ें प्राप्त करने की कोशिश कर रहे हैं तो यह गड़बड़ हो सकती है। GDB's documentation के अनुसार आप निष्पादन फ़ाइल को बनाए रखते हुए प्रतीक फ़ाइल बदल सकते हैं। ऐसा करने के लिए, बस symbol-file file2 कमांड का उपयोग करें। ध्यान दें कि यह जीडीबी ध्वज (जीसीसी में जीजी) के साथ संकलित एक बाइनरी फ़ाइल होना चाहिए। इस प्रतीक फ़ाइल को लोड करने के बाद, आप मूल निष्पादन फ़ाइल के लिए किसी भी पंक्ति को तोड़ने या देखने में सक्षम नहीं होंगे। हालांकि, आप नई प्रतीक फ़ाइल i.e break file2.c:40 के लिए ब्रेक पॉइंट सेट कर सकते हैं और फिर पहले की तरह निष्पादन के माध्यम से कदम उठा सकते हैं। यह थोड़ा हैकिश है और पूरी तरह से काम नहीं कर सकता है क्योंकि आप अनिवार्य रूप से एक नई प्रक्रिया के निष्पादन को पकड़ रहे हैं और इसे बाइनरी फ़ाइल के प्रतीक तालिका में मैपिंग कर रहे हैं, बिना बाइनरी फ़ाइल को सीधे चलाने के लिए। मेरे पास तारकीय परिणाम नहीं हैं लेकिन आप इस तरह के मध्यवर्ती मूल्यों को देख सकते हैं। एक और बात, मूल फ़ाइल को डिबग करने के लिए वापस लौटने के लिए आपको symbol-file file को इसकी प्रतीक तालिका को पुनः लोड करने के लिए करना होगा।