mtrace لبرنامج فورتران
-
06-07-2019 - |
سؤال
وأنا أحاول أن استخدام mtrace
للكشف عن تسرب الذاكرة في برنامج فورتران. أنا باستخدام مترجم gfortran. اطلع على دخول ويكيبيديا ل(العمل) C مثال mtrace: http://en.wikipedia.org/ ويكي / Mtrace
وحاولت في كلا الاتجاهين، أي التفاف mtrace () وmuntrace ()، وندعو لهم من برنامج فورتران، وكذلك إنشاء برنامج C التي تدعو مباشرة mtrace () وmuntrace ()، إلى جانب رمز فورتران تسرب ما بين أثنين. ستفشل كلا النهجين للكشف عن تسرب الذاكرة، ولكن هنا أنا فقط تقديم هذا الأخير.
و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
وI ترجمة مع:
gfortran -g example.c leaky.f90
وثم أركض مع:
export MALLOC_TRACE=`pwd`/raw.txt; ./a.out
وبعد ذلك أنا تحليل الإخراج raw.txt
mtrace
مع:
mtrace a.out raw.txt
وعلى:
ولا توجد تسربات الذاكرة.
هل هناك شيء أفعله خطأ، أو أي شيء يمكنني القيام به للسماح mtrace
العثور على تخصيص الذاكرة فورتران المتسرب؟ أعتقد gfortran تستخدم مكالمة malloc
مختلفة، والتي mtrace
لا تتبع ...
في الواقع، كما كتبت أعلاه أحصل على نفس النتيجة إذا أنا أكتب رئيسي فورتران التي من شأنها أن استدعاء (ملفوفة) mtrace()
وmuntrace()
.
وتعديل: I النظر في خيارات أخرى (بما في ذلك بعض التي لم تذكر حتى الان هنا)، ولكن الرمز الفعلي يتم تصحيحه يعمل على P6 / AIX، لذلك Valgrind سيكون "فقط" غير مريح (التي يحتاجها لتشغيل على جهاز آخر)، في حين سوف Forcheck يكون غير مريح (التي يحتاجها لتشغيل على جهاز آخر) ومكلفة (~ 3K $). في mtrace الحالية سيكون الحل الأفضل، إذا كان يعمل.
وEDITED مرة أخرى: تخميني
<اقتباس فقرة> وأعتقد gfortran يستخدم مكالمة malloc
مختلفة، والتي mtrace
لا تتبع ...
وكانت صحيحة. النظر في تنفيذ (إما مع أو nm
readelf
) ليس هناك أي دعوة malloc()
، ولكن تلك _gfortran_allocate_array
- التي ربما سيدعو malloc). أي أفكار أخرى؟
وEDITED مرة أخرى: نشرت لي الجواب ولكن أنا لا يمكن القبول به (انتقل إلى HTTP: //stackoverflow.uservoice. كوم / صفحة / العامة / اقتراحات / 39426 و تطلب هذه الميزة، هو مطلوب حقا - لا كسب سمعة أراد)
المحلول 3
وستيف كارغل الجواب، وهو بإيجاز أن mtrace لا يجد أي تسرب، بسبب عدم وجود أي تسرب إذا كان المترجم يتوافق مع معيار: انظر <لأ href = "http://gcc.gnu.org /ml/fortran/2008-11/msg00163.html "يختلط =" نوفولو noreferrer "> http://gcc.gnu.org/ml/fortran/2008-11/msg00163.html للحصول على مزيد من التفاصيل.
في الحقيقة أنا لست خبير فورتران كبير (أنا في الغالب C / C ++ / جافا الرجل)، وكنت تستخدم أيضا مترجم آخر، وهو ما تسرب في مثل هذه الحالة (لم أذكر أن للحفاظ على السؤال أسهل). هكذا اعتقدت خطأ أن تسرب هناك أيضا مع gfortran، التي ليست هي القضية (راجعت مع أعلى)
نصائح أخرى
وأنا لست خبيرا في mtrace، لذلك لا يمكن أن تساعد في ذلك. أود أن أقترح عليك أن تجرب valgrind الأداة للعثور على الذاكرة التسريبات إذا كنت تستخدم نظام معتمد. باستخدام valgrind للعثور على الذاكرة تسرب بسيط مثل استدعاء valgrind --leak-check=full ./a.out
.
وValgrind هو لينكس فقط. للحصول على منتج ويندوز ننظر Forcheck. http://www.forcheck.nl/features.htm
ولدي خبرة مع التصحيح برامج فورتران لكن لنكون صادقين لا أستطيع أن أفهم حقا سؤالك. اعتقد انه لأنني لم يكن لديك الكثير من C / C ++ تجربة التصحيح الذي مختلفة لفورتران. ومع ذلك أعتقد أن هذا ينفعك:
وعن طريق المترجم إنتل مع خيارات ترجمة التالية سيتم الكشف عن ما يقرب من أي تسرب للذاكرة، والوصول إلى عنوان خاطئ أو استخدام غير مهيأ مؤشر / متغير أثناء وقت التشغيل.
وإنتل: -O0 -debug -traceback -check -ftrapuv
لGfortran أيضا يمكنك الحصول على أي حد كبير من الأخطاء المذكورة أعلاه مع هذه الخيارات مترجم.
وgfortran: -g -O0 -fbounds-تحقق -Wuninitialized
ووسوف طباعة traceback من روتين يدعو إلى مكان حدوث الخطأ. هو دائما مفيدة لتجميع مع اثنين من المجمعين مختلفة وفي تجربتي سيكون لديك أي تقريبا تسرب للذاكرة بعد ذلك.