| GPROF(1) | GNU | GPROF(1) |
نام (NAME)
riscv32-elf-gprof - نمایش دادههای پروفایل گراف فراخوانی
خلاصه دستور (SYNOPSIS)
gprof [ -[abcDhilLrsTvwxyz] ] [
-[ABCeEfFJnNOpPqQRStZ][name] ]
[ -I dirs ] [ -d[num] ] [ -k from/to ]
[ -m min-count ] [ -R map_file ] [ -t table-length ]
[ --[no-]annotated-source[=name] ]
[ --[no-]exec-counts[=name] ]
[ --[no-]flat-profile[=name] ] [ --[no-]graph[=name] ]
[ --[no-]time=name] [ --all-lines ] [ --brief ]
[ --debug[=level] ] [ --function-ordering ]
[ --file-ordering map_file ] [ --directory-path=dirs ]
[ --display-unused-functions ] [ --file-format=name ]
[ --file-info ] [ --help ] [ --line ] [ --inline-file-names ]
[ --min-count=n ] [ --no-static ] [ --print-path ]
[ --separate-files ] [ --static-call-graph ] [ --sum ]
[ --table-length=len ] [ --traditional ] [ --version ]
[ --width=n ] [ --ignore-non-functions ]
[ --demangle[=STYLE] ] [ --no-demangle ]
[--external-symbol-table=name]
[ image-file ] [ profile-file ... ]
توضیحات (DESCRIPTION)
"gprof" یک پروفایل اجرایی از برنامههای C، Pascal یا Fortran77 تولید میکند. اثر توابع فراخوانیشده در پروفایل هر فراخواننده گنجانده میشود. دادههای پروفایل از پرونده پروفایل گراف فراخوانی (بهطور پیشفرض gmon.out) گرفته میشود که توسط برنامههای کامپایلشده با گزینه -pg در "cc"، "pc" و "f77" ایجاد شده است. گزینه -pg همچنین نسخههایی از روتینهای کتابخانهای را پیوند میدهد که برای پروفایلسازی کامپایل شدهاند. "gprof" پرونده شیء دادهشده (پیشفرض "a.out") را میخواند و ارتباط بین جدول نمادهای آن و پروفایل گراف فراخوانی از gmon.out را برقرار میسازد. اگر بیش از یک پرونده پروفایل مشخص شده باشد، خروجی "gprof" مجموع اطلاعات پروفایل را در پروندههای پروفایل ارائهشده نمایش میدهد.
"gprof" مقدار زمان صرفشده در هر روتین را محاسبه میکند. سپس این زمانها در امتداد یالهای گراف فراخوانی پخش میشوند. حلقهها (Cycles) شناسایی میشوند و فراخوانیها به یک حلقه، در زمان آن حلقه سهیم میگردند.
چندین قالب خروجی از این تحلیل در دسترس است.
پروفایل مسطح (flat profile) نشان میدهد که برنامه شما چه مقدار زمان در هر تابع صرف کرده است و آن تابع چند بار فراخوانی شده است. اگر فقط میخواهید بدانید کدام توابع بیشترین چرخههای پردازشی را مصرف میکنند، در اینجا بهطور خلاصه بیان شده است.
گراف فراخوانی (call graph) برای هر تابع نشان میدهد چه توابعی آن را فراخوانی کردهاند، چه توابع دیگری توسط آن فراخوانی شدهاند و هرکدام چند بار فراخوانی شدهاند. همچنین تخمینی از میزان زمان صرفشده در زیرروالهای هر تابع ارائه میشود. این میتواند جاهایی را پیشنهاد دهد که شاید بتوانید فراخوانیهای تابعی پرمصرف و زمانبر را حذف کنید.
فهرست سورس کد حاشیهنویسیشده (annotated source) نسخهای از کد منبع برنامه است که با تعداد دفعات اجرای هر خط از برنامه برچسبگذاری شده است.
گزینهها (OPTIONS)
این گزینهها مشخص میکنند که "gprof" کدامیک از چندین قالب خروجی را باید تولید کند.
بسیاری از این گزینهها یک symspec اختیاری دریافت میکنند تا توابعی را که باید مشمول یا مستثنی شوند مشخص کنند. این گزینهها را میتوان چندین بار با symspecهای مختلف تعیین کرد تا مجموعههایی از نمادها شامل یا حذف شوند.
مشخص کردن هر یک از این گزینهها رفتار پیشفرض (-p -q) را که چاپ یک پروفایل مسطح و تحلیل گراف فراخوانی برای تمام توابع است، لغو میکند.
- "-A[symspec]"
- "--annotated-source[=symspec]"
- گزینه -A باعث میشود "gprof" کد منبع حاشیهنویسیشده را چاپ کند. اگر symspec مشخص شود، خروجی تنها برای نمادهای منطبق چاپ میشود.
- "-b"
- "--brief"
- اگر گزینه -b داده شود، "gprof" توضیحات متنی مفصلی را که معنای فیلدهای جداول را تشریح میکنند چاپ نمیکند. این گزینه زمانی مفید است که قصد چاپ خروجی را دارید یا مایل به دیدن توضیحات طولانی نیستید.
- "-B"
- گزینه -B باعث میشود "gprof" تحلیل گراف فراخوانی را چاپ کند.
- "-C[symspec]"
- "--exec-counts[=symspec]"
- گزینه -C
باعث
میشود
"gprof"
شمارش
توابع و
تعداد
دفعات
فراخوانی
هر یک را
چاپ کند.
اگر symspec مشخص
شود، شمارش
فقط برای
نمادهای
منطبق چاپ
میشود.
اگر پرونده دادههای پروفایل حاوی رکوردهای شمارش بلوک پایه (basic-block) باشد، مشخص کردن گزینه -l همراه با -C باعث میشود تعداد دفعات اجرای بلوکهای پایه شمارش و نمایش داده شود.
- "-i"
- "--file-info"
- گزینه -i باعث میشود "gprof" اطلاعات خلاصهای درباره پرونده(های) دادههای پروفایل نمایش دهد و سپس خارج شود. تعداد رکوردهای هیستوگرام، گراف فراخوانی و رکوردهای شمارش بلوک پایه نمایش داده میشود.
- "-I dirs"
- "--directory-path=dirs"
- گزینه -I فهرستی از دایرکتوریهای جستجو را برای یافتن پروندههای کد منبع مشخص میکند. متغیر محیطی GPROF_PATH نیز میتواند برای انتقال این اطلاعات استفاده شود. عمدتاً برای خروجی سورس کد حاشیهنویسیشده به کار میرود.
- "-J[symspec]"
- "--no-annotated-source[=symspec]"
- گزینه -J باعث میشود "gprof" کد منبع حاشیهنویسیشده را چاپ نکند. اگر symspec مشخص شود، "gprof" کد منبع حاشیهنویسیشده را چاپ میکند، اما نمادهای منطبق را مستثنی میسازد.
- "-L"
- "--print-path"
- بهطور معمول، نام پروندههای منبع بدون بخش مسیر چاپ میشوند. گزینه -L باعث میشود "gprof" مسیر کامل نام پروندههای منبع را چاپ کند؛ این مسیر بر اساس اطلاعات اشکالزدایی نمادین در پرونده تصویر اجرایی تعیین میشود و نسبت به دایرکتوریای است که کامپایلر در آن فراخوانی شده بود.
- "-p[symspec]"
- "--flat-profile[=symspec]"
- گزینه -p باعث میشود "gprof" یک پروفایل مسطح را چاپ کند. اگر symspec مشخص شود، پروفایل مسطح فقط برای نمادهای منطبق چاپ میشود.
- "-P[symspec]"
- "--no-flat-profile[=symspec]"
- گزینه -P باعث میشود "gprof" از چاپ پروفایل مسطح صرفنظر کند. اگر symspec مشخص شود، "gprof" یک پروفایل مسطح چاپ میکند، اما نمادهای منطبق را مستثنی میسازد.
- "-q[symspec]"
- "--graph[=symspec]"
- گزینه -q باعث میشود "gprof" تحلیل گراف فراخوانی را چاپ کند. اگر symspec مشخص شود، گراف فراخوانی فقط برای نمادهای منطبق و فرزندان آنها چاپ میشود.
- "-Q[symspec]"
- "--no-graph[=symspec]"
- گزینه -Q باعث میشود "gprof" از چاپ گراف فراخوانی صرفنظر کند. اگر symspec مشخص شود، "gprof" گراف فراخوانی را چاپ میکند، اما نمادهای منطبق را مستثنی میسازد.
- "-t"
- "--table-length=num"
- گزینه -t باعث میشود هنگامی که حاشیهنویسی منبع فعال است، تعداد num خط فعالتر در هر پرونده منبع فهرست شود. مقدار پیشفرض 10 است.
- "-y"
- "--separate-files"
- این گزینه فقط بر خروجی کد منبع حاشیهنویسیشده تأثیر میگذارد. بهطور معمول، "gprof" پروندههای منبع حاشیهنویسیشده را در خروجی استاندارد چاپ میکند. اگر این گزینه مشخص شود، کد منبع حاشیهنویسیشده برای پروندهای با نام path/filename در پروندهای با نام filename-ann تولید میشود. اگر سیستمفایل زیرین نام filename-ann را کوتاه کند بهطوری که روی filename اصلی بازنویسی شود، "gprof" در عوض کد منبع حاشیهنویسیشده را در پرونده filename.ann تولید میکند (اگر نام پرونده اصلی دارای پسوند باشد، آن پسوند با .ann جایگزین میشود).
- "-Z[symspec]"
- "--no-exec-counts[=symspec]"
- گزینه -Z باعث میشود "gprof" شمارش توابع و تعداد دفعات فراخوانی هر یک را چاپ نکند. اگر symspec مشخص شود، شمارش چاپ میشود اما نمادهای منطبق مستثنی میگردند.
- "-r"
- "--function-ordering"
- گزینه --function-ordering
باعث
میشود
"gprof" بر
اساس
دادههای
پروفایلسازی،
ترتیبی
پیشنهادی
برای توابع
برنامه چاپ
کند. این
گزینه
ترتیبی را
پیشنهاد
میدهد که
ممکن است در
سیستمهایی
که از ترتیب
دلخواه
توابع در یک
پرونده
اجرایی
پشتیبانی
میکنند،
رفتار
صفحهبندی
(paging)، TLB و
حافظه نهان
(cache) را برای
برنامه
بهبود بخشد.
جزئیات دقیق نحوه وادار کردن پیونددهنده (linker) به قرار دادن توابع در یک ترتیب خاص، وابسته به سیستم بوده و خارج از محدوده این راهنما است.
- "-R map_file"
- "--file-ordering map_file"
- گزینه --file-ordering
باعث
میشود
"gprof"
ترتیبی
پیشنهادی
برای خط
پیوند
پروندههای
شیء (.o)
برنامه بر
اساس
دادههای
پروفایلسازی
چاپ کند.
این گزینه
ترتیبی را
پیشنهاد
میدهد که
ممکن است در
سیستمهایی
که از ترتیب
دلخواه
توابع در
پرونده
اجرایی
پشتیبانی
نمیکنند،
رفتار
صفحهبندی
(paging)، TLB و
حافظه نهان
(cache) را برای
برنامه
بهبود بخشد.
استفاده از آرگومان -a همراه با این گزینه اکیداً توصیه میشود.
شناسه map_file مسیر پروندهای است که نگاشت نام تابع به پرونده شیء را فراهم میکند. قالب این پرونده شبیه به خروجی برنامه "nm" است.
c-parse.o:00000000 T yyparse c-parse.o:00000004 C yyerrflag c-lang.o:00000000 T maybe_objc_method_name c-lang.o:00000000 T print_lang_statistics c-lang.o:00000000 T recognize_objc_keyword c-decl.o:00000000 T print_lang_identifier c-decl.o:00000000 T print_lang_type ...
برای ایجاد یک map_file با ابزار GNU "nm"، دستوری مانند زیر را وارد کنید: "nm --extern-only --defined-only -v --print-file-name program-name".
- "-T"
- "--traditional"
- گزینه -T باعث میشود "gprof" خروجی خود را در سبک «سنتی» BSD چاپ کند.
- "-w width"
- "--width=width"
- عرض خطوط خروجی را روی width تنظیم میکند. در حال حاضر تنها هنگام چاپ نمایهنامه توابع در پایین گراف فراخوانی استفاده میشود.
- "-x"
- "--all-lines"
- این گزینه فقط بر خروجی کد منبع حاشیهنویسیشده تأثیر میگذارد. بهطور پیشفرض، فقط خطوط ابتدایی یک بلوک پایه (basic-block) حاشیهنویسی میشوند. اگر این گزینه مشخص شود، هر خط در یک بلوک پایه با تکرار حاشیهنویسی خط اول، برچسبگذاری میشود. این رفتار مشابه گزینه -a در "tcov" است.
- "--demangle[=style]"
- "--no-demangle"
- این گزینهها کنترل میکنند که آیا نام نمادهای ++C هنگام چاپ خروجی باید رمزگشایی (demangle) شوند یا خیر. حالت پیشفرض، رمزگشایی نمادها است. گزینه "--no-demangle" میتواند برای غیرفعال کردن رمزگشایی استفاده شود. کامپایلرهای مختلف شیوههای متفاوتی برای دستکاری نامها (mangling) دارند. آرگومان اختیاری شیوه رمزگشایی میتواند برای انتخاب شیوه مناسب برای کامپایلر شما استفاده شود.
گزینههای تحلیل (Analysis Options)
- "-a"
- "--no-static"
- گزینه -a مانع از چاپ توابع تعریفشده به صورت ایستا (خصوصی / static) توسط "gprof" میشود. (اینها توابعی هستند که نامشان سراسری نیست و خارج از پرونده/تابع/بلوکی که در آن تعریف شدهاند قابل مشاهده نیستند). زمان صرفشده در این توابع، فراخوانیهای ورودی/خروجی آنها و غیره همگی به تابعی نسبت داده میشوند که دقیقاً قبل از آن در پرونده اجرایی بارگذاری شده است. این گزینه هم بر پروفایل مسطح و هم بر گراف فراخوانی تأثیر میگذارد.
- "-c"
- "--static-call-graph"
- گزینه -c باعث میشود گراف فراخوانی برنامه با یک روش ابتکاری (heuristic) تکمیل شود که فضای متن (text space) پرونده شیء را بررسی کرده و فراخوانیهای تابع را در کد ماشین دودویی شناسایی میکند. از آنجا که رکوردهای عادی گراف فراخوانی تنها هنگام ورود به توابع تولید میشوند، این گزینه فرزندانی را شناسایی میکند که ممکن بود فراخوانی شوند اما هرگز فراخوانی نشدند. فراخوانیهای مربوط به توابعی که با قابلیت پروفایلسازی کامپایل نشدهاند نیز شناسایی میشوند، اما تنها در صورتی که مدخلهای جدول نماد برای آنها وجود داشته باشد. فراخوانیهای مربوط به روتینهای کتابخانه پویا معمولاً توسط این گزینه پیدا نمیشوند. والدین یا فرزندان شناساییشده از طریق این روش ابتکاری، با تعداد فراخوانی 0 در گراف فراخوانی مشخص میشوند.
- "-D"
- "--ignore-non-functions"
- گزینه -D باعث میشود "gprof" نمادهایی را که به عنوان تابع شناخته نمیشوند نادیده بگیرد. این گزینه در سیستمهایی که از آن پشتیبانی میکنند (برای مثال Solaris و HPUX) دادههای پروفایل دقیقتری ارائه میدهد.
- "-k from/to"
- گزینه -k به شما اجازه میدهد هر قوسی را از نمادهای منطبق با symspec مبدأ (from) به نمادهای منطبق با symspec مقصد (to) از گراف فراخوانی حذف کنید.
- "-l"
- "--line"
- گزینه -l
پروفایلسازی
خطبهخط
را فعال
میکند که
باعث
میشود
ثبتهای
هیستوگرام
بهجای
توابع، به
خطوط منفرد
کد منبع
نسبت داده
شوند. این
ویژگی تنها
برای
برنامههایی
کار میکند
که توسط
نسخههای
قدیمیتر
کامپایلر
"gcc"
کامپایل
شده باشند.
نسخههای
جدیدتر
"gcc" به
گونهای
طراحی
شدهاند که
به جای آن
با ابزار
"gcov" کار
کنند.
اگر برنامه با شمارش بلوکهای پایه فعال کامپایل شده باشد، این گزینه همچنین مشخص میکند که هر خط کد چند بار اجرا شده است. اگرچه پروفایلسازی خطبهخط میتواند به شناسایی بخشهای زمانبر یک تابع بزرگ کمک کند، اما زمان اجرای "gprof" را بهطور چشمگیری افزایش داده و خطاهای آماری را بزرگنمایی میکند.
- "--inline-file-names"
- این گزینه باعث میشود "gprof" پرونده منبع را پس از هر نماد، هم در پروفایل مسطح و هم در گراف فراخوانی چاپ کند. در صورت استفاده همراه با گزینه -L، مسیر کامل پرونده چاپ میشود.
- "-m num"
- "--min-count=num"
- این گزینه تنها بر خروجی تعداد دفعات اجرا تأثیر میگذارد. نمادهایی که کمتر از num بار اجرا شده باشند، حذف میشوند.
- "-nsymspec"
- "--time=symspec"
- گزینه -n باعث میشود "gprof" در تحلیل گراف فراخوانی خود، زمانها را تنها برای نمادهای منطبق با symspec انتشار دهد.
- "-Nsymspec"
- "--no-time=symspec"
- گزینه -N باعث میشود "gprof" در تحلیل گراف فراخوانی خود، زمانها را برای نمادهای منطبق با symspec انتشار ندهد.
- "-Sfilename"
- "--external-symbol-table=filename"
- گزینه -S باعث میشود "gprof" یک پرونده جدول نمادهای خارجی، مانند /proc/kallsyms، را بخواند نه اینکه جدول نمادها را از پرونده شیء دادهشده (پیشفرض "a.out") بخواند. این ویژگی برای پروفایلسازی ماژولهای هسته (kernel) مفید است.
- "-z"
- "--display-unused-functions"
- اگر گزینه -z را بدهید، "gprof" تمام توابع را در پروفایل مسطح ذکر میکند؛ حتی آنهایی که هرگز فراخوانی نشدهاند و هیچ زمانی در آنها صرف نشده است. این ویژگی همراه با گزینه -c برای یافتن روتینهایی که هرگز فراخوانی نشدهاند مفید است.
گزینههای متفرقه (Miscellaneous Options)
- "-d[num]"
- "--debug[=num]"
- گزینه -d num گزینههای اشکالزدایی (دیباگ) را مشخص میکند. اگر num مشخص نشود، تمام حالتهای اشکالزدایی فعال میشوند.
- "-h"
- "--help"
- گزینه -h نحوه استفاده از خط فرمان را چاپ میکند.
- "-Oname"
- "--file-format=name"
- قالب پروندههای دادههای پروفایل را انتخاب میکند. قالبهای شناختهشده عبارتند از auto (پیشفرض)، bsd، 4.4bsd، magic و prof (هنوز پشتیبانی نمیشود).
- "-s"
- "--sum"
- گزینه -s
باعث
میشود
"gprof"
اطلاعات
موجود در
پروندههای
داده
پروفایل
خواندهشده
را خلاصه
کند و یک
پرونده
داده
پروفایل به
نام gmon.sum
بنویسد که
شامل تمام
اطلاعات از
پروندههای
داده
پروفایلی
است که
"gprof"
خوانده است.
پرونده gmon.sum
میتواند
یکی از
پروندههای
ورودی
مشخصشده
باشد؛ اثر
این کار،
ادغام
دادههای
سایر
پروندههای
ورودی در gmon.sum
است.
در نهایت میتوانید "gprof" را دوباره بدون -s اجرا کنید تا دادههای انباشتهشده در پرونده gmon.sum را تحلیل کند.
- "-v"
- "--version"
- فلگ -v باعث میشود "gprof" شماره نسخه فعلی را چاپ کند و سپس خارج شود.
گزینههای منسوخشده (Deprecated Options)
این گزینهها با نسخههای جدیدتری که از symspec استفاده میکنند جایگزین شدهاند.
- "-e function_name"
- گزینه -e function به "gprof" میگوید که اطلاعات مربوط به تابع function_name (و فرزندان آن...) را در گراف فراخوانی چاپ نکند. این تابع همچنان به عنوان فرزند هر تابعی که آن را فراخوانی کند فهرست میشود، اما شماره نمایه آن به صورت [not printed] نشان داده خواهد شد. بیش از یک گزینه -e را میتوان مشخص کرد؛ با هر گزینه -e تنها یک function_name را میتوان تعیین نمود.
- "-E function_name"
- گزینه "-E function" مانند گزینه "-e" عمل میکند، اما زمان صرفشده در این تابع (و فرزندانی که از هیچ جای دیگری فراخوانی نشدهاند) برای محاسبه درصد زمان در گراف فراخوانی استفاده نخواهد شد. بیش از یک گزینه -E را میتوان مشخص کرد؛ با هر گزینه -E تنها یک function_name را میتوان تعیین نمود.
- "-f function_name"
- گزینه -f function باعث میشود "gprof" گراف فراخوانی را به تابع function_name و فرزندان آن (و فرزندان آنها...) محدود کند. بیش از یک گزینه -f را میتوان مشخص کرد؛ با هر گزینه -f تنها یک function_name را میتوان تعیین نمود.
- "-F function_name"
- گزینه -F function مانند گزینه "-f" عمل میکند، اما تنها زمان صرفشده در این تابع و فرزندان آن (و فرزندان آنها...) برای تعیین کل زمان و درصد زمان در گراف فراخوانی استفاده خواهد شد. بیش از یک گزینه -F را میتوان مشخص کرد؛ با هر گزینه -F تنها یک function_name را میتوان تعیین نمود. گزینه -F اولویتی بالاتر از گزینه -E دارد و آن را لغو میکند.
فایلها (FILES)
- "a.out"
- فهرست نامها و فضای متن.
- "gmon.out"
- گراف فراخوانی و پروفایل پویا.
- "gmon.sum"
- گراف فراخوانی و پروفایل پویای خلاصهشده.
اشکالات (BUGS)
دقت نمونهبرداری نمایش داده میشود، اما در بهترین حالت همچنان آماری و تقریبی باقی میماند. ما فرض میکنیم که زمان هر بار اجرای یک تابع را میتوان بر اساس زمان کل تابع تقسیم بر تعداد دفعات فراخوانی آن بیان کرد. بنابراین، زمانی که در امتداد کمانهای گراف فراخوانی به والدین تابع منتشر میشود، مستقیماً متناسب با تعداد دفعات پیموده شدن آن کمان است.
والدینی که خودشان پروفایلسازی نشدهاند، زمان فرزندان پروفایلشدهشان به آنها منتقل میشود، اما در فهرست گراف فراخوانی به صورت خودبهخودی (spontaneous) ظاهر میشوند و زمان آنها به سطوح بالاتر منتشر نخواهد شد. به همین ترتیب، گیرندههای سیگنال (signal catchers)، حتی اگر پروفایل شده باشند، به صورت خودبهخودی ظاهر خواهند شد (اگرچه به دلایل پیچیدهتر). هر فرزند پروفایلشده از گیرندههای سیگنال باید زمانش به درستی منتشر شود، مگر اینکه گیرنده سیگنال در حین اجرای روتین پروفایلسازی فراخوانی شده باشد که در این صورت اطلاعات از دست میرود.
برنامه پروفایلشده باید "exit"(2) را فراخوانی کند یا به طور عادی بازگردد تا اطلاعات پروفایلسازی در پرونده gmon.out ذخیره شود.
همچنین ببینید (SEE ALSO)
monitor(3)، profil(2)، cc(1)، prof(1) و مدخل Info برای gprof.
"An Execution Profiler for Modular Programs", by S. Graham, P. Kessler, M. McKusick; Software - Practice and Experience, Vol. 13, pp. 671-685, 1983.
"gprof: A Call Graph Execution Profiler", by S. Graham, P. Kessler, M. McKusick; Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices, Vol. 17, No 6, pp. 120-126, June 1982.
حق نشر (COPYRIGHT)
کپیرایت © 1988-2025 بنیاد نرمافزار آزاد (Free Software Foundation, Inc.)
اجازه کپی، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد گنو» (GNU Free Documentation License) نسخه 1.3 یا هر نسخه متأخرتر منتشرشده توسط بنیاد نرمافزار آزاد اعطا میشود؛ بدون بخشهای تغییرناپذیر، بدون متنهای جلد رویی، و بدون متنهای جلد پشتی. یک کپی از این مجوز در بخش تحت عنوان "GNU Free Documentation License" گنجانده شده است.
| 2025-11-10 | binutils-2.45.1 |