Tôi đang cố gắng sử dụng mtrace
để phát hiện rò rỉ bộ nhớ trong chương trình fortran. Tôi đang sử dụng trình biên dịch gfortran. Xem mục nhập wikipedia cho ví dụ C (ví dụ) của mtrace: http://en.wikipedia.org/wiki/Mtracemtrace cho chương trình fortran
Tôi đã thử cả hai cách, tức là gói mtrace() và muntrace() và gọi chúng từ chương trình fortran, cũng như tạo chương trình C trực tiếp gọi hàm mtrace() và muntrace(), bên cạnh mã fortran bị rò rỉ ở giữa. Cả hai cách tiếp cận sẽ không phát hiện rò rỉ bộ nhớ, nhưng ở đây tôi chỉ trình bày sau.
example.c
#include <stdlib.h>
#include <mcheck.h>
extern void leaky_(); // this might be different on your system
// if it doesn't work, try to run:
// 1) gfortran leaky.f90 -c
// 2) nm leaky.o
// and then change this declaration and its use below
void main() {
mtrace();
leaky_();
muntrace();
}
leaky.f90
subroutine leaky()
real, allocatable, dimension(:) :: tmp
integer :: error
allocate (tmp(10), stat=error)
if (error /= 0) then
print*, "subroutine leaky could not allocate space for array tmp"
endif
tmp = 1
!of course the actual code makes more...
print*, ' subroutine leaky run '
return
end subroutine leaky
tôi biên dịch với:
gfortran -g example.c leaky.f90
Sau đó, tôi chạy với:
export MALLOC_TRACE=`pwd`/raw.txt; ./a.out
Sau đó, tôi phân tích đầu ra raw.txt
mtrace
với:
mtrace a.out raw.txt
và nhận được:
Không rò rỉ bộ nhớ.
Có điều gì tôi đang làm sai hay điều gì đó tôi có thể thực hiện để cho phép mtrace
tìm phân bổ bộ nhớ fortran bị rò rỉ? Tôi đoán gfortran đang sử dụng một cuộc gọi malloc
khác, trong đó mtrace
không theo dõi ... Trong thực tế, như tôi đã viết ở trên tôi nhận được kết quả tương tự nếu tôi viết một fortran chính mà sẽ gọi (bọc) mtrace()
và muntrace()
. CHỈNH SỬA: Tôi đã xem xét các tùy chọn khác (bao gồm một số chưa được đề cập ở đây), nhưng mã thực tế đang được gỡ lỗi chạy trên P6/AIX, vì vậy Valgrind sẽ là "chỉ" bất tiện (nó cần chạy trên một máy khác), trong khi Forcheck sẽ là bất tiện (nó cần phải chạy trên một máy khác) và đắt tiền (~ 3k $). Hiện tại mtrace sẽ là giải pháp tốt nhất, nếu nó hoạt động.
EDITED một lần nữa: tôi đoán
Tôi đoán gfortran đang sử dụng một
malloc
gọi khác nhau, trong đómtrace
không theo dõi ...
là đúng. Nhìn vào tệp thực thi (với nm
hoặc readelf
), không có bất kỳ cuộc gọi nào malloc()
, nhưng _gfortran_allocate_array
những người - có thể sẽ gọi malloc). Bất kỳ ý tưởng nào khác?
EDITED một lần nữa: tôi đăng các câu trả lời nhưng tôi không thể chấp nhận nó (đi đến http://stackoverflow.uservoice.com/pages/general/suggestions/39426 và yêu cầu tính năng này, nó thực sự cần thiết - không đạt được danh tiếng muốn)