mtrace(3)

الاسم
mtrace, muntrace - تتبع malloc

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <mcheck.h>

void mtrace(void);
void muntrace(void);

الوصف
الدالة mtrace() تُثبّت دوال ربط لدوال تخصيص الذاكرة (malloc(3), realloc(3) memalign(3), free(3)). تُسجّل دوال الربط هذه معلومات تتبع حول تخصيص الذاكرة وإلغاء تخصيصها. يمكن استخدام معلومات التتبع لاكتشاف تسريبات الذاكرة ومحاولات تحرير ذاكرة غير مخصصة في برنامج.

الدالة muntrace() تُعطّل دوال الربط التي ثبّتها mtrace()، بحيث لا تُسجّل معلومات التتبع لدوال تخصيص الذاكرة بعد الآن. إذا لم تُثبّت دوال ربط بنجاح بواسطة mtrace()، فلا تفعل muntrace() شيئًا.

عند استدعاء mtrace()، تتحقق من قيمة متغير البيئة MALLOC_TRACE، الذي يجب أن يحتوي على اسم مسار ملف تُسجّل فيه معلومات التتبع. إذا فُتح اسم المسار بنجاح، يُقتطع إلى طول صفري.

إذا لم يُضبط MALLOC_TRACE، أو كان اسم المسار الذي يُحدّده غير صالح أو غير قابل للكتابة، فلا تُثبّت دوال ربط، ولا يكون لـ mtrace() أي تأثير. في برامج set-user-ID و set-group-ID، يُتجاهل MALLOC_TRACE، ولا يكون لـ mtrace() أي تأثير.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
mtrace()، muntrace() | سلامة الخيوط | غير آمن لتعدد الخيوط (MT-Unsafe)

المعايير
GNU.

ملاحظات
في الاستخدام العادي، تُستدعى mtrace() مرة واحدة في بداية تنفيذ برنامج، ولا تُستدعى muntrace() أبدًا.

مخرجات التتبع الناتجة بعد استدعاء mtrace() نصية، لكنها غير مصممة لتكون قابلة للقراءة البشرية. توفر مكتبة GNU C سكربت Perl، mtrace(1)، الذي يُفسّر سجل التتبع ويُنتج مخرجات قابلة للقراءة البشرية. للحصول على أفضل النتائج، يجب ترجمة البرنامج المُتتبّع مع تمكين التصحيح، بحيث تُسجّل معلومات أرقام الأسطر في الملف التنفيذي.

التتبع الذي تُجريه mtrace() يُسبّب عقوبة أداء (إذا كان MALLOC_TRACE يُشير إلى اسم مسار صالح وقابل للكتابة).

العلل
معلومات رقم السطر التي يُنتجها mtrace(1) ليست دقيقة دائمًا: قد تُشير مراجع رقم السطر إلى السطر السابق أو التالي (غير الفارغ) من شفرة المصدر.

أمثلة
جلسة الصدفة أدناه تُوضّح استخدام الدالة mtrace() والأمر mtrace(1) في برنامج به تسريبات ذاكرة في موقعين مختلفين. يستخدم العرض التوضيحي البرنامج التالي:

$ cat t_mtrace.c
    #include <mcheck.h>
    #include <stdio.h>
    #include <stdlib.h>

    int
    main(void)
    {
        mtrace();

        for (unsigned int j = 0; j < 2; j++)
            malloc(100);            /* لم يُحرّر أبدًا--تسريب ذاكرة */

        calloc(16, 16);             /* لم يُحرّر أبدًا--تسريب ذاكرة */
        exit(EXIT_SUCCESS);
    }

عند تشغيل البرنامج كما يلي، نرى أن mtrace() شخصت تسريبات ذاكرة في موقعين مختلفين في البرنامج:

    $ cc -g t_mtrace.c -o t_mtrace
    $ export MALLOC_TRACE=/tmp/t
    $ ./t_mtrace
    $ mtrace ./t_mtrace $MALLOC_TRACE
    ذاكرة غير محررة:
    -----------------
       العنوان     الحجم     المستدعي
    0x084c9378     0x64  at /home/cecilia/t_mtrace.c:12
    0x084c93e0     0x64  at /home/cecilia/t_mtrace.c:12
    0x084c9448    0x100  at /home/cecilia/t_mtrace.c:16

الرسالتان الأوليتان حول الذاكرة غير المحررة تتوافقان مع استدعاءَي malloc(3) داخل حلقة for. الرسالة الأخيرة تتوافق مع استدعاء calloc(3) (الذي يستدعي بدوره malloc(3)).

انظر أيضًا
mtrace(1), malloc(3), malloc_hook(3), mcheck(3)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.