.\" 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)" gcov \- ابزار سنجش پوشش کد .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 یک برنامهٔ سنجش پوشش آزمون است. از آن به همراه \s-1GCC\s0 برای تحلیل برنامه‌های خود استفاده کنید تا بتوانید کدهایی بهینه‌تر و با اجرای سریع‌تر تولید کرده و بخش‌های آزمایش‌نشدهٔ برنامهٔ خود را کشف کنید. می‌توانید از \&\fBgcov\fR به عنوان ابزاری برای پروفایلینگ استفاده کنید تا مشخص شود تلاش‌های شما برای بهینه‌سازی، بیشترین تأثیر را در کدام قسمت‌های کد خواهد داشت. همچنین می‌توانید از \&\fBgcov\fR به همراه ابزار دیگر پروفایلینگ، یعنی \fBgprof\fR، استفاده کنید تا ارزیابی کنید کدام بخش‌های کد بیشترین مقدار زمان پردازشی را مصرف می‌کنند. .PP ابزارهای پروفایلینگ به شما در تحلیل کارایی کدتان کمک می‌کنند. با استفاده از یک ابزار پروفایلینگ مانند \fBgcov\fR یا \fBgprof\fR، می‌توانید برخی از آمارهای پایه‌ای کارایی را به دست آورید؛ از جمله: .IP "*" 4 هر خط از کد چند بار اجرا می‌شود .IP "*" 4 کدام خطوط از کد واقعاً اجرا می‌شوند .IP "*" 4 هر بخش از کد چه مقدار زمان پردازشی مصرف می‌کند .PP هنگامی که این موارد را دربارهٔ نحوهٔ کارکرد کد کامپایل‌شدهٔ خود دانستید، می‌توانید هر ماژول را بررسی کنید تا ببینید کدام ماژول‌ها باید بهینه‌سازی شوند. \&\fBgcov\fR به شما کمک می‌کند تعیین کنید کار بهینه‌سازی را از کجا شروع کنید. .PP توسعه‌دهندگان نرم‌افزار همچنین از سنجش پوشش آزمون در کنار مجموعه‌های آزمون (testsuiteها) استفاده می‌کنند تا مطمئن شوند نرم‌افزار واقعاً کیفیت لازم برای انتشار را دارد. مجموعه‌های آزمون می‌توانند بررسی کنند که برنامه طبق انتظار عمل می‌کند یا خیر؛ یک برنامهٔ سنجش پوشش آزمون بررسی می‌کند چه مقدار از برنامه توسط این مجموعه آزمون اجرا و سنجیده شده است. سپس توسعه‌دهندگان می‌توانند تعیین کنند چه نوع آزمون‌های جدیدی باید به مجموعه‌های آزمون اضافه شوند تا هم آزمون بهتری انجام شود و هم محصول نهایی باکیفیت‌تری تولید گردد. .PP اگر قصد استفاده از \&\fBgcov\fR را دارید، باید کد خود را بدون بهینه‌سازی کامپایل کنید؛ زیرا بهینه‌سازی ممکن است از طریق ترکیب چندین خط کد در یک تابع، اطلاعات مورد نیاز شما را برای یافتن «نقاط بحرانی» (hot spots)، جایی که کد بخش زیادی از زمان پردازش را می‌گیرد، کاهش دهد. به همین ترتیب، از آنجا که \fBgcov\fR آمارها را بر اساس خط (در پایین‌ترین وضوح) جمع‌آوری می‌کند، با سبک برنامه‌نویسی‌ای که در هر خط تنها یک دستور قرار می‌دهد بهترین بازدهی را دارد. اگر از ماکروهای پیچیده‌ای استفاده می‌کنید که به حلقه‌ها یا دیگر ساختارهای کنترلی بسط می‌یابند، آمارها کاربرد کمتری خواهند داشت\-\-\-آن‌ها تنها خطی را گزارش می‌کنند که فراخوانی ماکرو در آن قرار دارد. اگر ماکروهای پیچیدهٔ شما رفتاری مشابه توابع دارند، می‌توانید برای حل این مشکل آن‌ها را با توابع درون‌خطی (inline) جایگزین کنید. .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) را می‌نویسد. به‌طور معمول \&\fBgcov\fR تعداد دفعات اجرا را تنها برای بلوک‌های اصلی یک خط خروجی می‌دهد. با این گزینه می‌توانید مشخص کنید که آیا بلوک‌های درون یک خط واحد اجرا می‌شوند یا خیر. .IP "\fB\-b\fR" 4 .IX Item "-b" .PD 0 .IP "\fB\-\-branch\-probabilities\fR" 4 .IX Item "--branch-probabilities" .PD بسامد (فرکانس) شاخه‌ها را در فایل خروجی، و اطلاعات خلاصهٔ شاخه‌ها را در خروجی استاندارد می‌نویسد. این گزینه به شما امکان می‌دهد ببینید هر شاخه در برنامه شما چند بار طی شده است. شاخه‌های بدون شرط نمایش داده نخواهند شد، مگر اینکه گزینهٔ \&\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 پوشش شرط‌ها (condition coverage) را در فایل خروجی، و اطلاعات خلاصهٔ شرط را در خروجی استاندارد می‌نویسد. این گزینه به شما اجازه می‌دهد ببینید آیا شرط‌ها در برنامه شما دست‌کم یک بار تأثیر مستقلی بر نتیجهٔ عبارت بولی داشته‌اند یا خیر (پوشش شرط/تصمیم اصلاح‌شده یا 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 پوشش مسیر (path coverage) را در فایل خروجی، و اطلاعات خلاصهٔ مسیر را در خروجی استاندارد می‌نویسد. این گزینه امکان مشاهدهٔ تعداد مسیرهای اولیه‌ای (prime paths) که دست‌کم یک بار طی شده‌اند را فراهم می‌کند. یک مسیر دنباله‌ای از بلوک‌های پایه‌ای است. یک مسیر در صورتی ساده است که هیچ بلوک تکراری (هیچ حلقه‌ای) جز احتمالاً بلوک اول و آخر نداشته باشد، و در صورتی اولیه (prime) است که یک مسیر ساده با بیشینه طول باشد. برای خروجی عادی، این گزینه تنها تعداد مسیرهای پوشش‌داده‌شده را شامل می‌شود. برای اطلاعات دقیق‌تر دربارهٔ مسیرها می‌توانید از \&\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 شامل پارامترهای قالب و نوع بازگشتی ابتدایی نمی‌شوند، اما احتمالاً این مورد در آینده برطرف خواهد شد. .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 به آن تعلق دارد (برای خطی با دستورات میان‌خطی [inlined] ممکن است تنظیم نشده باشد) .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: در صورتی که شاخه یک شاخه گذر مستقیم (fall through) باشد، true است .IP "*" 4 \&\fIthrow\fR: در صورتی که شاخه یک شاخه استثنا (exceptional) باشد، true است .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 برای خطوط پرتکرار (hot lines). راهنمای طیف رنگی در ابتدای فایل خروجی چاپ می‌شود. .IP "\fB\-r\fR" 4 .IX Item "-r" .PD 0 .IP "\fB\-\-relative\-only\fR" 4 .IX Item "--relative-only" .PD فقط اطلاعات مربوط به فایل‌های منبعی با مسیر نسبی را در خروجی درج کن (پس از حذف پیشوند منبع). مسیرهای مطلق معمولاً فایل‌های سرآیند سیستمی هستند و پوشش توابع درون‌خطی (inline) در آن‌ها معمولاً اهمیتی ندارد. .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 را با چندین فایل ورودی فراخوانی کنید، مشارکت‌های حاصل از هر فایل ورودی جمع می‌شوند. معمولاً آن را با همان فهرست فایل‌هایی فراخوانی می‌کنید که در پیوند نهایی برنامهٔ اجرایی‌تان استفاده شده‌اند..PP فایل‌های \fI.gcov\fR شامل فیلدهایی هستند که با \fB:\fR از یکدیگر جدا شده‌اند و در کنار کد منبع برنامه قرار دارند. قالب به این صورت است: .PP .Vb 1 \& :: .Ve .PP در صورت درخواست از طریق گزینه‌های خط فرمان، ممکن است اطلاعات تکمیلیِ بلوک پس از هر خط قرار گیرد. مقدار \fIexecution_count\fR برای خطوط فاقد کد، \fB\-\fR است. خطوط اجرا‌نشده با \fB#####\fR یا \&\fB=====\fR مشخص می‌شوند؛ بسته به اینکه آیا به ترتیب از طریق مسیرهای غیر‌استثنایی قابل دسترسی هستند یا صرفاً از طریق مسیرهای استثنایی مانند مدیریت‌کننده‌های استثنای (exception handlers) \*(C+. با تعیین گزینهٔ \fB\-a\fR، بلوک‌های اجرا‌نشده بسته به اینکه از طریق مسیرهای غیراستثنایی یا استثنایی در دسترس باشند، به ترتیب با \fB$$$$$\fR یا \fB%%%%%\fR علامت‌گذاری می‌شوند. بلوک‌های پایه‌ای اجرا‌شده‌ای که دارای عبارتی با \fIexecution_count\fR صفر باشند، با نویسهٔ \fB*\fR پایان می‌یابند و با گزینهٔ \fB\-k\fR با رنگ سرخابی (magenta) نمایش داده می‌شوند. این قابلیت در 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 برابر صفر دارند. این خطوط مقدماتی (preamble) به این شکل هستند: .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 (اساساً یک گراف جریان از برنامه) را ایجاد کند و همچنین کد اضافه‌ای را در فایل‌های شیء (object files) برای تولید داده‌های تحلیل کارایی (profiling) اضافیِ مورد نیاز 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 برای ابزارگذاری (instrumentation) فراخوانی‌ها استفاده می‌کند، ممکن است تعداد فراخوانی پس از خطی بدون هیچ بلوک مجزایی نشان داده شود. همان‌طور که مشاهده می‌کنید، خط 33 حاوی یک بلوک پایه است که اجرا نشده است. .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 برای یک انشعاب، اگر حداقل یک بار اجرا شده باشد، درصدی چاپ خواهد شد که نشان‌دهندهٔ تعداد دفعات پیموده شدن (taken) انشعاب تقسیم بر تعداد دفعات اجرای انشعاب است. در غیر این صورت، پیام \*(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 یک برآمد در صورتی پوشش‌داده‌شده در نظر گرفته می‌شود که تأثیر مستقلی بر تصمیم‌گیری داشته باشد، که به عنوان masking \s-1MC/DC\s0 (پوشش شرط/تصمیم اصلاح‌شده) نیز شناخته می‌شود. در این مثال، تصمیم به 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. این حالت برای خواندن توسط انسان طراحی شده و جهت درک این نکته که چه کدی تحت آزمون یا برای ورودی‌های داده‌شده اجرا شده است مناسب می‌باشد. این خروجی بسیار پرجزئیات (verbose) است، و برای تمرکز روی توابع خاص می‌توان آن را با فیلترهای \&\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 تعداد دفعات اجرا تجمعی است. اگر برنامهٔ نمونه مجدداً بدون حذف فایل \fI.gcda\fR اجرا شود، تعداد دفعات اجرای هر سطر در کد منبع به نتایج اجرا(های) قبلی افزوده خواهد شد. این قابلیت از چندین جهت می‌تواند سودمند باشد. برای نمونه، می‌تواند برای تجمیع داده‌ها در طول چندین بار اجرای برنامه به عنوان بخشی از یک مجموعه‌آزمون اعتبارسنجی استفاده شود، یا اطلاعات دقیق‌تر و درازمدت‌تری را در طول شمار زیادی از اجراهای برنامه ارائه دهد. .PP داده‌های درون فایل‌های \fI.gcda\fR بلافاصله پیش از خروج برنامه ذخیره می‌شوند. برای هر فایل منبع که با \fB\-fprofile\-arcs\fR کامپایل شده باشد، کد ارزیابی کارایی (profiling) ابتدا تلاش می‌کند تا یک فایل \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 کنترل کنید. توجه داشته باشید که تطبیق و گزارش‌دهی مستقل هستند، بنابراین می‌توانید بر اساس نام‌های mangled تطبیق را انجام دهید در حالی که نام‌های demangled را چاپ می‌کنید، و برعکس. برای گزارش‌گیری از نمونه‌سازی (instantiation) نوع \f(CW\*(C`int\*(C'\fR از \f(CW\*(C`Foo\*(C'\fR با تطبیق روی نام‌های mangled و demangled: .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، در حالی که سازندهٔ (constructor) \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) می‌توانند باعث ایجاد شمارش‌های غیرمنتظره برای خطوط شوند. شمارش خطوط برای کد منبع تابع درون‌خطی‌پذیر نمایش داده می‌شود، اما آنچه نشان داده می‌شود به این بستگی دارد که تابع در کجا درون‌خطی (inline) شده باشد، یا اینکه اصلاً درون‌خطی نشده باشد. .PP اگر تابع درون‌خطی نشود، کامپایلر باید یک نسخهٔ برون‌خط (out-of-line) از تابع را در هر فایل شیء (object file) که به آن نیاز دارد صادر کند. اگر هر دو فایل \&\fIfileA.o\fR و \fIfileB.o\fR شامل بدنهٔ برون‌خط یک تابع درون‌خطی‌پذیر خاص باشند، هر دو نیز شامل شمارش پوشش کد برای آن تابع خواهند بود. هنگامی که \fIfileA.o\fR و \fIfileB.o\fR به یکدیگر پیوند داده می‌شوند، پیونددهنده در بسیاری از سیستم‌ها یکی از آن بدنه‌های برون‌خط را برای تمام فراخوانی‌های آن تابع انتخاب کرده و دیگری را حذف یا نادیده می‌گیرد. متأسفانه، شمارنده‌های پوشش مربوط به بدنهٔ استفاده‌نشدهٔ تابع حذف نخواهند شد. از این رو هنگام ابزار دقیق‌سازی، به جز یکی، تمام موارد استفاده از آن تابع شمارش صفر را نشان خواهند داد. .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" Copyright (c) 1996\-2025 Free Software Foundation, Inc. .PP مجوز کپی، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد \s-1GNU\s0»، نسخهٔ 1.3 یا هر نسخهٔ متأخرتر منتشرشده توسط بنیاد نرم‌افزارهای آزاد اعطا می‌شود؛ با بخش‌های تغییرناپذیرِ \*(L"\s-1GNU\s0 General Public License\*(R" و \*(L"Funding Free Software\*(R"، متن‌های روی جلد (a) (پایین را ببینید)، و متن‌های پشت جلد (b) (پایین را ببینید). یک نسخه از این مجوز در صفحهٔ راهنمای \fIgfdl\fR\|(7) قرار دارد. .PP (a) متن روی جلد \s-1FSF\s0 عبارت است از: .PP .Vb 1 \& A GNU Manual .Ve .PP (b) متن پشت جلد \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