2012-07-25 32 views
18

Tôi có một ứng dụng MPI kết hợp cả hai nguồn C và Fortran. Thỉnh thoảng nó bị treo do lỗi liên quan đến bộ nhớ, nhưng tôi gặp khó khăn khi tìm lỗi (nó ở đâu đó trong mã của người khác, lúc này tôi không quen thuộc lắm). Tôi vẫn chưa thể bắt nó với gdb, nhưng đôi khi một backtrace glibc là đầu ra như hình dưới đây.Chuyển đổi một backcace libc sang một số dòng nguồn

Lỗi có thể gần "(main_main_ + 0x3bca) [0x804d5ce]", (nhưng với lỗi bộ nhớ, tôi biết điều này có thể không phải là trường hợp). Câu hỏi của tôi là, không ai biết làm thế nào để chuyển đổi + 0x3bca hoặc 0x804d5ce vào một dòng cụ thể của mã?

Bất kỳ đề xuất nào khác về theo dõi lỗi cũng sẽ được đánh giá cao. Tôi khá quen thuộc với những điều cơ bản của gdb.

*** 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> 

Cảm ơn bạn ...

Trả lời

22

Nếu bạn đang ở trong gdb và bạn có những biểu tượng gỡ lỗi, nó là khá dễ dàng. Sử dụng list.

(gdb) list *0x804d5ce 

Điều này sẽ cung cấp cho bạn dòng mã và hiển thị cho bạn nguồn nếu có thể tìm thấy tệp nguồn.

Without gdb bạn có thể thử sử dụng addr2line:

$ addr2line -e finite_element 0x804d5ce 
+0

Vâng, đó đã làm nó. Cảm ơn bạn. "0x804d5ce nằm trong main_main (mpi_Main_trian_kernel.f: 374)" Dòng 374 là: deallocate (Face) Vì vậy, đó không phải là lỗi, chỉ khi nó hiển thị. Bất kỳ đề xuất theo dõi nó xuống? – davepc

+0

@davepc: Lỗi của bạn có khả năng bị hỏng heap. Bạn có thể thử sử dụng 'valgrind' để xác định nó. – jxh

Các vấn đề liên quan