2010-03-18 18 views
7

मुझे लिनक्स में चल रहे सी ++ प्रोग्राम को डीबग करने के बारे में एक सवाल है। यदि कोई प्रोग्रामिंग पहले से चल रहा है और बाधित नहीं किया जा सकता है, तो उसे कैसे करें।लिनक्स में चल रहे सी ++ प्रोग्राम को डीबग कैसे करें?

मुझे तीन तरीकों से मिल सकता है, लेकिन मुझे विवरणों के बारे में बहुत कुछ पता नहीं है, अगर मैं इसे गहराई से विस्तारित कर सकता हूं तो मैं आभारी हूं।

1) हम इस प्रक्रिया आईडी

gdb -p PID 

को निर्दिष्ट इस मामले में से GDB उपयोग कर सकते हैं, इस और attach PID के बीच अंतर क्या है?

2) हम, pstat उपयोग कर सकते हैं हालांकि, मैं Ubuntu, कोई pstat का उपयोग कर रहा है, लेकिन केवल mpstat

ऐसा लगता है कि mpstat बहुत अधिक जानकारी इतने सारे विकल्प प्रदान नहीं करता है, और नहीं।

3) निर्देशिका ./proc

तहत विवरण जानकारी की जांच कर इस मामले में, बस पीआईडी ​​के साथ निर्देशिका में जाते हैं। हालांकि, क्या यह मैन्युअल रूप से किया जाना चाहिए?

+0

हो रही मुझे नहीं लगता कि मैं कभी भी '-p' विकल्प देखा है है के लिए ps xa| grep myprogram पसंद करते हैं। हालांकि पीआईडी ​​द्वारा एक प्रक्रिया को जोड़ना काफी आम है। ऐसा करने में समस्या क्या है? – Cascabel

+0

मुझे यकीन नहीं है कि आपका प्रश्न वास्तव में क्या है। ऐसा लगता है कि आपके पास पहले से सी ++ प्रोग्राम डीबग करने के लिए काम करने के तरीके हैं, इस प्रकार आपका शीर्षक स्वयं उत्तर दिया गया है, और फिर आपका पोस्ट बॉडी कुछ असंबंधित पूछता है। क्या आप शीर्षक या अपने प्रश्न को स्पष्ट करने के लिए दोहरा सकते हैं? – ephemient

+0

मैंने चल रहे C++ एप्लिकेशन की सिस्टम कॉल का पता लगाने के लिए 'strace -p pID' का उपयोग किया है। मैंने पाया कि 'खुला() 'पर कॉल विफल रहा था और त्रुटि केस उचित तरीके से संभाला नहीं जा रहा था। – jschmier

उत्तर

2

मुझे gdb man या उनके दस्तावेज़ में -p विकल्प नहीं मिल रहा है, लेकिन यह काम करता है! मैंने रेडहाट पर पुराने संस्करणों और डेबियन पर 7.0.1 के साथ कई बार कोशिश की है।

मुझे यकीन नहीं है कि यह वास्तव में पीआईडी ​​द्वारा exe कैसे पाता है (शायद /proc/<PID>/exe), लेकिन यह करता है। चूंकि यह उनके दस्तावेज़ में वर्णित नहीं है, शायद यह सबसे अनुशंसित तरीका नहीं है, लेकिन मुझे इसके साथ कोई समस्या नहीं है।

gdb -p <PID> और जीडीबी चलाने और उनके खोल टाइपिंग attach <PID> के बीच कोई उल्लेखनीय अंतर नहीं है।

मैं व्यक्तिगत रूप से पीआईडी ​​

1

तकनीक 1 के संबंध में, वहाँ कोई -p झंडा है और आप अभी भी प्रोग्राम का नाम की जरूरत है:

gdb prog PID 

है कि कर के बीच कोई अंतर नहीं है gdb prog चल रहा है और उसके बाद gdb attach pid कह बनाम।

1

पीआईडी ​​प्राप्त करने के लिए ps -ef | grep <your program> का उपयोग करें। फिर gdb <your program> <PID> चलाएं। pstat मानक आदेश नहीं है। मैंने इसे सोलारिस के साथ ही इस्तेमाल किया है।

उदा।

[email protected]:~/FE/bin> ./fe& 
[1] 5866         
[email protected]:~/FE/bin> ps -ef | grep fe 
gayan  5866 5836 2 10:19 pts/3 00:00:00 ./fe 
gayan  5871 5836 0 10:19 pts/3 00:00:00 grep fe 
[email protected]:~/FE/bin> gdb fe 5866 
GNU gdb (GDB; openSUSE 11.1) 6.8.50.20081120-cvs  
Copyright (C) 2008 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it.   
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details.            
This GDB was configured as "i586-suse-linux".         
For bug reporting instructions, please see:         
<http://bugs.opensuse.org/>...            
Attaching to program: /home/gayan/FE/bin/fe, process 5866 

उपरोक्त ओपनसुज़ पर चलाया गया था लेकिन उबंटू पर काम करना चाहिए।

संबंधित मुद्दे