2012-03-15 6 views
5

मैं वाल्ग्रिंड के साथ मेमोरी लीक के लिए एक लंबी चल रही प्रक्रिया की जांच करना चाहता हूं। मुझे लगता है कि मेमोरी रिसाव मैं कई घंटों के निष्पादन के बाद ही हो सकता है। मैं ऐप को वालग्रिंड के तहत चला सकता हूं और वालग्रींड लॉग को ठीक कर सकता हूं, लेकिन ऐसा करने का मतलब है कि मुझे एप्लिकेशन छोड़ना है और इसे एक नए वाल्ग्रिंड सत्र के लिए फिर से शुरू करना है जिसके लिए मुझे अभी भी कई घंटे इंतजार करना होगा। क्या वाल्ग्रिंड और ऐप चलाना संभव है और अभी भी निष्पादन के दौरान किसी भी बिंदु पर valgrind (आंशिक) डेटा प्राप्त करना संभव है?प्रोफ़ाइल आवेदन छोड़ने के बिना आंशिक रिपोर्ट आउटपुट कर सकते हैं?

उत्तर

8

आप Valgrind gdbserver and GDB का उपयोग करके ऐसा कर सकते हैं।

संक्षेप में, आप हमेशा की तरह valgrind के साथ अपने कार्यक्रम शुरू है, लेकिन --vgdb=yes स्विच के साथ:

$ valgrind --tool=memcheck --vgdb=yes ./a.out 

एक और सत्र में, आप एक ही निष्पादन पर gdb प्रारंभ करें, और valgrind से कनेक्ट। तुम तो valgrind आदेश जारी कर सकते हैं:

$ gdb ./a.out 
... 
(gdb) target remote | vgdb 
.... 
(gdb) monitor leak_check full reachable any 
==8677== 32 bytes in 1 blocks are definitely lost in loss record 1 of 2 
==8677== at 0x4C28E3D: malloc (vg_replace_malloc.c:263) 
==8677== by 0x400591: foo (in /home/me/tmp/a.out) 
==8677== by 0x4005A7: main (in /home/me/tmp/a.out) 
==8677== 
==8677== 32 bytes in 1 blocks are definitely lost in loss record 2 of 2 
==8677== at 0x4C28E3D: malloc (vg_replace_malloc.c:263) 
==8677== by 0x400591: foo (in /home/me/tmp/a.out) 
==8677== by 0x4005AC: main (in /home/me/tmp/a.out) 
==8677== 
==8677== LEAK SUMMARY: 
==8677== definitely lost: 64 bytes in 2 blocks 
==8677== indirectly lost: 0 bytes in 0 blocks 
==8677==  possibly lost: 0 bytes in 0 blocks 
==8677== still reachable: 0 bytes in 0 blocks 
==8677==   suppressed: 0 bytes in 0 blocks 
==8677== 
(gdb) 

आदेश, Memcheck के लिए here की सूची के लिए मैनुअल देखें।

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