2012-07-25 13 views
18

में कनवर्ट करें मेरे पास एक एमपीआई एप्लिकेशन है जिसमें सी और फोरट्रान दोनों स्रोत शामिल हैं। कभी-कभी यह स्मृति से संबंधित बग के कारण दुर्घटनाग्रस्त हो जाता है, लेकिन मुझे बग खोजने में परेशानी हो रही है (यह किसी और के कोड में कहीं है, जिस समय मैं बहुत परिचित नहीं हूं)। मैं अभी तक इसे जीडीबी के साथ पकड़ने में सक्षम नहीं हूं, लेकिन कभी-कभी एक ग्लिबैक बैकट्रैक आउटपुट जैसा दिखाया गया है।एक libc बैकट्रैक को एक स्रोत पंक्ति संख्या

बग शायद "(main_main_ + 0x3bca) [0x804d5ce]" के करीब है, (लेकिन स्मृति त्रुटि के साथ, मुझे पता है कि यह मामला नहीं हो सकता है)। मेरा सवाल है, क्या किसी को पता है कि कोड की एक विशेष पंक्ति में + 0x3bca या 0x804d5ce को कैसे परिवर्तित किया जाए?

बग को ट्रैक करने पर कोई अन्य सुझाव भी सराहना की जाएगी। मैं जीडीबी की मूल बातें से काफी परिचित हूं।

*** glibc detected *** /home/.../src/finite_element: munmap_chunk(): invalid pointer: 0x09d83018 *** 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7409e42] 
/lib/i386-linux-gnu/libc.so.6(+0x74525)[0xb740a525] 
/home/.../src/finite_element(main_main_+0x3bca)[0x804d5ce] 
/home/.../src/finite_element[0x804e195] 
/home/.../src/finite_element(main+0x34)[0x804e1e8] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb73af4d3] 
/home/davepc/finite-element/src/finite_element[0x8049971] 
======= Memory map: ======== 
08048000-08056000 r-xp 00000000 08:05 1346306 /home/.../src/finite_element 
08056000-08057000 r--p 0000d000 08:05 1346306 /home/.../src/finite_element 
08057000-08058000 rw-p 0000e000 08:05 1346306 /home/.../src/finite_element 
09d1b000-09d8f000 rw-p 00000000 00:00 0   [heap] 
b2999000-b699b000 rw-s 00000000 08:03 15855  /tmp/openmpi-sessions-_0/37612/1/shared_mem_pool.babel 
b699b000-b6b1d000 rw-p 00000000 00:00 0 
b6b31000-b6b3d000 r-xp 00000000 08:03 407798  /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so 
b6b3d000-b6b3e000 r--p 0000b000 08:03 407798  /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so 
b6b3e000-b6b3f000 rw-p 0000c000 08:03 407798  /usr/lib/openmpi/lib/openmpi/mca_osc_rdma.so 
<snip> 

धन्यवाद ...

उत्तर

22

आप gdb में हैं और आप डिबगिंग प्रतीकों है, तो यह काफी आसान है। list का प्रयोग करें।

(gdb) list *0x804d5ce 

यह आपको कोड की रेखा देनी चाहिए, और यदि स्रोत स्रोत ढूंढने में सक्षम है तो आपको स्रोत दिखाएं।

gdb बिना आप addr2line उपयोग करने के लिए कोशिश कर सकते:

$ addr2line -e finite_element 0x804d5ce 
+0

हाँ, यह है कि यह किया था। धन्यवाद। "0x804d5ce (mpi_Main_trian_kernel.f: 374) main_main में है" लाइन 374 है: पुनःआवंटन (फेस) ताकि बग, इसकी सिर्फ जहां यह दिखाया जा रहा है नहीं है। इसे ट्रैक करने पर कोई सुझाव? – davepc

+0

@ डेवपैक: आपकी बग संभावित भ्रष्टाचार की संभावना है। आप इसे पहचानने के लिए 'valgrind' का उपयोग करने का प्रयास कर सकते हैं। – jxh

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