.\" 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 یک ابزار پوشش آزمون (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) استفاده می‌کنند تا مطمئن شوند نرم‌افزار واقعاً برای انتشار به اندازه کافی خوب است. مجموعه‌های آزمون می‌توانند بررسی کنند که برنامه طبق انتظار کار می‌کند؛ ابزار پوشش کد نیز بررسی می‌کند چه مقدار از برنامه توسط مجموعه آزمون پوشش داده شده است. سپس توسعه‌دهندگان می‌توانند تشخیص دهند که چه مواردی از آزمون (test cases) باید به مجموعه‌های آزمون اضافه شود تا هم آزمون دقیق‌تری انجام گیرد و هم محصول نهایی بهتری تولید شود. .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 path) حداقل یک بار طی شده‌اند. یک مسیر، دنباله‌ای از بلوک‌های پایه است. یک مسیر در صورتی ساده است که هیچ بلوک تکراری (بدون حلقه) نداشته باشد، به جز احتمالاً بلوک اول و آخر؛ و در صورتی اول (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 مطابقت داشته باشد، آخرین 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 مطابقت داشته باشد، آخرین 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: دایرکتوری کاری که واحد ترجمه (compilation unit) در آن کامپایل شده است .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) و نوع بازگشتی ابتدایی نمی‌شوند، اما به احتمال زیاد این مورد در آینده اصلاح خواهد شد. .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 استفاده از رنگ‌ها برای خطوط کدی که پوشش صفر دارند. از رنگ قرمز برای خطوط غیر‌استثنایی (non-exceptional) و از فیروزه‌ای برای خطوط استثنایی استفاده می‌شود. همین رنگ‌ها برای بلوک‌های پایه همراه با گزینهٔ \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، یا نام مسیر شیء (object). فایل‌های دادهٔ \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 پیشوندی برای نام فایل‌های منبع جهت حذف شدن هنگام تولید فایل‌های خروجی پوشش. این گزینه هنگام ساخت (build) در یک دایرکتوری جداگانه مفید است، یعنی زمانی که نمی‌خواهید مسیر دایرکتوری منبع در تعیین نام فایل‌های خروجی لحاظ شود. توجه داشته باشید که این تشخیص پیشوند پیش از بررسی این که آیا فایل منبع مطلق است یا نه اعمال می‌شود. .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 است. خطوط اجرا نشده بسته به اینکه آیا به ترتیب از طریق مسیرهای غیراستثنایی یا فقط مسیرهای استثنایی مانند گرداننده‌های استثنای \*(C+ قابل دسترسی هستند، با \fB#####\fR یا \&\fB=====\fR علامت‌گذاری می‌شوند. با تعیین گزینهٔ \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 با مقدار صفر هستند. این خطوط مقدماتی به شکل زیر هستند: .PP .Vb 1 \& \-:0:: .Ve .PP با پیشرفت توسعهٔ \&\fBgcov\fR، ترتیب و تعداد این خطوط مقدماتی افزایش خواهد یافت \-\-\- به بدون تغییر ماندن آن‌ها تکیه نکنید. از \fItag\fR برای یافتن یک خط مقدماتی خاص استفاده کنید. .PP اطلاعات تکمیلی بلوک به این شکل است: .PP .Vb 1 \& .Ve .PP بخش \fIinformation\fR برای انسان خوانا است، اما به‌گونه‌ای طراحی شده که برای تجزیه توسط ماشین (machine parsing) نیز به اندازهٔ کافی ساده باشد. .PP هنگام چاپ درصدها، 0% و 100% تنها زمانی چاپ می‌شوند که مقادیر به ترتیب \fIدقیقاً\fR 0% و 100% باشند. سایر مقادیری که به‌طور معمول به 0% یا 100% گرد می‌شوند، در عوض به‌عنوان نزدیک‌ترین مقدار غیرمرزی چاپ می‌شوند. .PP هنگام استفاده از \fBgcov\fR، ابتدا باید برنامهٔ خود را با گزینهٔ ویژهٔ \s-1GCC\s0 یعنی \fB\-\-coverage\fR کامپایل کنید. این کار به کامپایلر اعلام می‌کند تا اطلاعات اضافی مورد نیاز gcov (اساساً یک گراف جریان از برنامه) را تولید کند و همچنین کدهای تکمیلی را برای تولید اطلاعات پروفایلینگ بیشتری که gcov به آن‌ها نیاز دارد، در فایل‌های شیء (object files) قرار دهد. این فایل‌های اضافی در دایرکتوری‌ای که فایل شیء در آن قرار دارد، ذخیره می‌شوند. .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 فراخوانی‌ها را مجهز (instrument) می‌کند، تعداد فراخوانی ممکن است پس از خطی بدون هیچ بلوک مجزایی نشان داده شود. همان‌طور که مشاهده می‌کنید، خط 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 برای یک انشعاب، اگر حداقل یک بار اجرا شده باشد، درصدی چاپ خواهد شد که نشان‌دهندهٔ تعداد دفعات طی‌شدن انشعاب تقسیم بر تعداد دفعات اجرای آن است. در غیر این صورت، پیام \*(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 یک برآمد زمانی پوشش‌داده‌شده محسوب می‌شود که اثر مستقلی روی تصمیم بگذارد، که با نام ماسک‌کردن \s-1MC/DC\s0 (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 شمارش‌های اجرا تجمعی هستند. اگر برنامهٔ نمونه بدون حذف فایل \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 کنترل کنید. توجه داشته باشید که تطبیق دادن و گزارش‌دهی از یکدیگر مستقل هستند؛ بنابراین می‌توانید ضمن چاپ نام‌های ساده‌شده (demangled)، روی نام‌های درهم‌ریخته تطبیق انجام دهید، و برعکس. برای گزارش‌دهی دربارهٔ نمونه‌سازی \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) می‌توانند منجر به شمارش‌های خط غیرمنتظره‌ای شوند. شمارش خطوط برای کد منبع تابع درون‌خطی‌پذیر نمایش داده می‌شود، اما آنچه نمایش داده می‌شود بستگی به این دارد که تابع در کجا درون‌خطی شده است یا اینکه اصلاً درون‌خطی نشده باشد. .PP اگر تابع درون‌خطی نشود، کامپایلر باید یک نسخهٔ برون‌خطی (out of line) از تابع را در هر فایل شیئی که به آن نیاز دارد تولید کند. اگر \&\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 ذخیره شود. برنامه‌های مجهز‌شده از یک تخریب‌کنندهٔ ایستا (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 Free Documentation License)، نسخهٔ ۱.۳ یا هر نسخهٔ متأخر دیگری که توسط بنیاد نرم‌افزار آزاد (Free Software Foundation) منتشر شده است، با بخش‌های تغییرناپذیر \*(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