.\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .if !\nF .nr F 0 .if \nF>0 \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "GCOV 1" .TH GCOV 1 "2025-08-08" "gcc-15.2.0" "GNU" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" or1k-elf-gcov \- ابزار بررسی و تحلیل پوشش کد برای برنامه‌های معماری OpenRISC .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" gcov [\fB\-v\fR|\fB\-\-version\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-a\fR|\fB\-\-all\-blocks\fR] [\fB\-b\fR|\fB\-\-branch\-probabilities\fR] [\fB\-c\fR|\fB\-\-branch\-counts\fR] [\fB\-g\fR|\fB\-\-conditions\fR] [\fB\-e\fR|\fB\-\-prime\-paths\fR] [\fB\-\-prime\-paths\-lines[=\fR\fItype\fR\fB]\fR] [\fB\-\-prime\-paths\-source[=\fR\fItype\fR\fB]\fR] [\fB\-d\fR|\fB\-\-display\-progress\fR] [\fB\-f\fR|\fB\-\-function\-summaries\fR] [\fB\-\-include\fR \fIregex\fR] [\fB\-\-exclude\fR \fIregex\fR] [\fB\-j\fR|\fB\-\-json\-format\fR] [\fB\-H\fR|\fB\-\-human\-readable\fR] [\fB\-k\fR|\fB\-\-use\-colors\fR] [\fB\-l\fR|\fB\-\-long\-file\-names\fR] [\fB\-m\fR|\fB\-\-demangled\-names\fR] [\fB\-M\fR|\fB\-\-filter\-on\-demangled\fR] [\fB\-n\fR|\fB\-\-no\-output\fR] [\fB\-o\fR|\fB\-\-object\-directory\fR \fIdirectory|file\fR] [\fB\-p\fR|\fB\-\-preserve\-paths\fR] [\fB\-q\fR|\fB\-\-use\-hotness\-colors\fR] [\fB\-r\fR|\fB\-\-relative\-only\fR] [\fB\-s\fR|\fB\-\-source\-prefix\fR \fIdirectory\fR] [\fB\-t\fR|\fB\-\-stdout\fR] [\fB\-u\fR|\fB\-\-unconditional\-branches\fR] [\fB\-x\fR|\fB\-\-hash\-filenames\fR] \fIfiles\fR .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" برنامه \&\fBgcov\fR یک ابزار سنجش پوشش آزمون کد (Test Coverage) است. از آن همراه با \s-1GCC\s0 استفاده کنید تا برنامه‌های خود را تحلیل کرده و کدهای بهینه‌تر و سریع‌تری ایجاد نمایید و بخش‌های آزموده‌نشده برنامه را کشف کنید. می‌توانید از \&\fBgcov\fR به عنوان ابزار پروفایل‌سازی (Profiling) برای تعیین مؤثرترین بخش‌ها جهت بهینه‌سازی استفاده کنید. همچنین می‌توانید \&\fBgcov\fR را همراه با ابزار پروفایل‌سازی دیگر یعنی \fBgprof\fR به کار ببرید تا مشخص شود کدام قسمت‌های کد بیشترین زمان پردازشی را مصرف می‌کنند. .PP ابزارهای پروفایل‌سازی به شما در تحلیل کارایی کد کمک می‌کنند. با استفاده از یک ابزار پروفایل‌سازی مانند \fBgcov\fR یا \fBgprof\fR می‌توانید آمارهای اولیه‌ای از کارایی برنامه به دست آورید؛ از جمله: .IP "*" 4 هر خط از کد چند بار اجرا می‌شود .IP "*" 4 کدام خطوط کد واقعاً اجرا شده‌اند .IP "*" 4 هر بخش از کد چه مقدار زمان پردازشی مصرف می‌کند .PP هنگامی که این موارد را درباره نحوه اجرای کد کامپایل‌شده دانستید، می‌توانید تک‌تک ماژول‌ها را بررسی کنید تا ببینید کدام ماژول‌ها باید بهینه‌سازی شوند. \&\fBgcov\fR به شما در یافتن نقاط مناسب برای بهینه‌سازی کمک می‌کند. .PP توسعه‌دهندگان نرم‌افزار همچنین از سنجش پوشش آزمون همراه با مجموعه‌های آزمون (Testsuites) استفاده می‌کنند تا مطمئن شوند نرم‌افزار برای انتشار نهایی به اندازه کافی آماده است. مجموعه‌های آزمون بررسی می‌کنند که آیا برنامه طبق انتظار کار می‌کند یا خیر؛ برنامه سنجش پوشش نیز بررسی می‌کند چه مقدار از کد توسط مجموعه آزمون پوشش داده شده است. بدین ترتیب توسعه‌دهندگان می‌توانند مشخص کنند چه سناریوهای آزمایشی جدیدی باید به مجموعه آزمون افزوده شود تا آزمون بهتر و محصول نهایی باکیفیت‌تری تولید گردد. .PP اگر قصد استفاده از \&\fBgcov\fR را دارید، بهتر است کد خود را بدون بهینه‌سازی کامپایل کنید؛ زیرا بهینه‌سازی با ادغام چند خط کد در یک تابع، ممکن است اطلاعات مورد نیاز برای یافتن «نقاط داغ» (Hot Spots) که زمان زیادی مصرف می‌کنند را در اختیارتان قرار ندهد. همچنین از آنجا که \fBgcov\fR آمارها را بر اساس هر خط (در پایین‌ترین وضوح) جمع‌آوری می‌کند، بیشترین بازدهی را با سبک برنامه‌نویسی‌ای دارد که در هر خط فقط یک دستور قرار می‌گیرد. اگر از ماکروهای پیچیده‌ای استفاده کنید که به حلقه‌ها یا ساختارهای کنترلی دیگر گسترش می‌یابند، آمارها کارایی کمتری خواهند داشت و فقط برای خطی که فراخوانی ماکرو در آن رخ داده گزارش می‌شوند. اگر ماکروهای پیچیده شما مانند تابع رفتار می‌کنند، می‌توانید برای رفع این مشکل آن‌ها را با توابع درون‌خطی (Inline Functions) جایگزین کنید. .PP ابزار \&\fBgcov\fR یک فایل گزارش با نام \fI\fIsourcefile\fI.gcov\fR ایجاد می‌کند که نشان می‌دهد هر خط از فایل منبع \fI\fIsourcefile\fI.c\fR چند بار اجرا شده است. می‌توانید این فایل‌های گزارش را همراه با \fBgprof\fR برای تنظیم دقیق کارایی برنامه‌های خود به کار ببرید. \fBgprof\fR اطلاعات زمان‌بندی را ارائه می‌دهد که می‌توانید در کنار اطلاعات به‌دست‌آمده از \&\fBgcov\fR استفاده کنید. .PP ابزار \&\fBgcov\fR فقط روی کدهای کامپایل‌شده با \s-1GCC\s0 کار می‌کند و با هیچ مکانیزم پروفایل‌سازی یا سنجش پوشش دیگری سازگار نیست. .SH "گزینه‌ها (OPTIONS)" .IX Header "OPTIONS" .IP "\fB\-a\fR" 4 .IX Item "-a" .PD 0 .IP "\fB\-\-all\-blocks\fR" 4 .IX Item "--all-blocks" .PD شمارش اجرای هر بلوک پایه (Basic Block) را به صورت جداگانه ثبت می‌کند. به طور معمول gcov شمارش اجرا را فقط برای بلوک‌های اصلی هر خط نمایش می‌دهد. با این گزینه می‌توانید بررسی کنید که آیا بلوک‌هایی درون یک خط وجود دارند که اجرا نشده باشند یا خیر. .IP "\fB\-b\fR" 4 .IX Item "-b" .PD 0 .IP "\fB\-\-branch\-probabilities\fR" 4 .IX Item "--branch-probabilities" .PD تواتر شاخه‌ها (Branches) را در فایل خروجی و خلاصه شاخه‌ها را در خروجی استاندارد می‌نویسد. این گزینه به شما اجازه می‌دهد ببینید هر شاخه در برنامه چند بار انتخاب شده است. شاخه‌های نامشروط نشان داده نخواهند شد، مگر اینکه گزینه \fB\-u\fR داده شده باشد. .IP "\fB\-c\fR" 4 .IX Item "-c" .PD 0 .IP "\fB\-\-branch\-counts\fR" 4 .IX Item "--branch-counts" .PD تواتر شاخه‌ها را به جای درصد شاخه‌های طی‌شده، به صورت تعداد شاخه‌های طی‌شده می‌نویسد. .IP "\fB\-g\fR" 4 .IX Item "-g" .PD 0 .IP "\fB\-\-conditions\fR" 4 .IX Item "--conditions" .PD پوشش شرط‌ها را در فایل خروجی و خلاصه اطلاعات شرط‌ها را در خروجی استاندارد می‌نویسد. این گزینه به شما امکان می‌دهد بررسی کنید که آیا شرط‌های برنامه حداقل یک بار تأثیر مستقلی بر نتیجه عبارت بولی داشته‌اند یا خیر (پوشش شرط/تصمیم اصلاح‌شده یا MC/DC). این گزینه نیازمند کامپایل کد منبع با گزینه \fB\-fcondition\-coverage\fR است. .IP "\fB\-e\fR" 4 .IX Item "-e" .PD 0 .IP "\fB\-\-prime\-paths\fR" 4 .IX Item "--prime-paths" .PD پوشش مسیرها را در فایل خروجی و خلاصه اطلاعات مسیرها را در خروجی استاندارد می‌نویسد. این گزینه به شما اجازه می‌دهد ببینید چند مسیر اولیه (Prime Paths) حداقل یک بار طی شده‌اند. یک مسیر دنباله‌ای از بلوک‌های پایه است. یک مسیر ساده است اگر بلوک تکراری نداشته باشد (بدون حلقه) به جز احتمالاً بلوک اول و آخر، و مسیر اولیه است اگر مسیری ساده با حداکثر طول باشد. در خروجی عادی، این گزینه فقط تعداد مسیرهای پوشش‌داده‌شده را شامل می‌شود. برای اطلاعات دقیق‌تر درباره مسیرها می‌توانید از \&\fB\-\-prime\-paths\-lines\fR یا \fB\-\-prime\-paths\-source\fR استفاده کنید. با \&\fB\-\-json\-format\fR تمامی جزئیات مسیرها در خروجی گنجانده می‌شوند. این گزینه نیازمند کامپایل کد منبع با \fB\-fpath\-coverage\fR است. .IP "\fB\-\-prime\-paths\-lines [=\fR\fItype\fR\fB]\fR" 4 .IX Item "--prime-paths-lines [=type]" پوشش مسیر را در فایل خروجی و خلاصه اطلاعات مسیر را در خروجی استاندارد می‌نویسد. این گزینه نشان می‌دهد چه تعداد مسیر اولیه حداقل یک بار طی شده‌اند و گزارشی فشرده از مسیرهای پوشش‌داده‌شده یا پوشش‌داده‌نشده و نحوه پوشش آن‌ها ارائه می‌دهد. این حالت برای گزارش‌گیری خودکار و ردیابی پیشرفت مفید است. مقدار \fItype\fR می‌تواند حذف شود یا یکی از موارد زیر باشد: .RS 4 .IP "*" 4 \&\fIuncovered\fR \&\- شامل مسیرهای پوشش‌داده‌نشده (طی‌نشده). این مقدار پیش‌فرض است. .IP "*" 4 \&\fIcovered\fR \&\- شامل مسیرهای پوشش‌داده‌شده (طی‌شده). .IP "*" 4 \&\fIboth\fR \&\- شامل همه مسیرها. معادل استفاده همزمان از \fIcovered\fR و \fIuncovered\fR. .RE .RS 4 .Sp این نمونه‌ای از خروجی \fB\-\-prime\-paths\-lines\fR است: .Sp .Vb 4 \& paths covered 12 of 15 \& path 2 not covered: lines 8 8(false) 11(true) 11 13(true) 13(true) 14 17 \& path 3 not covered: lines 8 8(false) 11(true) 11 13(true) 13(false) 16 17 \& path 4 not covered: lines 8 8(false) 11(true) 11 13(false) 16 17 .Ve .Sp این بدان معناست که برای پوشش مسیر ۲ باید خطوط ۸، ۱۱، ۱۳، ۱۴ و ۱۷ را اجرا کنید، به طوری که ارزیابی تصمیم در خط ۸ برابر false و تصمیمات در خطوط ۱۱ و ۱۳ برابر \&\f(CW\*(C`false\*(C'\fR باشد. .RE .IP "\fB\-\-prime\-paths\-source [=\fR\fItype\fR\fB]\fR" 4 .IX Item "--prime-paths-source [=type]" پوشش مسیر را در فایل خروجی و خلاصه اطلاعات مسیر را در خروجی استاندارد می‌نویسد. این گزینه نشان می‌دهد چه تعداد مسیر اولیه حداقل یک بار طی شده‌اند و گزارشی دقیق از مسیرهای پوشش‌داده‌نشده و نحوه پوشش آن‌ها ارائه می‌دهد. این حالت برای درک مسیرها و تعامل میان بخش‌های برنامه مفید است. مقدار \fItype\fR می‌تواند حذف شود یا یکی از موارد زیر باشد: .RS 4 .IP "*" 4 \&\fIuncovered\fR \&\- شامل مسیرهای پوشش‌داده‌نشده (طی‌نشده). این مقدار پیش‌فرض است. .IP "*" 4 \&\fIcovered\fR \&\- شامل مسیرهای پوشش‌داده‌شده (طی‌شده). .IP "*" 4 \&\fIboth\fR \&\- شامل همه مسیرها. معادل استفاده همزمان از \fIcovered\fR و \fIuncovered\fR. .RE .RS 4 .Sp این نمونه‌ای از خروجی \fB\-\-prime\-paths\-source\fR است: .Sp .Vb 9 \& path 10 not covered: \& BB 3: 8: for (i = 0; i < 10; i++) \& BB 3: 9: total += i; \& BB 4: (false) 8: for (i = 0; i < 10; i++) \& BB 5: (true) 11: int v = total > 100 ? 1 : 2; \& BB 6: 11: int v = total > 100 ? 1 : 2; \& BB 8: (false) 13: if (total != 45 && v == 1) \& BB 11: 16: printf ("Success\en"); \& BB 12: 17: return 0; .Ve .Sp ستون اول (\s-1BB\s0) دنباله بلوک‌های پایه است (گزینه \fB\-w\fR را ببینید). ستون میانی (true/false) تصمیم اتخاذشده برای آن خط است. ستون سوم شماره خط و ستون چهارم خود خط کد است. این خطوط باید به همین ترتیب اجرا شوند تا مسیر ۱۰ پوشش داده شود. .RE .IP "\fB\-d\fR" 4 .IX Item "-d" .PD 0 .IP "\fB\-\-display\-progress\fR" 4 .IX Item "--display-progress" .PD نمایش میزان پیشرفت در خروجی استاندارد. .IP "\fB\-f\fR" 4 .IX Item "-f" .PD 0 .IP "\fB\-\-function\-summaries\fR" 4 .IX Item "--function-summaries" .PD چاپ خلاصه اطلاعات برای هر تابع علاوه بر خلاصه کلی سطح فایل. .IP "\fB\-\-include\fR \fIregex\fR" 4 .IX Item "--include regex" گنجاندن توابعی که با عبارت باقاعده \fIregex\fR تطابق دارند. این گزینه باعث می‌شود \&\fBgcov\fR فقط برای توابعی گزارش تهیه کند که با عبارت باقاعده گسترده \fIregex\fR همخوانی دارند. این فلگ می‌تواند با \&\fB\-\-exclude\fR ترکیب شود. اگر تابعی هم با include و هم با exclude همخوانی داشته باشد، آخرین مورد اعمال می‌شود. به طور پیش‌فرض \fBgcov\fR همه توابع را گزارش می‌کند، اما اگر \fB\-\-include\fR استفاده شود، فقط توابع منطبق گزارش خواهند شد. .IP "\fB\-\-exclude\fR \fIregex\fR" 4 .IX Item "--exclude regex" مستثنی کردن توابعی که با عبارت باقاعده \fIregex\fR تطابق دارند. این گزینه باعث می‌شود \&\fBgcov\fR از گزارش‌دهی درباره توابعی که با عبارت باقاعده گسترده \fIregex\fR همخوانی دارند صرف‌نظر کند. این فلگ می‌تواند با \&\fB\-\-include\fR ترکیب شود. اگر تابعی هم با include و هم با exclude همخوانی داشته باشد، آخرین مورد اعمال خواهد شد. به طور پیش‌فرض \fBgcov\fR همه توابع را گزارش می‌کند و در صورت استفاده از \fB\-\-exclude\fR توابع منطبق حذف می‌شوند. .IP "\fB\-h\fR" 4 .IX Item "-h" .PD 0 .IP "\fB\-\-help\fR" 4 .IX Item "--help" .PD نمایش راهنمای استفاده از \fBgcov\fR (در خروجی استاندارد) و خروج بدون انجام پردازش دیگر. .IP "\fB\-j\fR" 4 .IX Item "-j" .PD 0 .IP "\fB\-\-json\-format\fR" 4 .IX Item "--json-format" .PD تولید فایل gcov در قالب میانی \s-1JSON\s0 با قابلیت پارس آسان که برای تولید نیازی به دسترسی به کد منبع ندارد. فایل \s-1JSON\s0 با الگوریتم gzip فشرده شده و دارای پسوند \fI.gcov.json.gz\fR خواهد بود. .Sp ساختار این فایل \s-1JSON\s0 به صورت زیر است: .Sp .Vb 7 \& { \& "current_working_directory": "foo/bar", \& "data_file": "a.out", \& "format_version": "2", \& "gcc_version": "11.1.1 20210510" \& "files": ["$file"] \& } .Ve .Sp فیلدهای عنصر ریشه دارای معانی زیر هستند: .RS 4 .IP "*" 4 \&\fIcurrent_working_directory\fR: دایرکتوری کاری که واحد کامپایل در آن کامپایل شده است .IP "*" 4 \&\fIdata_file\fR: نام فایل داده (\s-1GCDA\s0) .IP "*" 4 \&\fIformat_version\fR: نسخه معنایی قالب داده .Sp تغییرات در نسخه \fI2\fR: .RS 4 .IP "*" 4 \&\fIcalls\fR: اطلاعات مربوط به فراخوانی توابع اضافه شده است .RE .RS 4 .RE .IP "*" 4 \&\fIgcc_version\fR: نسخه کامپایلر \s-1GCC\s0 .RE .RS 4 .Sp هر عنصر \fIfile\fR به شکل زیر است: .Sp .Vb 5 \& { \& "file": "a.c", \& "functions": ["$function"], \& "lines": ["$line"] \& } .Ve .Sp فیلدهای عنصر \fIfile\fR دارای معانی زیر هستند: .IP "*" 4 \&\fIfile_name\fR: نام فایل منبع .RE .RS 4 .Sp هر عنصر \fIfunction\fR به شکل زیر است: .Sp .Vb 11 \& { \& "blocks": 2, \& "blocks_executed": 2, \& "demangled_name": "foo", \& "end_column": 1, \& "end_line": 4, \& "execution_count": 1, \& "name": "foo", \& "start_column": 5, \& "start_line": 1 \& } .Ve .Sp فیلدهای عنصر \fIfunction\fR دارای معانی زیر هستند: .IP "*" 4 \&\fIblocks\fR: تعداد بلوک‌های موجود در تابع .IP "*" 4 \&\fIblocks_executed\fR: تعداد بلوک‌های اجراشده از تابع .IP "*" 4 \&\fIdemangled_name\fR: نام نام‌گشایی‌شده (Demangled) تابع .IP "*" 4 \&\fIend_column\fR: ستونی در فایل منبع که تابع در آن پایان می‌یابد .IP "*" 4 \&\fIend_line\fR: خطی در فایل منبع که تابع در آن پایان می‌یابد .IP "*" 4 \&\fIexecution_count\fR: تعداد دفعات اجرای تابع .IP "*" 4 \&\fIname\fR: نام تابع .IP "*" 4 \&\fIstart_column\fR: ستونی در فایل منبع که تابع از آنجا شروع می‌شود .IP "*" 4 \&\fIstart_line\fR: خطی در فایل منبع که تابع از آنجا شروع می‌شود .RE .RS 4 .Sp توجه داشته باشید که شماره خطوط و ستون‌ها از ۱ آغاز می‌شوند. در پیاده‌سازی کنونی، \fIstart_line\fR و \fIstart_column\fR شامل پارامترهای قالب (Template Parameters) و نوع بازگشتی ابتدایی نمی‌شوند، اما احتمالاً این مورد در آینده برطرف خواهد شد. .Sp هر عنصر \fIline\fR به شکل زیر است: .Sp .Vb 10 \& { \& "block_ids": ["$block_id"], \& "branches": ["$branch"], \& "calls": ["$call"], \& "count": 2, \& "conditions": ["$condition"], \& "line_number": 15, \& "unexecuted_block": false, \& "function_name": "foo", \& } .Ve .Sp شاخه‌ها و فراخوانی‌ها فقط با گزینه \fI\-b\fR حضور دارند. فیلدهای عنصر \fIline\fR دارای معانی زیر هستند: .IP "*" 4 \&\fIblock_ids\fR: شناسه‌های بلوک‌های پایه متعلق به این خط .IP "*" 4 \&\fIcount\fR: تعداد دفعات اجرای خط .IP "*" 4 \&\fIline_number\fR: شماره خط .IP "*" 4 \&\fIunexecuted_block\fR: پرچمی که نشان می‌دهد آیا خط حاوی بلوک اجرا‌نشده است یا خیر (همه دستورات خط اجرا نشده‌اند) .IP "*" 4 \&\fIfunction_name\fR: نام تابعی که این \fIline\fR متعلق به آن است (برای خطی با دستورات درون‌خطی ممکن است مقداردهی نشود) .RE .RS 4 .Sp هر عنصر \fIbranch\fR به شکل زیر است: .Sp .Vb 7 \& { \& "count": 11, \& "destination_block_id": 17, \& "fallthrough": true, \& "source_block_id": 13, \& "throw": false \& } .Ve .Sp فیلدهای عنصر \fIbranch\fR دارای معانی زیر هستند: .IP "*" 4 \&\fIcount\fR: تعداد دفعات اجرای شاخه .IP "*" 4 \&\fIfallthrough\fR: برابر true در صورتی که شاخه از نوع سرریز/عبور مستقیم (Fall-through) باشد .IP "*" 4 \&\fIthrow\fR: برابر true در صورتی که شاخه از نوع استثنا (Exceptional) باشد .IP "*" 4 \&\fIisource_block_id\fR: شناسه (\s-1ID\s0) بلوک پایه‌ای که این شاخه از آن سرچشمه می‌گیرد .IP "*" 4 \&\fIdestination_block_id\fR: شناسه (\s-1ID\s0) بلوک پایه‌ای که این شاخه به آن می‌پرد .RE .RS 4 .Sp هر عنصر \fIcall\fR به شکل زیر است: .Sp .Vb 5 \& { \& "destination_block_id": 1, \& "returned": 11, \& "source_block_id": 13 \& } .Ve .Sp فیلدهای عنصر \fIcall\fR دارای معانی زیر هستند: .IP "*" 4 \&\fIreturned\fR: تعداد دفعاتی که فراخوانی تابع با موفقیت برگشته است (تعداد فراخوانی‌ها برابر با \fIline::count\fR است) .IP "*" 4 \&\fIisource_block_id\fR: شناسه (\s-1ID\s0) بلوک پایه‌ای که این فراخوانی در آن رخ می‌دهد .IP "*" 4 \&\fIdestination_block_id\fR: شناسه (\s-1ID\s0) بلوک پایه‌ای که ادامه اجرای این فراخوانی پس از بازگشت در آن انجام می‌شود .RE .RS 4 .Sp هر عنصر \fIcondition\fR به شکل زیر است: .Sp .Vb 6 \& { \& "count": 4, \& "covered": 2, \& "not_covered_false": [], \& "not_covered_true": [0, 1], \& } .Ve .Sp فیلدهای عنصر \fIcondition\fR دارای معانی زیر هستند: .IP "*" 4 \&\fIcount\fR: تعداد نتایج شرط در این عبارت .IP "*" 4 \&\fIcovered\fR: تعداد نتایج شرط پوشش‌داده‌شده در این عبارت .IP "*" 4 \&\fInot_covered_true\fR: شناسه‌های ترتیبی (ایندکس‌ها) شروطی که در این عبارت به صورت true دیده نشده‌اند .IP "*" 4 \&\fInot_covered_false\fR: شناسه‌های ترتیبی (ایندکس‌ها) شروطی که در این عبارت به صورت false دیده نشده‌اند .RE .RS 4 .RE .IP "\fB\-H\fR" 4 .IX Item "-H" .PD 0 .IP "\fB\-\-human\-readable\fR" 4 .IX Item "--human-readable" .PD نوشتن آمار شمارش در قالب خوانا برای انسان (مانند 24.6k). .IP "\fB\-k\fR" 4 .IX Item "-k" .PD 0 .IP "\fB\-\-use\-colors\fR" 4 .IX Item "--use-colors" .PD استفاده از رنگ‌ها برای خطوطی از کد که پوشش صفر دارند. رنگ قرمز برای خطوط غیر‌استثنایی و رنگ فیروزه‌ای برای خطوط استثنایی به کار می‌رود. همین رنگ‌ها برای بلوک‌های پایه با گزینه \fB\-a\fR نیز استفاده می‌شوند. .IP "\fB\-l\fR" 4 .IX Item "-l" .PD 0 .IP "\fB\-\-long\-file\-names\fR" 4 .IX Item "--long-file-names" .PD ایجاد نام فایل طولانی برای فایل‌های منبع ضمیمه‌شده (Included). به عنوان مثال، اگر فایل هدر \fIx.h\fR حاوی کد باشد و در فایل \&\fIa.c\fR ضمیمه شده باشد، اجرای \fBgcov\fR روی فایل \fIa.c\fR یک فایل خروجی به نام \fIa.c##x.h.gcov\fR به جای \fIx.h.gcov\fR تولید می‌کند. این گزینه زمانی مفید است که \fIx.h\fR در چندین فایل منبع گنجانده شده باشد و بخواهید سهم هر یک را جداگانه بررسی کنید. اگر از گزینه \fB\-p\fR استفاده کنید، هر دو نام فایل ضمیمه‌کننده و ضمیمه‌شده به صورت مسیر کامل درج خواهند شد. .IP "\fB\-m\fR" 4 .IX Item "-m" .PD 0 .IP "\fB\-\-demangled\-names\fR" 4 .IX Item "--demangled-names" .PD نمایش نام‌های نام‌گشایی‌شده (Demangled) توابع در خروجی. حالت پیش‌فرض نمایش نام‌های درهم‌پیچیده (Mangled) توابع است. .IP "\fB\-M\fR" 4 .IX Item "-M" .PD 0 .IP "\fB\-\-filter\-on\-demangled\fR" 4 .IX Item "--filter-on-demangled" .PD باعث می‌شود \fB\-\-include\fR و \fB\-\-exclude\fR با نام‌های نام‌گشایی‌شده (Demangled) تطبیق داده شوند. این گزینه فقط بر تطبیق الگو تأثیر می‌گذارد و به معنای اعمال \&\fB\-\-demangled\-names\fR نیست، اما می‌توان آن را با خیال راحت همراه با آن استفاده کرد. .IP "\fB\-n\fR" 4 .IX Item "-n" .PD 0 .IP "\fB\-\-no\-output\fR" 4 .IX Item "--no-output" .PD عدم ایجاد فایل خروجی \fBgcov\fR. .IP "\fB\-o\fR \fIdirectory|file\fR" 4 .IX Item "-o directory|file" .PD 0 .IP "\fB\-\-object\-directory\fR \fIdirectory\fR" 4 .IX Item "--object-directory directory" .IP "\fB\-\-object\-file\fR \fIfile\fR" 4 .IX Item "--object-file file" .PD تعیین دایرکتوری حاوی فایل‌های داده gcov یا مسیر فایل آبجکت. فایل‌های داده \fI.gcno\fR و \&\fI.gcda\fR با استفاده از این گزینه جستجو می‌شوند. اگر یک دایرکتوری مشخص شود، فایل‌های داده در آن دایرکتوری قرار دارند و بر اساس نام فایل ورودی (بدون پسوند آن) نام‌گذاری می‌شوند. اگر یک فایل در اینجا مشخص شود، فایل‌های داده بر اساس همان فایل (بدون پسوند) نام‌گذاری خواهند شد. .IP "\fB\-p\fR" 4 .IX Item "-p" .PD 0 .IP "\fB\-\-preserve\-paths\fR" 4 .IX Item "--preserve-paths" .PD حفظ اطلاعات مسیر کامل در نام فایل‌های \&\fI.gcov\fR تولیدشده. بدون این گزینه فقط بخش نام فایل استفاده می‌شود. با این گزینه، تمام دایرکتوری‌ها استفاده می‌شوند به طوری که کاراکترهای \fB/\fR به \fB#\fR تبدیل شده، اجزای دایرکتوری \fI.\fR حذف شده و اجزای غیرقابل حذف \fI..\fR به \fB^\fR تغییر نام می‌یابند. این گزینه در مواردی که فایل‌های منبع در چندین دایرکتوری مختلف پراکنده‌اند مفید است. .IP "\fB\-q\fR" 4 .IX Item "-q" .PD 0 .IP "\fB\-\-use\-hotness\-colors\fR" 4 .IX Item "--use-hotness-colors" .PD تولید خروجی رنگی شبیه به perf برای خطوط داغ (پراستفاده). راهنمای مقیاس رنگ در ابتدای فایل خروجی چاپ می‌شود. .IP "\fB\-r\fR" 4 .IX Item "-r" .PD 0 .IP "\fB\-\-relative\-only\fR" 4 .IX Item "--relative-only" .PD فقط اطلاعات مربوط به فایل‌های منبعی که مسیر نسبی دارند (پس از حذف پیشوند منبع) را خروجی می‌دهد. مسیرهای مطلق معمولاً فایل‌های هدر سیستمی هستند و پوشش توابع درون‌خطی در آن‌ها معمولاً حائز اهمیت نیست. .IP "\fB\-s\fR \fIdirectory\fR" 4 .IX Item "-s directory" .PD 0 .IP "\fB\-\-source\-prefix\fR \fIdirectory\fR" 4 .IX Item "--source-prefix directory" .PD پیشوندی برای نام فایل‌های منبع که هنگام تولید فایل‌های خروجی پوشش آزمون حذف می‌شود. این گزینه هنگام ساخت برنامه در یک دایرکتوری جداگانه مفید است، زمانی که مایل نیستید مسیر دایرکتوری منبع در تعیین نام فایل‌های خروجی درج شود. توجه داشته باشید که این تشخیص پیشوند قبل از تعیین اینکه آیا فایل منبع مطلق است یا خیر اعمال می‌شود. .IP "\fB\-t\fR" 4 .IX Item "-t" .PD 0 .IP "\fB\-\-stdout\fR" 4 .IX Item "--stdout" .PD خروجی دادن به خروجی استاندارد به جای ذخیره در فایل‌های خروجی. .IP "\fB\-u\fR" 4 .IX Item "-u" .PD 0 .IP "\fB\-\-unconditional\-branches\fR" 4 .IX Item "--unconditional-branches" .PD هنگام نمایش احتمالات شاخه‌ها، شاخه‌های نامشروط را نیز شامل می‌شود. شاخه‌های نامشروط معمولاً اهمیتی ندارند. .IP "\fB\-v\fR" 4 .IX Item "-v" .PD 0 .IP "\fB\-\-version\fR" 4 .IX Item "--version" .PD نمایش شماره نسخه \fBgcov\fR (در خروجی استاندارد) و خروج بدون پردازش دیگر. .IP "\fB\-w\fR" 4 .IX Item "-w" .PD 0 .IP "\fB\-\-verbose\fR" 4 .IX Item "--verbose" .PD چاپ اطلاعات با جزئیات کامل پیرامون بلوک‌های پایه و یال‌ها (Arcs). .IP "\fB\-x\fR" 4 .IX Item "-x" .PD 0 .IP "\fB\-\-hash\-filenames\fR" 4 .IX Item "--hash-filenames" .PD هنگام استفاده از \fI\-\-preserve\-paths\fR، ابزار gcov از مسیر کامل فایل‌های منبع برای ساخت نام فایل خروجی استفاده می‌کند. این امر می‌تواند منجر به نام‌های طولانی شود که از محدودیت‌های سیستم‌فایل فراتر روند. این گزینه نام‌هایی به فرم \&\fI\fIsource-file\fI##\fImd5\fI.gcov\fR ایجاد می‌کند که در آن بخش \fIsource-file\fR قسمت انتهایی نام فایل و بخش \fImd5\fR از نام کامل دستکاری‌شده محاسبه می‌شود که در غیر این صورت استفاده می‌شد. این گزینه جایگزینی برای \fI\-\-preserve\-paths\fR در سیستم‌هایی با محدودیت طول نام فایل است. .PP دستور \&\fBgcov\fR باید در دایرکتوری جاری یکسانی با جایی که کامپایلر را فراخوانی کرده‌اید اجرا شود؛ در غیر این صورت قادر به یافتن فایل‌های منبع نخواهد بود. ابزار \fBgcov\fR فایل‌هایی به نام \&\fI\fImangledname\fI.gcov\fR در دایرکتوری جاری ایجاد می‌کند. این فایل‌ها حاوی اطلاعات پوشش فایل منبع متناظر خود هستند. برای هر فایل منبع (یا هدر) حاوی کد که برای تولید فایل‌های داده کامپایل شده است، یک فایل \fI.gcov\fR تولید می‌شود. بخش \fImangledname\fR از نام فایل خروجی معمولاً به سادگی نام فایل منبع است، اما در صورت استفاده از گزینه‌های \fB\-l\fR یا \fB\-p\fR می‌تواند ساختار پیچیده‌تری داشته باشد. برای جزئیات بیشتر به توضیحات آن گزینه‌ها مراجعه کنید. .PP اگر \fBgcov\fR را با چندین فایل ورودی اجرا کنید، اطلاعات هر فایل ورودی تجمیع می‌شود. به طور معمول آن را با همان لیست فایل‌هایی که در مرحله نهایی پیوند (Link) برنامه اجرایی استفاده کرده‌اید اجرا می‌کنید. .PP فایل‌های \fI.gcov\fR شامل فیلدهایی جداشده با \fB:\fR همراه با کد منبع برنامه هستند. قالب کلی به صورت زیر است: .PP .Vb 1 \& :: .Ve .PP در صورت درخواست از طریق گزینه‌های خط فرمان، اطلاعات بلوک تکمیلی ممکن است بعد از هر خط بیاید. مقدار \fIexecution_count\fR برای خطوطی که فاقد کد هستند به صورت \fB\-\fR نشان داده می‌شود. خطوط اجرا‌نشده به صورت \fB#####\fR یا \&\fB=====\fR علامت‌گذاری می‌شوند؛ بسته به اینکه آیا از مسیرهای غیراستثنایی قابل دسترسی هستند یا صرفاً از طریق مسیرهای استثنایی مانند مدیریت‌کننده‌های استثنای \*(C+ در دسترس‌اند. با گزینه \fB\-a\fR، بلوک‌های اجرا‌نشده بسته به اینکه از طریق مسیرهای غیر‌استثنایی یا استثنایی قابل دسترسی باشند، به صورت \fB$$$$$\fR یا \fB%%%%%\fR علامت‌گذاری می‌شوند. بلوک‌های پایه اجرا‌شده‌ای که دستوری با \fIexecution_count\fR صفر دارند با کاراکتر \fB*\fR خاتمه یافته و در صورت استفاده از گزینه \fB\-k\fR با رنگ ارغوانی مشخص می‌شوند. این قابلیت در زبان Ada پشتیبانی نمی‌شود. .PP توجه داشته باشید که \s-1GCC\s0 می‌تواند بدنه توابعی را که به آن‌ها نیازی نیست به طور کامل حذف کند \*(-- برای مثال اگر در همه جا درون‌خطی (Inlined) شده باشند. چنین توابعی با \fB\-\fR علامت‌گذاری می‌شوند که ممکن است گیج‌کننده باشد. از گزینه‌های \fB\-fkeep\-inline\-functions\fR و \fB\-fkeep\-static\-functions\fR استفاده کنید تا این توابع حفظ شوند و به gcov اجازه دهند مقدار \fIexecution_count\fR آن‌ها را به درستی نمایش دهد. .PP برخی از خطوط اطلاعاتی در ابتدای گزارش دارای \fIline_number\fR صفر هستند. این خطوط مقدماتی به فرم زیر می‌باشند: .PP .Vb 1 \& \-:0:: .Ve .PP ترتیب و تعداد این خطوط مقدماتی با پیشرفت توسعه \&\fBgcov\fR گسترش خواهد یافت \*(-- به ثابت ماندن آن‌ها تکیه نکنید. از \fItag\fR برای یافتن یک خط مقدماتی خاص استفاده کنید. .PP اطلاعات بلوک تکمیلی به صورت زیر است: .PP .Vb 1 \& .Ve .PP بخش \fIinformation\fR برای انسان خواناست، اما به گونه‌ای طراحی شده که برای پارس ماشینی نیز به اندازه کافی ساده باشد. .PP هنگام چاپ درصدها، مقادیر 0% و 100% فقط زمانی چاپ می‌شوند که مقادیر \fIدقیقاً\fR به ترتیب 0% و 100% باشند. سایر مقادیری که طبق معمول به 0% یا 100% گرد می‌شوند، در عوض به عنوان نزدیک‌ترین مقدار غیر‌مرزی چاپ می‌گردند. .PP هنگام استفاده از \fBgcov\fR، ابتدا باید برنامه خود را با گزینه ویژه \s-1GCC\s0 یعنی \fB\-\-coverage\fR کامپایل کنید. این گزینه به کامپایلر می‌گوید اطلاعات تکمیلی مورد نیاز gcov (اساساً گراف جریان برنامه) را تولید کند و کدهای اضافه‌ای را در فایل‌های آبجکت جهت تولید اطلاعات پروفایل‌سازی بیشتر بگنجاند. این فایل‌های اضافی در دایرکتوری محل قرارگیری فایل آبجکت قرار می‌گیرند. .PP اجرای برنامه باعث تولید خروجی پروفایل می‌شود. برای هر فایل منبع کامپایل‌شده با \fB\-fprofile\-arcs\fR، یک فایل همراه با پسوند \&\fI.gcda\fR در دایرکتوری فایل آبجکت قرار خواهد گرفت. .PP اکنون اجرای \fBgcov\fR با نام فایل‌های منبع برنامه به عنوان آرگومان، فهرستی از کد را به همراه تواتر اجرای هر خط تولید می‌کند. به عنوان مثال، اگر برنامه شما \fItmp.cpp\fR نام دارد، هنگام استفاده از امکانات پایه \fBgcov\fR چنین خروجی‌ای را مشاهده خواهید کرد: .PP .Vb 7 \& $ g++ \-\-coverage tmp.cpp \-c \& $ g++ \-\-coverage tmp.o \& $ a.out \& $ gcov tmp.cpp \-m \& File \*(Aqtmp.cpp\*(Aq \& Lines executed:92.86% of 14 \& Creating \*(Aqtmp.cpp.gcov\*(Aq .Ve .PP فایل \fItmp.cpp.gcov\fR حاوی خروجی \fBgcov\fR است. این یک نمونه از آن است: .PP .Vb 10 \& \-: 0:Source:tmp.cpp \& \-: 0:Working directory:/home/gcc/testcase \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& \-: 0:Programs:1 \& \-: 1:#include \& \-: 2: \& \-: 3:template \& \-: 4:class Foo \& \-: 5:{ \& \-: 6: public: \& 1*: 7: Foo(): b (1000) {} \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::Foo(): \& #####: 7: Foo(): b (1000) {} \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::Foo(): \& 1: 7: Foo(): b (1000) {} \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& 2*: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::inc(): \& #####: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::inc(): \& 2: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& \-: 9: \& \-: 10: private: \& \-: 11: int b; \& \-: 12:}; \& \-: 13: \& \-: 14:template class Foo; \& \-: 15:template class Foo; \& \-: 16: \& \-: 17:int \& 1: 18:main (void) \& \-: 19:{ \& \-: 20: int i, total; \& 1: 21: Foo counter; \& \-: 22: \& 1: 23: counter.inc(); \& 1: 24: counter.inc(); \& 1: 25: total = 0; \& \-: 26: \& 11: 27: for (i = 0; i < 10; i++) \& 10: 28: total += i; \& \-: 29: \& 1*: 30: int v = total > 100 ? 1 : 2; \& \-: 31: \& 1: 32: if (total != 45) \& #####: 33: printf ("Failure\en"); \& \-: 34: else \& 1: 35: printf ("Success\en"); \& 1: 36: return 0; \& \-: 37:} .Ve .PP توجه داشته باشید که خط ۷ در گزارش چندین بار نشان داده شده است. اولین رخداد، تعداد کل دفعات اجرای خط را نشان می‌دهد و دو رخداد بعدی متعلق به نمونه‌های سازنده کلاس Foo هستند. همان‌طور که می‌بینید، خط ۳۰ شامل برخی بلوک‌های پایه اجرا‌نشده است و بنابراین شمارش اجرا دارای علامت ستاره است. .PP هنگامی که از گزینه \fB\-a\fR استفاده می‌کنید، شمارش جداگانه بلوک‌ها را دریافت خواهید کرد و خروجی به شکل زیر خواهد بود: .PP .Vb 10 \& \-: 0:Source:tmp.cpp \& \-: 0:Working directory:/home/gcc/testcase \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& \-: 0:Programs:1 \& \-: 1:#include \& \-: 2: \& \-: 3:template \& \-: 4:class Foo \& \-: 5:{ \& \-: 6: public: \& 1*: 7: Foo(): b (1000) {} \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::Foo(): \& #####: 7: Foo(): b (1000) {} \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::Foo(): \& 1: 7: Foo(): b (1000) {} \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& 2*: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::inc(): \& #####: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::inc(): \& 2: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& \-: 9: \& \-: 10: private: \& \-: 11: int b; \& \-: 12:}; \& \-: 13: \& \-: 14:template class Foo; \& \-: 15:template class Foo; \& \-: 16: \& \-: 17:int \& 1: 18:main (void) \& \-: 19:{ \& \-: 20: int i, total; \& 1: 21: Foo counter; \& 1: 21\-block 0 \& \-: 22: \& 1: 23: counter.inc(); \& 1: 23\-block 0 \& 1: 24: counter.inc(); \& 1: 24\-block 0 \& 1: 25: total = 0; \& \-: 26: \& 11: 27: for (i = 0; i < 10; i++) \& 1: 27\-block 0 \& 11: 27\-block 1 \& 10: 28: total += i; \& 10: 28\-block 0 \& \-: 29: \& 1*: 30: int v = total > 100 ? 1 : 2; \& 1: 30\-block 0 \& %%%%%: 30\-block 1 \& 1: 30\-block 2 \& \-: 31: \& 1: 32: if (total != 45) \& 1: 32\-block 0 \& #####: 33: printf ("Failure\en"); \& %%%%%: 33\-block 0 \& \-: 34: else \& 1: 35: printf ("Success\en"); \& 1: 35\-block 0 \& 1: 36: return 0; \& 1: 36\-block 0 \& \-: 37:} .Ve .PP در این حالت، هر بلوک پایه فقط روی یک خط نشان داده می‌شود \*(-- آخرین خط بلوک. یک بلوک چندخطی فقط به شمارش اجرای همان خط آخر کمک می‌کند و سایر خطوط فاقد کد به نظر می‌رسند، مگر اینکه بلوک‌های قبلی در آن خطوط پایان یافته باشند. شمارش کل اجرای یک خط نشان داده می‌شود و خطوط بعدی شمارش اجرا برای بلوک‌های مجزایی را نشان می‌دهند که در آن خط پایان می‌یابند. در صورت استفاده از گزینه \&\fB\-b\fR، پس از هر بلوک، تعداد شاخه‌ها و فراخوانی‌های آن بلوک نمایش داده خواهد شد. .PP به دلیل نحوه سنجش فراخوانی‌ها توسط \s-1GCC\s0، ممکن است شمارش فراخوانی بعد از خطی بدون بلوک‌های مجزا نمایش داده شود. همان‌طور که می‌بینید، خط ۳۳ حاوی یک بلوک پایه است که اجرا نشده است. .PP هنگامی که از گزینه \fB\-b\fR استفاده می‌کنید، خروجی به صورت زیر خواهد بود: .PP .Vb 10 \& \-: 0:Source:tmp.cpp \& \-: 0:Working directory:/home/gcc/testcase \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& \-: 0:Programs:1 \& \-: 1:#include \& \-: 2: \& \-: 3:template \& \-: 4:class Foo \& \-: 5:{ \& \-: 6: public: \& 1*: 7: Foo(): b (1000) {} \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::Foo(): \& function Foo::Foo() called 0 returned 0% blocks executed 0% \& #####: 7: Foo(): b (1000) {} \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::Foo(): \& function Foo::Foo() called 1 returned 100% blocks executed 100% \& 1: 7: Foo(): b (1000) {} \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& 2*: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::inc(): \& function Foo::inc() called 0 returned 0% blocks executed 0% \& #####: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::inc(): \& function Foo::inc() called 2 returned 100% blocks executed 100% \& 2: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& \-: 9: \& \-: 10: private: \& \-: 11: int b; \& \-: 12:}; \& \-: 13: \& \-: 14:template class Foo; \& \-: 15:template class Foo; \& \-: 16: \& \-: 17:int \& function main called 1 returned 100% blocks executed 81% \& 1: 18:main (void) \& \-: 19:{ \& \-: 20: int i, total; \& 1: 21: Foo counter; \& call 0 returned 100% \& branch 1 taken 100% (fallthrough) \& branch 2 taken 0% (throw) \& \-: 22: \& 1: 23: counter.inc(); \& call 0 returned 100% \& branch 1 taken 100% (fallthrough) \& branch 2 taken 0% (throw) \& 1: 24: counter.inc(); \& call 0 returned 100% \& branch 1 taken 100% (fallthrough) \& branch 2 taken 0% (throw) \& 1: 25: total = 0; \& \-: 26: \& 11: 27: for (i = 0; i < 10; i++) \& branch 0 taken 91% (fallthrough) \& branch 1 taken 9% \& 10: 28: total += i; \& \-: 29: \& 1*: 30: int v = total > 100 ? 1 : 2; \& branch 0 taken 0% (fallthrough) \& branch 1 taken 100% \& \-: 31: \& 1: 32: if (total != 45) \& branch 0 taken 0% (fallthrough) \& branch 1 taken 100% \& #####: 33: printf ("Failure\en"); \& call 0 never executed \& branch 1 never executed \& branch 2 never executed \& \-: 34: else \& 1: 35: printf ("Success\en"); \& call 0 returned 100% \& branch 1 taken 100% (fallthrough) \& branch 2 taken 0% (throw) \& 1: 36: return 0; \& \-: 37:} .Ve .PP برای هر تابع، خطی چاپ می‌شود که نشان می‌دهد تابع چند بار فراخوانی شده، چند بار بازگشته و چند درصد از بلوک‌های تابع اجرا شده‌اند. .PP برای هر بلوک پایه، خطی پس از آخرین خط بلوک پایه چاپ می‌شود که شاخه یا فراخوانی خاتمه‌دهنده آن بلوک را توصیف می‌کند. اگر چندین بلوک پایه در یک خط منبع پایان یابند، ممکن است چندین شاخه و فراخوانی برای آن خط لیست شوند. در این حالت به هر یک از شاخه‌ها و فراخوانی‌ها شماره‌ای اختصاص داده می‌شود. راه ساده‌ای برای نگاشت این شاخه‌ها و فراخوانی‌ها به ساختارهای کد منبع وجود ندارد، اما به طور کلی کوچک‌ترین شماره شاخه یا فراخوانی متناظر با چپ‌ترین ساختار در خط منبع خواهد بود. .PP برای یک شاخه، در صورتی که حداقل یک بار اجرا شده باشد، درصدی نشان‌دهنده نسبت تعداد دفعات طی شدن شاخه به تعداد کل دفعات اجرای آن چاپ خواهد شد؛ در غیر این صورت پیام \*(L"never executed\*(R" چاپ می‌شود. .PP برای یک فراخوانی، در صورتی که حداقل یک بار اجرا شده باشد، درصدی نشان‌دهنده نسبت تعداد دفعات بازگشت فراخوانی به تعداد دفعات اجرای آن چاپ می‌شود. این مقدار معمولاً 100% است، اما ممکن است برای توابعی که \f(CW\*(C`exit\*(C'\fR یا \f(CW\*(C`longjmp\*(C'\fR را فراخوانی می‌کنند کمتر باشد؛ زیرا ممکن است با هر بار فراخوانی بازنگردند. .PP هنگامی که از گزینه \fB\-g\fR استفاده می‌کنید، خروجی شما شبیه به این خواهد بود: .PP .Vb 10 \& $ gcov \-t \-m \-g tmp \& \-: 0:Source:tmp.cpp \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& \-: 1:#include \& \-: 2: \& \-: 3:int \& 1: 4:main (void) \& \-: 5:{ \& \-: 6: int i, total; \& 1: 7: total = 0; \& \-: 8: \& 11: 9: for (i = 0; i < 10; i++) \& condition outcomes covered 2/2 \& 10: 10: total += i; \& \-: 11: \& 1*: 12: int v = total > 100 ? 1 : 2; \& condition outcomes covered 1/2 \& condition 0 not covered (true) \& \-: 13: \& 1*: 14: if (total != 45 && v == 1) \& condition outcomes covered 1/4 \& condition 0 not covered (true) \& condition 1 not covered (true false) \& #####: 15: printf ("Failure\en"); \& \-: 16: else \& 1: 17: printf ("Success\en"); \& 1: 18: return 0; \& \-: 19:} .Ve .PP برای هر شرط، تعداد نتایج طی‌شده و کل نتایج چاپ می‌شود و در صورت وجود نتایج پوشش‌داده‌نشده، خطی برای هر شرط نمایش داده می‌شود که نتیجه پوشش‌داده‌نشده را درون پرانتز نشان می‌دهد. شرط‌ها با ایندکس خود شناخته می‌شوند \*(-- ایندکس 0 چپ‌ترین شرط است. در عبارت \f(CW\*(C`a || (b && c)\*(C'\fR، متغیر \fIa\fR شرط 0، \fIb\fR شرط 1 و \fIc\fR شرط 2 است. .PP یک نتیجه زمانی پوشش‌داده‌شده تلقی می‌شود که تأثیر مستقلی بر تصمیم داشته باشد؛ این مفهوم به عنوان پوشش MC/DC پوششی (Masking Modified Condition/Decision Coverage) نیز شناخته می‌شود. در این مثال، تصمیم به true ارزیابی شده و \fIa\fR ارزیابی می‌شود اما پوشش داده نمی‌شود. دلیل این امر آن است که \fIa\fR نمی‌تواند به طور مستقل بر تصمیم تأثیر بگذارد \*(-- برای تغییر نتیجه تصمیم، هر دو مقدار \fIa\fR و \fIb\fR باید تغییر کنند. .PP .Vb 10 \& $ gcov \-t \-m \-g tmp \& \-: 0:Source:tmp.c \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& \-: 1:#include \& \-: 2: \& 1: 3:int main() \& \-: 4:{ \& 1: 5: int a = 1; \& 1: 6: int b = 0; \& \-: 7: \& 1: 8: if (a && b) \& condition outcomes covered 1/4 \& condition 0 not covered (true false) \& condition 1 not covered (true) \& #####: 9: printf ("Success!\en"); \& \-: 10: else \& 1: 11: printf ("Failure!\en"); \& \-: 12:} .Ve .PP هنگامی که با \fB\-\-coverage \-fpath\-coverage\fR کامپایل کرده و از گزینه \fB\-e\fR استفاده می‌کنید، خروجی شما به شکل زیر خواهد بود: .PP .Vb 10 \& $ gcov \-t \-e tmp \& \-: 0:Source:tmp.cpp \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& \-: 1:#include \& \-: 2: \& paths covered 4 of 15 \& 1: 3:int main () \& \-: 4:{ \& \-: 5: int i, total; \& 1: 6: total = 0; \& \-: 7: \& 11: 8: for (i = 0; i < 10; i++) \& 10: 9: total += i; \& \-: 10: \& 1*: 11: int v = total > 100 ? 1 : 2; \& \-: 12: \& 1*: 13: if (total != 45 && v == 1) \& #####: 14: printf ("Failure\en"); \& \-: 15: else \& 1: 16: printf ("Success\en"); \& 1: 17: return 0; \& \-: 18:} .Ve .PP این خروجی برای درک تقریبی بخش‌های فاقد پوشش و آزمایش نحوه تغییر پوشش با ورودی‌های گوناگون مفید است. گزینه \&\fB\-\-prime\-paths\-source\fR ابزار مفیدی برای درک مسیرهاست. .PP .Vb 10 \& $ gcov \-t \-\-prime\-paths\-source tmp \& \-: 0:Source:tmp.cpp \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& \-: 1:#include \& \-: 2: \& paths covered 4 of 15 \& path 1: \& BB 2: 3:int main () \& BB 2: 6: total = 0; \& BB 2: 8: for (i = 0; i < 10; i++) \& BB 4: (false) 8: for (i = 0; i < 10; i++) \& BB 5: (true) 11: int v = total > 100 ? 1 : 2; \& BB 6: 11: int v = total > 100 ? 1 : 2; \& BB 8: (true) 13: if (total != 45 && v == 1) \& BB 9: (true) 13: if (total != 45 && v == 1) \& BB 10: 14: printf ("Failure\en"); \& BB 12: 17: return 0; .Ve .PP در این حالت، gcov جزئیات مسیرهای غایب را چاپ می‌کند. ستون اول توالی بلوک‌های پایه (\s-1BB\s0) را فهرست می‌کند. ستون دوم تصمیم اتخاذشده در آن خط (در صورت وجود) است. ستون‌های نهایی شماره خط و خود خط کد هستند. این اطلاعات برای درک مسیرها، به ویژه مسیرهایی که پوشش آن‌ها دشوار یا حتی غیرقابل دسترسی هستند، مفید است. اگر یک خط بخشی از چندین بلوک پایه باشد، ممکن است تکرار شود؛ مانند حلقه \f(CW\*(C`for\*(C'\fR. این حالت برای انسان طراحی شده و در درک اینکه چه کدی در حین آزمون یا با ورودی‌های داده‌شده اجرا می‌شود عالی است. این خروجی بسیار مفصل است و برای تمرکز روی توابع خاص می‌توان آن را با فیلترهای \&\fB\-\-include\fR و \fB\-\-exclude\fR ترکیب کرد. .PP خروجی فشرده‌تری با \fB\-\-prime\-paths\-lines\fR در دسترس است که به شکل زیر خواهد بود: .PP .Vb 10 \& \-: 0:Source:tmp.cpp \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& \-: 1:#include \& \-: 2: \& paths covered 4 of 15 \& path 1 not covered: lines 8 8(false) 11(true) 11 13(true) 13(true) 14 17 \& path 2 not covered: lines 8 8(false) 11(true) 11 13(true) 13(false) 16 17 \& path 3 not covered: lines 8 8(false) 11(true) 11 13(false) 16 17 \& path 4 not covered: lines 8 8(false) 11(false) 11 13(true) 13(true) 14 17 \& path 5 not covered: lines 8 8(false) 11(false) 11 13(true) 13(false) 16 17 \& path 6 not covered: lines 8 8(false) 11(false) 11 13(false) 16 17 \& path 8 not covered: lines 9 8(false) 11(true) 11 13(true) 13(true) 14 17 \& path 9 not covered: lines 9 8(false) 11(true) 11 13(true) 13(false) 16 17 \& path 10 not covered: lines 9 8(false) 11(true) 11 13(false) 16 17 \& path 11 not covered: lines 9 8(false) 11(false) 11 13(true) 13(true) 14 17 \& path 12 not covered: lines 9 8(false) 11(false) 11 13(true) 13(false) 16 17 \& 1: 3:int main () \& \-: 4:{ \&.Ve .PP در این حالت، هر مسیر غایب با استفاده از خطوط و تصمیمات، مشابه \fB\-\-prime\-paths\-source\fR اما در یک خط چاپ می‌شود. این حالت دید کلی مناسبی از مسیرها و ردیابی چگونگی آزمایش کد توسط آزمون‌ها و ورودی‌های مختلف فراهم می‌سازد. .PP شمارش‌های اجرا انباشته‌شونده (Cumulative) هستند. اگر برنامه نمونه دوباره بدون حذف فایل \fI.gcda\fR اجرا شود، تعداد دفعات اجرای هر خط در منبع به نتایج اجرای قبلی اضافه خواهد شد. این ویژگی از چندین جهت کاربردی است؛ به عنوان مثال می‌تواند برای تجمیع داده‌ها در چندین بار اجرای برنامه به عنوان بخشی از یک مجموعه اعتبارسنجی آزمون، یا ارائه اطلاعات دقیق‌تر بلندمدت در طول اجرای مکرر برنامه استفاده شود. .PP داده‌های موجود در فایل‌های \fI.gcda\fR درست پیش از خروج برنامه ذخیره می‌شوند. برای هر فایل منبع کامپایل‌شده با \fB\-fprofile\-arcs\fR، کد پروفایل‌سازی ابتدا تلاش می‌کند یک فایل موجود \fI.gcda\fR را بخواند؛ اگر فایل با فایل اجرایی مطابقت نداشته باشد (تعداد شمارش بلوک‌های پایه متفاوت باشد) محتویات فایل را نادیده می‌گیرد. سپس شمارش‌های اجرای جدید را اضافه کرده و در نهایت داده‌ها را در فایل می‌نویسد. .PP می‌توانید با استفاده از \fB\-\-include\fR و \fB\-\-exclude\fR گزارش را به زیرمجموعه‌ای از توابع محدود کنید. این کار هنگام ترکیب با \&\fB\-\-stdout\fR برای درک رفتار و پوشش یک تابع خاص بسیار مفید است؛ به این صورت که آزمایشی را اجرا کرده، خروجی \fBgcov\fR را مشاهده می‌کنید، ورودی دیگری را آزمایش کرده و دوباره \fBgcov\fR را اجرا می‌نمایید. .PP .Vb 10 \& $ gcov \-m \-\-stdout \-\-include inc tmp \& \-: 0:Source:tmp.cpp \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& 2*: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::inc(): \& #####: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& Foo::inc(): \& 2: 8: void inc () { b++; } \& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- .Ve .PP ابزار \&\fBgcov\fR به طور پیش‌فرض با نام‌های درهم‌پیچیده (Mangled) تطبیق داده می‌شود که می‌توانید آن را با فلگ \fB\-M\fR کنترل کنید. توجه داشته باشید که تطبیق الگو و گزارش‌دهی مستقل از هم هستند؛ بنابراین می‌توانید در حین چاپ نام‌های نام‌گشایی‌شده، تطبیق را بر اساس نام‌های درهم‌پیچیده انجام دهید و برعکس. برای گزارش نمونه \f(CW\*(C`int\*(C'\fR از کلاس \f(CW\*(C`Foo\*(C'\fR با تطبیق روی نام‌های درهم‌پیچیده و نام‌گشایی‌شده: .PP .Vb 7 \& $ gcov \-t \-m \-M tmp \-\-include \*(AqFoo\*(Aq \& \-: 0:Source:tmp.cpp \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& 1: 7: Foo(): b (1000) {} \& 2: 8: void inc () { b++; } \& \& \& \& $ gcov \-t \-m tmp \-\-include \*(AqFooIi\*(Aq \& \-: 0:Source:tmp.cpp \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& 1: 7: Foo(): b (1000) {} \& 2: 8: void inc () { b++; } .Ve .PP آرگومان‌های \fB\-\-include\fR و \fB\-\-exclude\fR عبارات باقاعده گسترده هستند (مانند \fBgrep \-E\fR)، بنابراین الگوی \&\f(CW\*(C`in.?\*(C'\fR با هر دوی \f(CW\*(C`inc\*(C'\fR و \f(CW\*(C`main\*(C'\fR تطبیق دارد. اگر با \&\fB\-M\fR استفاده شود، تمام نمونه‌های \f(CW\*(C`int\*(C'\fR از \f(CW\*(C`Foo\*(C'\fR نیز مطابقت خواهند داشت. گزینه‌های \fB\-\-include\fR و \fB\-\-exclude\fR را می‌توان چندین بار استفاده کرد و اگر نامی با چندین فیلتر مطابقت داشته باشد، آخرین مورد اولویت خواهد داشت. به عنوان مثال، برای مطابقت با \&\f(CW\*(C`main\*(C'\fR و نمونه \f(CW\*(C`int\*(C'\fR از \f(CW\*(C`inc\*(C'\fR، در حالی که از سازنده \f(CW\*(C`Foo\*(C'\fR صرف‌نظر می‌شود: .PP .Vb 10 \& $ gcov \-t \-m \-M \-\-include in \-\-exclude Foo \-\-include \*(Aq::inc\*(Aq tmp \& \-: 0:Source:tmp.cpp \& \-: 0:Graph:tmp.gcno \& \-: 0:Data:tmp.gcda \& \-: 0:Runs:1 \& 2: 8: void inc () { b++; } \& 1: 18:main (void) \& \-: 19:{ \& \-: 20: int i, total; \& 1: 21: Foo counter; \& \-: 22: \& 1: 23: counter.inc(); \& 1: 24: counter.inc(); \& 1: 25: total = 0; \& \-: 26: \& 11: 27: for (i = 0; i < 10; i++) \& 10: 28: total += i; \& \-: 29: \& 1*: 30: int v = total > 100 ? 1 : 2; \& \-: 31: \& 1: 32: if (total != 45) \& #####: 33: printf ("Failure\en"); \& \-: 34: else \& 1: 35: printf ("Success\en"); \& 1: 36: return 0; .Ve .SS "استفاده از \fBgcov\fP با بهینه‌سازی \s-1GCC\s0" .IX Subsection "Using gcov with GCC Optimization" اگر قصد دارید از \fBgcov\fR برای کمک به بهینه‌سازی کد خود استفاده کنید، ابتدا باید برنامه را با گزینه ویژه \s-1GCC\s0 یعنی \&\fB\-\-coverage\fR کامپایل نمایید. جدا از آن می‌توانید از هر گزینه دیگر \s-1GCC\s0 استفاده کنید؛ اما اگر می‌خواهید اثبات کنید که تک‌تک خطوط برنامه اجرا شده‌اند، نباید همزمان با بهینه‌سازی کامپایل کنید. در برخی سیستم‌ها بهینه‌ساز می‌تواند برخی خطوط ساده کد را با ترکیب آن‌ها با سایر خطوط حذف کند. به عنوان مثال کدی مانند این: .PP .Vb 4 \& if (a != b) \& c = 1; \& else \& c = 0; .Ve .PP روی برخی ماشین‌ها می‌تواند به یک دستورالعمل اسمبلی کامپایل شود. در این حالت هیچ راهی برای \fBgcov\fR وجود ندارد تا شمارش‌های اجرای جداگانه‌ای برای هر خط محاسبه کند؛ زیرا برای هر خط کد مجزایی وجود ندارد. بنابراین در صورت کامپایل برنامه با بهینه‌سازی، خروجی \fBgcov\fR به این صورت خواهد بود: .PP .Vb 4 \& 100: 12:if (a != b) \& 100: 13: c = 1; \& 100: 14:else \& 100: 15: c = 0; .Ve .PP خروجی نشان می‌دهد این بلوک کد که توسط بهینه‌ساز ترکیب شده، ۱۰۰ بار اجرا شده است. از یک جهت این نتیجه درست است؛ چرا که تنها یک دستورالعمل نماینده همه این چهار خط بوده است. با این حال خروجی نشان نمی‌دهد که چند بار نتیجه 0 و چند بار نتیجه 1 بوده است. .PP توابع درون‌خطی‌شونده (Inlineable Functions) می‌توانند شمارش خطوط غیرمنتظره‌ای ایجاد کنند. شمارش خطوط برای کد منبع تابع درون‌خطی نمایش داده می‌شود، اما آنچه نشان داده می‌شود به این بستگی دارد که تابع در کجا درون‌خطی شده یا اصلاً درون‌خطی نشده است. .PP اگر تابع درون‌خطی نشود، کامپایلر باید یک نسخه مستقل (Out-of-line) از تابع را در هر فایل آبجکتی که به آن نیاز دارد صادر کند. اگر هر دوی \&\fIfileA.o\fR و \fIfileB.o\fR شامل بدنه مستقل تابع درون‌خطی باشند، هر دو نیز شامل شمارش پوشش برای آن تابع خواهند بود. هنگامی که \fIfileA.o\fR و \fIfileB.o\fR به هم پیوند داده می‌شوند، پیونددهنده (Linker) در بسیاری از سیستم‌ها یکی از آن بدنه‌های مستقل را برای تمام فراخوانی‌های آن تابع انتخاب کرده و دیگری را حذف یا نادیده می‌گیرد. متأسفانه شمارنده‌های پوشش را برای بدنه استفاده‌نشده تابع حذف نمی‌کند. بنابراین هنگام اندازه‌گیری، همه کاربردهای آن تابع به جز یکی، شمارش صفر را نشان خواهند داد. .PP اگر تابع در چندین مکان درون‌خطی شود، ممکن است ساختار بلوک در هر مکان یکسان نباشد. به عنوان مثال یک شرط ممکن است در برخی موارد در زمان کامپایل قابل محاسبه باشد. از آنجا که پوشش تمام استفاده‌های تابع درون‌خطی برای همان خطوط منبع یکسان نشان داده می‌شود، خود شمارش خطوط ممکن است ناسازگار به نظر برسد. .PP برنامه‌هایی با اجرای طولانی می‌توانند از امکانات \f(CW\*(C`_\|_gcov_reset\*(C'\fR و \f(CW\*(C`_\|_gcov_dump\*(C'\fR برای محدود کردن جمع‌آوری پروفایل به بخش مورد نظر از برنامه استفاده کنند. فراخوانی \f(CW\*(C`_\|_gcov_reset(void)\*(C'\fR تمام شمارنده‌های پروفایل زمان اجرا را صفر می‌کند و فراخوانی \f(CW\*(C`_\|_gcov_dump(void)\*(C'\fR باعث می‌شود اطلاعات پروفایل جمع‌آوری‌شده تا آن لحظه در فایل‌های خروجی \fI.gcda\fR ذخیره شود. برنامه‌های مجهز به ابزار دقیق از یک تخریب‌کننده ایستا (Static Destructor) با اولویت ۹۹ برای فراخوانی تابع \f(CW\*(C`_\|_gcov_dump\*(C'\fR استفاده می‌کنند. بنابراین \f(CW\*(C`_\|_gcov_dump\*(C'\fR پس از همه تخریب‌کننده‌های ایستای تعریف‌شده توسط کاربر و همچنین مدیریت‌کننده‌های ثبت‌شده با \f(CW\*(C`atexit\*(C'\fR اجرا می‌شود. .PP اگر یک فایل اجرایی یک شیء مشترک پویا را از طریق قابلیت dlopen بارگذاری کند، گزینه \&\fB\-Wl,\-\-dynamic\-list\-data\fR برای تخلیه تمام داده‌های پروفایل مورد نیاز است. .PP کتابخانه زمان اجرای پروفایل‌سازی خطاهای مختلف مربوط به دستکاری پروفایل و ذخیره‌سازی آن را گزارش می‌دهد. در صورت استفاده از متغیر محیطی، خطاها در خروجی خطای استاندارد یا فایل \fB\s-1GCOV_ERROR_FILE\s0\fR چاپ می‌شوند. برای پایان دادن فوری برنامه پس از وقوع خطا، متغیر محیطی \fB\s-1GCOV_EXIT_AT_ERROR\s0\fR را تنظیم کنید. این کار به کاربران کمک می‌کند تا تداخل پروفایل‌ها را که منجر به پروفایل گمراه‌کننده می‌شود پیدا کنند. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" \&\fIgpl\fR\|(7), \fIgfdl\fR\|(7), \fIfsf\-funding\fR\|(7), \fIgcc\fR\|(1) و مدخل Info برای \fIgcc\fR. .SH "حق نشر (COPYRIGHT)" .IX Header "COPYRIGHT" حق نشر \(co 1996\-2025 Free Software Foundation, Inc. .PP مجوز کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخه ۱.۳ یا هر نسخه بعدی منتشر شده توسط بنیاد نرم‌افزار آزاد اعطا می‌شود؛ بدون بخش‌های تغییرناپذیر، بدون متون روی جلد و بدون متون پشت جلد. نسخه‌ای از این مجوز در صفحه راهنمای \fIgfdl\fR\|(7) گنجانده شده است. .PP (الف) متن روی جلد \s-1FSF\s0 عبارت است از: .PP .Vb 1 \& A GNU Manual .Ve .PP (ب) متن پشت جلد \s-1FSF\s0 عبارت است از: .PP .Vb 3 \& You have freedom to copy and modify this GNU Manual, like GNU \& software. Copies published by the Free Software Foundation raise \& funds for GNU development. .Ve