.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" 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 .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . 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 .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "GCOV 1" .TH GCOV 1 2026-08-10 gcc-16.2.1 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) است. از آن در هماهنگی با GCC برای تحلیل برنامه‌هایتان استفاده کنید تا بتوانید کدهایی کارآمدتر با اجرای سریع‌تر بنویسید و بخش‌های آزموده‌نشده برنامه خود را بیابید. می‌توانید از \&\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 را دارید، باید کد خود را بدون بهینه‌سازی (optimization) کامپایل کنید؛ زیرا بهینه‌سازی از طریق ادغام برخی خطوط کد در یک تابع، ممکن است اطلاعات کافی را که برای یافتن «نقاط داغ» (hot spots) \(em بخش‌هایی از کد که زمان زیادی از پردازنده را می‌گیرند \(em نیاز دارید در اختیارتان نگذارد. به همین ترتیب، از آنجا که \fBgcov\fR آمارها را بر پایه خط (در پایین‌ترین وضوح) جمع‌آوری می‌کند، با سبک برنامه‌نویسی‌ای که در هر خط تنها یک دستور قرار می‌دهد، بهترین عملکرد را دارد. اگر از ماکروهای پیچیده‌ای استفاده کنید که به حلقه‌ها یا ساختارهای کنترلی دیگر گسترش می‌یابند، آمارها کمتر مفید خواهند بود؛ چرا که آن‌ها تنها وضعیت خطی را گزارش می‌کنند که فراخوانی ماکرو در آن رخ داده است. چنانچه ماکروهای پیچیده شما رفتاری شبیه به توابع دارند، می‌توانید برای حل این مشکل، آن‌ها را با توابع inline جایگزین کنید. .PP دستور \&\fBgcov\fR یک فایل گزارش لاگ به نام \fIsourcefile.gcov\fR می‌سازد که مشخص می‌کند هر خط از یک فایل مبدأ مانند \fIsourcefile.c\fR چند بار اجرا شده است. می‌توانید از این فایل‌های لاگ به همراه \fBgprof\fR برای تنظیم دقیق کارایی برنامه‌های خود بهره ببرید. ابزار \fBgprof\fR اطلاعات زمان‌بندی را در اختیارتان می‌گذارد که می‌توانید آن را در کنار داده‌های دریافتی از \&\fBgcov\fR استفاده کنید. .PP دستور \&\fBgcov\fR تنها روی کدهایی کار می‌کند که با GCC کامپایل شده باشند. این ابزار با هیچ‌یک از سازوکارهای دیگر پروفایلینگ یا پوشش آزمون سازگار نیست..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 تکرار شاخه‌ها (branch frequencies) را در فایل خروجی بنویس و اطلاعات خلاصهٔ شاخه را در خروجی استاندارد چاپ کن. این گزینه به شما امکان می‌دهد ببینید هر شاخه در برنامه شما چند بار طی شده است. شاخه‌های بدون شرط نمایش داده نخواهند شد، مگر اینکه گزینهٔ \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 ستون نخست (BB) دنبالهٔ بلوک‌های پایه‌ای است (به \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 را در یک قالب میانی JSON با پردازش آسان خروجی بده که برای تولید نیازی به کد منبع ندارد. فایل JSON با الگوریتم فشرده‌سازی gzip فشرده می‌شود و فایل‌ها دارای پسوند \fI.gcov.json.gz\fR خواهند بود. .Sp ساختار JSON به صورت زیر است: .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: نام فایل داده (GCDA) .IP * 4 \&\fIformat_version\fR: نگارش معنایی قالب .Sp تغییرات در نگارش \fI2\fR: .RS 4 .IP * 4 \&\fIcalls\fR: اطلاعات مربوط به فراخوانی‌های تابع افزوده شده است .RE .RS 4 .RE .IP * 4 \&\fIgcc_version\fR: نگارش کامپایلر GCC .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: نام سرهم‌بندی‌زدایی‌شده تابع .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: مقدار true هنگامی که شاخه از نوع سرریز (fall through) باشد .IP * 4 \&\fIthrow\fR: مقدار true هنگامی که شاخه از نوع استثنا (exceptional) باشد .IP * 4 \&\fIisource_block_id\fR: شناسه بلوک پایه‌ای که این شاخه در آن رخ می‌دهد .IP * 4 \&\fIdestination_block_id\fR: شناسه بلوک پایه‌ای که این شاخه به آن می‌پرد .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: شناسه بلوک پایه‌ای که این فراخوانی در آن رخ می‌دهد .IP * 4 \&\fIdestination_block_id\fR: شناسه بلوک پایه‌ای که این فراخوانی پس از بازگشت در آن ادامه می‌یابد .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 نام‌های فایلی طولانی برای فایل‌های مبدأ گنجانده‌شده ایجاد می‌کند. برای نمونه، اگر فایل سرایند \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 برای خطوط داغ و پرتکرار. راهنمای مقیاس رنگ‌ها در ابتدای فایل خروجی چاپ می‌شود. .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 چاپ اطلاعات تفصیلی مربوط به بلوک‌های پایه‌ای (basic blocks) و یال‌ها (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 از نام مسیر کامل فایل‌های مبدأ برای ایجاد نام فایل خروجی استفاده می‌کند. این کار می‌تواند منجر به ایجاد نام‌های طولانی شود که از محدودیت‌های سیستم‌فایل فراتر می‌روند. این گزینه نام‌هایی به شکل \&\fIsource\-file##md5.gcov\fR ایجاد می‌کند، که در آن بخش \fIsource\-file\fR همان نام پایانی فایل است و مؤلفه \fImd5\fR از نام کامل دستکاری‌شده‌ای که در غیر این صورت به کار می‌رفت محاسبه می‌شود. این گزینه در سیستم‌هایی با محدودیت در طول نام سیستم‌فایل، جایگزینی برای \fI\-\-preserve\-paths\fR است. .PP \&\fBgcov\fR باید در همان دایرکتوری جاری اجرا شود که کامپایلر در آن فراخوانی شده بود. در غیر این صورت قادر به مکان‌یابی فایل‌های مبدأ نخواهد بود. \fBgcov\fR فایل‌هایی موسوم به \&\fImangledname.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 به رنگ ارغوانی نمایش داده می‌شوند. این قابلیت در Ada پشتیبانی نمی‌شود. .PP توجه داشته باشید که GCC می‌تواند بدنه توابعی را که به آن‌ها نیازی نیست به‌طور کامل حذف کند \-\- برای نمونه توابعی که در تمام نقاط درون‌خطی (inline) شده‌اند. چنین توابعی با علامت \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، باید ابتدا برنامه خود را با گزینه ویژه کامپایلر GCC یعنی \fB\-\-coverage\fR کامپایل کنید. این گزینه به کامپایلر اعلام می‌کند که اطلاعات تکمیلی مورد نیاز gcov (اساساً یک نمودار جریان برنامه یا flow graph) را تولید کند و همچنین کدهای اضافی لازم را جهت گردآوری داده‌های پروفایلینگ در فایل‌های شیء بگنجاند. این فایل‌های الحاقی در دایرکتوری محل قرارگیری فایل شیء ذخیره می‌شوند..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 به دلیل نحوهٔ ابزارگذاری (instrumentation) فراخوانی‌ها در GCC، ممکن است شمارش فراخوانی پس از سطری نمایش داده شود که هیچ بلوک مجزایی ندارد. همان‌طور که می‌بینید، سطر ۳۳ شامل یک بلوک پایه است که اجرا نشده است. .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 برای هر بلوک پایه (basic block)، خطی پس از آخرین خط آن بلوک چاپ می‌شود که شاخه یا فراخوانیِ پایان‌بخش آن بلوک را توصیف می‌کند. اگر چندین بلوک پایه در یک خط مبدأ به پایان برسند، ممکن است چندین شاخه و فراخوانی برای آن تک‌خط مبدأ فهرست شود. در این حالت، به هر یک از شاخه‌ها و فراخوانی‌ها یک شماره اختصاص داده می‌شود. راه ساده‌ای برای نگاشت معکوس این شاخه‌ها و فراخوانی‌ها به ساختارهای کد مبدأ وجود ندارد. با این حال، به‌طور کلی، شاخه یا فراخوانی با کمترین شماره، متناظر با چپ‌ترین ساختار در خط مبدأ خواهد بود. .PP برای یک شاخه، اگر حداقل یک بار اجرا شده باشد، درصدی چاپ می‌شود که بیانگر تعداد دفعات طی شدن شاخه تقسیم بر تعداد دفعات اجرای آن شاخه است. در غیر این صورت، پیام «never executed» چاپ می‌شود. .PP برای یک فراخوانی، اگر حداقل یک بار اجرا شده باشد، درصدی چاپ می‌شود که نشان‌دهندهٔ تعداد دفعات بازگشت فراخوانی تقسیم بر تعداد دفعات اجرای آن فراخوانی است. این مقدار معمولاً ۱۰۰٪ خواهد بود، اما ممکن است برای توابعی که \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 برای هر شرط، تعداد نتایج رخ‌داده و کل نتایج چاپ می‌شود، و در صورت وجود نتایج پوشش‌داده‌نشده، برای هر شرط خطی چاپ خواهد شد که نتیجهٔ پوشش‌داده‌نشده را در پرانتز نشان می‌دهد. شرط‌ها بر اساس اندیس خود مشخص می‌شوند \-\- اندیس ۰ چپ‌ترین شرط است. در \f(CW\*(C`a || (b && c)\*(C'\fR، \fIa\fR شرط ۰، \fIb\fR شرط ۱، و \fIc\fR شرط ۲ است. .PP یک نتیجه زمانی پوشش‌داده‌شده در نظر گرفته می‌شود که اثر مستقلی بر تصمیم داشته باشد؛ که به آن پوشش پنهان‌ساز MC/DC (یا 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 جزئیات مربوط به مسیرهای ازدست‌رفته را چاپ می‌کند. ستون نخست، توالی بلوک‌های پایه (BB) را فهرست می‌کند. ستون دوم تصمیمی است که باید در آن خط اتخاذ شود (اگر تصمیمی وجود داشته باشد). ستون‌های پایانی، شمارهٔ خط و خود خط کد هستند. این ویژگی برای درک مسیرها، به‌ویژه آن‌هایی که پوشش‌دادنشان دشوار یا حتی دست‌نیافتنی است، مفید می‌باشد. اگر یک خط بخشی از چندین بلوک پایه باشد، ممکن است خطوط تکرار شوند؛ برای نمونه حلقهٔ \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، کد پروفایل‌سازی ابتدا تلاش می‌کند یک فایل \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، با نام‌های mangled تطبیق دهید و برعکس. برای گزارش‌دهی روی نمونه‌سازی \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، در حالی که سازندهٔ \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 با بهینه‌سازی GCC (Using \fBgcov\fP with GCC Optimization)" .IX Subsection "Using gcov with GCC Optimization" اگر قصد دارید از \fBgcov\fR برای کمک به بهینه‌سازی کد خود استفاده کنید، ابتدا باید برنامهٔ خود را با گزینهٔ ویژهٔ GCC یعنی \&\fB\-\-coverage\fR کامپایل کنید. به‌جز آن، می‌توانید از هر گزینهٔ دیگر GCC نیز استفاده کنید؛ اما اگر می‌خواهید اثبات کنید که تک‌تک خطوط برنامهٔ شما اجرا شده‌اند، نباید هم‌زمان با بهینه‌سازی کامپایل کنید. در برخی ماشین‌ها، بهینه‌ساز می‌تواند برخی از خطوط سادهٔ کد را با ترکیب آن‌ها با سایر خطوط حذف کند. برای مثال، کدی مانند این: .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) از تابع را در هر فایل شیء (object file) که به آن نیاز دارد تولید کند. اگر \&\fIfileA.o\fR و \fIfileB.o\fR هر دو شامل بدنهٔ برون‌خطی یک تابع درون‌خطی‌شدنی خاص باشند، هر دو نیز شامل شمارنده‌های پوشش آن تابع خواهند بود. هنگامی که \fIfileA.o\fR و \fIfileB.o\fR با یکدیگر پیوند داده می‌شوند، پیونددهنده (linker) در بسیاری از سیستم‌ها یکی از آن بدنه‌های برون‌خطی را برای تمام فراخوانی‌های آن تابع انتخاب کرده و دیگری را حذف یا نادیده می‌گیرد. متأسفانه، شمارنده‌های پوشش برای بدنهٔ استفاده‌نشدهٔ تابع حذف نخواهند شد. بنابراین در حالت سنجش‌گذاری‌شده (instrumented)، تمام موارد استفاده از آن تابع به جز یکی، شمارش صفر را نشان خواهند داد. .PP اگر تابع در چندین مکان درون‌خطی شود، ممکن است ساختار بلوک در هر مکان یکسان نباشد. برای نمونه، ممکن است یک شرط در برخی موارد در زمان کامپایل قابل محاسبه باشد. از آنجا که پوشش تمام استفاده‌های تابع درون‌خطی برای همان خطوط مبدأ یکسان نشان داده می‌شود، ممکن است شمارش خطوط به‌خودی‌خود متناقض به نظر برسد. .PP برنامه‌های با مدت اجرای طولانی (Long\-running) می‌توانند از امکانات \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 اگر یک فایل اجرایی یک شیء اشتراکی پویا (dynamic shared object) را از طریق قابلیت dlopen بارگیری کند، گزینهٔ \&\fB\-Wl,\-\-dynamic\-list\-data\fR برای تخلیهٔ تمام داده‌های پروفایل لازم است. .PP کتابخانهٔ زمان اجرای پروفایل‌سازی، خطاهای مختلف مربوط به دستکاری و ذخیرهٔ پروفایل را گزارش می‌کند. خطاها در خروجی خطای استاندارد یا در صورت استفاده از متغیر محیطی، در فایل \fBGCOV_ERROR_FILE\fR چاپ می‌شوند. به منظور خروج فوری پس از وقوع خطا، متغیر محیطی \fBGCOV_EXIT_AT_ERROR\fR را تنظیم کنید. این کار می‌تواند به کاربران در یافتن تداخل پروفایل‌ها (clashing) که منجر به یک پروفایل گمراه‌کننده می‌شود، کمک کند..SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" \&\fBgpl\fR\|(7)، \fBgfdl\fR\|(7)، \fBfsf\-funding\fR\|(7)، \fBgcc\fR\|(1) و مدخل Info برای \fIgcc\fR. .SH "کپی‌رایت و تکثیر (COPYRIGHT)" .IX Header "COPYRIGHT" Copyright (c) 1996\-2026 Free Software Foundation, Inc. .PP اجازه کپی، توزیع و/یا تغییر این سند تحت شرایط مجوز مستندات آزاد گنو (GNU Free Documentation License)، نسخه 1.3 یا هر نسخهٔ بعدی منتشرشده توسط بنیاد نرم‌افزارهای آزاد (Free Software Foundation) اعطا می‌شود؛ با این شرط که بخش‌های تغییرناپذیر «GNU General Public License» و «Funding Free Software»، متن‌های روی جلد (a) (زیر را ببینید) و متن‌های پشت جلد (b) (زیر را ببینید) باشند. یک نسخه از این مجوز در صفحه راهنمای \fBgfdl\fR\|(7) گنجانده شده است. .PP (a) متن روی جلد FSF عبارت است از: .PP .Vb 1 \& A GNU Manual .Ve .PP (b) متن پشت جلد FSF عبارت است از: .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