mtrace
mtraceهو مصحح أخطاء الذاكرة المضمن في مكتبة GNU C.
يستخدم
mtraceلا تعمل الأداة إلا مع التطبيقات أحادية الخيوط. في التطبيقات متعددة الخيوط، تكمن المشكلة في إمكانية قيام أحد الخيوط بإزالة الخطاف مؤقتًا بينما يقوم خيط آخر بتخصيص الذاكرة باستخدام دالة malloc، مما يؤدي إلى فقدان بعض عمليات التخصيص.
تقوم الدالة mtraceبتثبيت معالجات لـ mallocو reallocو free؛ وتقوم الدالة muntraceبتعطيل هذه المعالجات. نماذجها الأولية ، المُعرَّفة في ملف الرأس <mcheck.h>، هي
تتبع باطلة ( باطلة )؛ باطلة مونتريس ( باطلة )؛تقوم المعالجات بتسجيل جميع عمليات تخصيص الذاكرة وتحريرها في ملف محدد بواسطة متغير البيئةMALLOC_TRACE (إذا كان المتغير غير مُعيّن، أو يصف اسم ملف غير صالح، أو يصف اسم ملف لا يملك المستخدم أذونات الوصول إليه، فلن يتم تثبيت المعالجات).
يتم توزيع برنامج Perl النصي المسمى mtrace، والذي لا ينبغي الخلط بينه وبين الدالة التي تحمل نفس الاسم، مع مكتبة GNU C؛ يقوم البرنامج النصي بتحليل ملف الإخراج والإبلاغ عن جميع عمليات التخصيص التي لم يتم تحريرها.
مثال على الاستخدام
شفرة مصدرية سيئة
فيما يلي مثال على كود برمجي رديء . تكمن مشكلة البرنامج في أنه يخصص الذاكرة، لكنه لا يحررها قبل الخروج.
#include <stdlib.h>int main ( void ) { int * a = ( int * ) malloc ( sizeof ( int )); // تخصيص الذاكرة وتعيينها للمؤشر return 0 ; // الخروج من البرنامج دون تحرير الذاكرة // كان من المفترض أن نحرر الذاكرة المخصصة باستخدام العبارة "free(a)" }استخدام MTrace
- قم بتعيين متغير البيئة
MALLOC_TRACEإلى مسار ملف الإخراج المطلوب. تختلف طريقة تعيين متغيرات البيئة قليلاً بين أنواع الصدف المختلفة. في الصدف المتوافقة مع Bourne Shell ، مثل Bash ، يكون الأمر كما يلي:$ MALLOC_TRACE = /home/YourUserName/path/to/program/MallocTraceOutputFile.txt $ export MALLOC_TRACE
- قم بتضمينه
mcheck.hفي الكود المصدري. يتم ذلك، على سبيل المثال، بإضافة السطر التالي إلى أعلى ملف C أو C++ ، كما هو موضح أدناه:#include <mcheck.h>
- استدعِ الدالة
mtrace()قبل تخصيص الذاكرة. عادةً ما يكون من الأسهل استدعاؤهاmtrace()في بداية الدالةmain():mtrace ();
- لتحديد نهاية الكود الذي يجب تتبعه، استدعِ الدالة
muntrace(). ويتم ذلك عادةً في نهاية الدالةmain(): mntrace ();
- قم بتجميع البرنامج وتشغيله كالمعتاد. لاحظ أنه يجب التجميع باستخدام
-gالخيار المناسب للحصول على مخرجات مفيدة. في GCC على نظام Linux ، يمكن القيام بذلك باستخدام الأوامر التالية لبرنامج مكتوب بلغة C :$ gcc yourProgram.c -g $ ./a.out
- سيتم الإبلاغ عن معلومات تسرب الذاكرة في الملف المحدد بواسطة
MALLOC_TRACEمتغير البيئة. تكمن الصعوبة في أن هذا الملف سيكون بتنسيق قابل للقراءة بواسطة الحاسوب. تأتي معظم أجهزة لينكس مزودة بأمر سطر أوامر يُسمى `<اسم الأمر>`mtrace، والذي يحول التنسيق القابل للقراءة بواسطة الحاسوب إلى نص قابل للقراءة البشرية كما هو موضح أدناه. يوجد برنامج نصي مكتوب بلغة بيرل ، يحمل نفس الاسم، يمكن تنزيله لإنجاز المهمة نفسها، في حال عدم توفر الأمر `<اسم الأمر>`mtrace.mtraceالصيغة كالتالي:$ mtrace <exec_file_name> <malloc_trace_filename>- على سبيل المثال:
$ mtrace a.out MallocTraceOutputFile.txt
mtraceيمكن استخدامها مع الحوسبة المتوازية ولكن عملية واحدة في كل مرة، باستخدام شرط على الرتبة مثل:إذا كانت رتبتي تساوي صفرًا ، فسيتم استدعاء الدالة mtrace () .
مخرجات MTrace
إذا أظهر أمر mtrace رسالة "لا توجد تسريبات للذاكرة"، فهذا يعني أنه تم تحرير جميع الذاكرة التي تم تخصيصها في آخر تشغيل للبرنامج، وهذا هو الوضع الطبيعي. أما إذا أظهر mtrace مخرجات مشابهة لما هو موضح أدناه، فهذا يعني أن المبرمج لا يزال بحاجة إلى إنجاز بعض العمل.
الذاكرة غير محررة: ----------------- حجم العنوان المتصل 0x08049910 0x4 في /home/sureshsathiah/tips/leak.c:9
شفرة مصدرية جيدة
فيما يلي مثال على كود برمجي جيد. فهو يحرر الذاكرة بعد تخصيصها، ويستخدم أداة mtrace لإخطار المبرمج في حال وجود تسريبات للذاكرة.
#include <stdlib.h> #include <mcheck.h>int main ( void ) { mtrace (); // يبدأ تسجيل عمليات تخصيص الذاكرة وتحريرهاint * a = ( int * ) malloc ( sizeof ( int )); // تخصيص الذاكرة وتعيينها للمؤشر if ( ! a ) { return EXIT_FAILURE ; // خطأ }free ( a ); // تحرير الذاكرة المخصصة muntrace ();return EXIT_SUCCESS ; // الخروج }روابط خارجية
- برنامج مجاني لإدارة الذاكرة
- تصحيح الأخطاء
