سؤال

وأنا أحاول أن استخدام 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 من روتين يدعو إلى مكان حدوث الخطأ. هو دائما مفيدة لتجميع مع اثنين من المجمعين مختلفة وفي تجربتي سيكون لديك أي تقريبا تسرب للذاكرة بعد ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top