sprof(1)

الاسم
sprof - قراءة وعرض بيانات التنميط للكائنات المشتركة

موجز
sprof [option ...] shared-object-path [profile-data-path]

الوصف
يعرض أمر sprof ملخص تنميط للكائن المشترك (المكتبة المشتركة) المحدد كوسيط سطر أوامر أول. يُنشأ ملخص التنميط باستخدام بيانات تنميط مولدة سابقًا في الوسيط الثاني (الاختياري) لسطر الأوامر. إذا حُذف مسار بيانات التنميط، يحاول sprof استنتاجه باستخدام اسم الصدى للكائن المشترك، باحثًا عن ملف باسم <اسم-الصدى>.profile في الدليل الحالي.

الخيارات
تحدد خيارات سطر الأوامر التالية مخرجات التنميط المراد إنتاجها:

--call-pairs
-c
    اطبع قائمة بأزواج مسارات الاستدعاء للواجهات المصدرة بواسطة الكائن المشترك، مع عدد مرات استخدام كل مسار.

--flat-profile
-p
    وَلّد تنميطًا مسطحًا لجميع الدوال في الكائن المراقب، مع العدادات والنقرات.

--graph
-q
    وَلّد رسمًا بيانيًا للاستدعاءات.

إذا لم يُحدد أي من الخيارات أعلاه، يكون السلوك المبدئي عرض تنميط مسطح ورسم بياني للاستدعاءات.

تتوفر خيارات سطر أوامر إضافية التالية:

--help
-?
    اعرض ملخصاً لخيارات ومعاملات سطر الأوامر ثم اخرج.

--usage
    اعرض رسالة استخدام قصيرة واخرج.

--version
-V
    اعرض إصدار البرنامج واخرج.

المعايير
GNU.

أمثلة
يوضح المثال التالي استخدام sprof. يتكون المثال من برنامج رئيس يستدعي دالتين في كائن مشترك. أولاً، كود البرنامج الرئيس:

    $ cat prog.c;
    #include <stdlib.h>

    void x1(void);
    void x2(void);

    int
    main(int argc, char *argv[])
    {
        x1();
        x2();
        exit(EXIT_SUCCESS);
    }

تُعرف الدالتان x1() و x2() في ملف المصدر التالي المستخدم لبناء الكائن المشترك:

    $ cat libdemo.c;
    #include <unistd.h>

    void
    consumeCpu1(int lim)
    {
        for (unsigned int j = 0; j < lim; j++)
    	getppid();
    }

    void
    x1(void) {
        for (unsigned int j = 0; j < 100; j++)
    	consumeCpu1(200000);
    }

    void
    consumeCpu2(int lim)
    {
        for (unsigned int j = 0; j < lim; j++)
    	getppid();
    }

    void
    x2(void)
    {
        for (unsigned int j = 0; j < 1000; j++)
    	consumeCpu2(10000);
    }

الآن نبني الكائن المشترك بالاسم الحقيقي libdemo.so.1.0.1، واسم الصدى libdemo.so.1:

    $ cc -g -fPIC -shared -Wl,-soname,libdemo.so.1 \
            -o libdemo.so.1.0.1 libdemo.c;

ثم نبني روابط رمزية لاسم الصدى للمكتبة واسم رابط المكتبة:

    $ ln -sf libdemo.so.1.0.1 libdemo.so.1;
    $ ln -sf libdemo.so.1 libdemo.so;

بعد ذلك، نُجمّع البرنامج الرئيس، رابطًا إياه مع الكائن المشترك، ثم نسرد التبعيات الديناميكية للبرنامج:

    $ cc -g -o prog prog.c -L. -ldemo;
    $ ldd prog;
    	linux-vdso.so.1 =>  (0x00007fff86d66000)
    	libdemo.so.1 => not found
    	libc.so.6 => /lib64/libc.so.6 (0x00007fd4dc138000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007fd4dc51f000)

للحصول على معلومات التنميط للكائن المشترك، نُعرِّف متغير البيئة LD_PROFILE باسم الصدى للمكتبة:

    $ export LD_PROFILE=libdemo.so.1;

ثم نُعرِّف متغير البيئة LD_PROFILE_OUTPUT بمسار الدليل حيث يجب كتابة مخرجات التنميط، وننشئ ذلك الدليل إذا لم يكن موجودًا بالفعل:

    $ export LD_PROFILE_OUTPUT=$(pwd)/prof_data;
    $ mkdir -p $LD_PROFILE_OUTPUT;

يتسبب LD_PROFILE في إلحاق مخرجات التنميط بملف المخرجات إذا كان موجودًا بالفعل، لذا نضمن عدم وجود بيانات تنميط سابقة:

    $ rm -f $LD_PROFILE_OUTPUT/$LD_PROFILE.profile;

ثم نشغل البرنامج لإنتاج مخرجات التنميط، التي تُكتب إلى ملف في الدليل المحدد في LD_PROFILE_OUTPUT:

    $ LD_LIBRARY_PATH=. ./prog;
    $ ls prof_data;
    libdemo.so.1.profile

ثم نستخدم الخيار sprof -p لتوليد تشكيلة مسطحة مع العد والنقرات:

    $ sprof -p libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile;
    Flat profile:

    Each sample counts as 0.01 seconds.
      %   cumulative   self              self     total
     time   seconds   seconds    calls  us/call  us/call  name
     60.00      0.06     0.06      100   600.00           consumeCpu1
     40.00      0.10     0.04     1000    40.00           consumeCpu2
      0.00      0.10     0.00        1     0.00           x1
      0.00      0.10     0.00        1     0.00           x2

الخيار sprof -q يولد رسم بياني للاستدعاءات:

    $ sprof -q libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile;

    index % time    self  children    called     name

                    0.00    0.00      100/100         x1 [1]
    [0]    100.0    0.00    0.00      100         consumeCpu1 [0]
    -----------------------------------------------
                    0.00    0.00        1/1           <UNKNOWN>
    [1]      0.0    0.00    0.00        1         x1 [1]
                    0.00    0.00      100/100         consumeCpu1 [0]
    -----------------------------------------------
                    0.00    0.00     1000/1000        x2 [3]
    [2]      0.0    0.00    0.00     1000         consumeCpu2 [2]
    -----------------------------------------------
                    0.00    0.00        1/1           <UNKNOWN>
    [3]      0.0    0.00    0.00        1         x2 [3]
                    0.00    0.00     1000/1000        consumeCpu2 [2]
    -----------------------------------------------

أعلاه وأسفل، السلاسل "<UNKNOWN>" تمثل معرفات خارج الكائن المُشكّل (في هذا المثال، هذه حالات من main()).

الخيار sprof -c يولد قائمة بأزواج الاستدعاءات وعدد مرات حدوثها:

    $ sprof -c libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile;
    <UNKNOWN>                  x1                                 1
    x1                         consumeCpu1                      100
    <UNKNOWN>                  x2                                 1
    x2                         consumeCpu2                     1000

انظر أيضًا
gprof(1), ldd(1), ld.so(8)

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

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

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