| GENINFO(1) | LCOV | GENINFO(1) |
نام (NAME)
geninfo - مستندات geninfo
نام (NAME)
- geninfo
- تولید فایلهای ردگیری (tracefile) از فایلهای دادهٔ پوشش کد GCOV
خلاصه دستور (SYNOPSIS)
geninfo
[-h | --help]
[--version]
[-q | --quiet]
[-v | --verbose]
[--debug]
[--comment *comment-string*]
[-i | --initial]
[--all]
[-t | --test-name *test-name*]
[-o | --output-filename *filename*]
[-f | --follow]
[-b | --base-directory *directory*]
[--build-directory *directory*]
[--branch-coverage]
[--mcdc-coverage]
[--checksum]
[--no-checksum]
[--compat-libtool]
[--no-compat-libtool]
[--gcov-tool *tool*]
[--parallel | -j [*integer*]]
[--large-file *regexp*]
[--memory *integer_num_Mb*]
[--msg-log [*log_file_name*]]
[--ignore-errors *errors*]
[--expect-message-count *message_type* = *expr* [,*message_type* = *expr* ..]]
[--keep-going]
[--preserve]
[--filter *type*]
[--demangle-cpp [param]]
[--no-recursion]
[--external]
[--no-external]
[--sort-input]
[--config-file *config-file*]
[--no-markers]
[--profile [*profile-file*]]
[--history-script *callback*]
[--compat *mode* = on|off|auto]
[--rc *keyword* = *value*]
[--include *glob_pattern*]
[--exclude *glob_pattern*]
[--erase-functions *regexp_pattern*]
[--substitute *regexp_pattern*]
[--omit-lines *regexp_pattern*]
[--fail-under-branches *percentage*]
[--fail-under-lines *percentage*]
[--forget-test-names]
[--context-script *script_file*]
[--criteria-script *script_file*]
[--resolve-script *script_file*]
[--version-script *script_file*]
[--unreachable-script *module_file*]
[--tempdir *dirname*]
*directory*
توضیحات (DESCRIPTION)
از geninfo برای ساخت فایلهای ردگیری (tracefiles) LCOV از فایلهای دادهٔ پوشش کد GCC و LLVM/Clang استفاده کنید (برای نکات مربوط به کار با LLVM، گزینهٔ --gcov-tool را ببینید). میتوانید از genhtml برای ایجاد یک گزارش HTML از یک فایل ردگیری استفاده کنید.
توجه داشته باشید که geninfo توسط دستور lcov --capture فراخوانی میشود، بنابراین معمولاً نیازی به اجرای مستقیم آن نیست.
مگر در حالتی که گزینهٔ --output-filename مشخص شده باشد، geninfo خروجی خود را به ازای هر فایل ورودی در یک فایل با پسوند .info مینویسد.
همچنین توجه داشته باشید که کاربر فعلی به دسترسی نوشتن هم در directory و هم در مسیر کد منبع اصلی نیاز دارد. این امر ضروری است زیرا در طول فرآیند تبدیل، باید تعدادی فایل موقت در آنجا ایجاد شوند.
بهطور پیشفرض، geninfo دادههای پوشش خط (line) و تابع (function) را جمعآوری میکند. دادههای مربوط به پوشش انشعاب (branch) و MC/DC بهطور پیشفرض جمعآوری نمیشوند؛ میتوانید از گزینههای خط فرمان --branch-coverage و --mcdc-coverage برای فعالسازی آنها استفاده کنید، یا میتوانید با افزودن branch_coverage = 1 و/یا mcdc_coverage = 1 به فایل پیکربندی lcov شخصی، گروهی یا سیستمی خود، آنها را بهصورت دائمی فعال نمایید. برای جزئیات بیشتر به lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید.
انواع فایل (File types)
یک tracefile فایلی حاوی دادههای پوشش آزمون در قالبی است که توسط تمام ابزارهای LCOV مانند geninfo، lcov و genhtml استفاده میشود. طبق قرارداد، این فایلهای ردگیری دارای پسوند .info هستند. برای شرح قالب این فایل، بخش «Tracefile format» را در ادامه ببینید.
یک .gcda file فایلی وابسته به کامپایلر است که حاوی دادههای پوشش آزمون زمان اجرا (run-time) میباشد. این فایل زمانی که برنامهای که با گزینهٔ --coverage در GCC/LLVM کامپایل شده است تا انتها اجرا شود، ساخته و بهروزرسانی میگردد. دستور geninfo در حالت پیشفرض عملکرد خود، فایلهای .gcda را میخواند. نکته: نسخههای قدیمیتر کامپایلر از پسوند .da برای این نوع فایل استفاده میکردند.
یک .gcno file فایلی وابسته به کامپایلر است که دادههای پوشش آزمون ایستا و زمان کامپایل (compile-time) را در بر دارد. این فایل زمانی ساخته میشود که کد منبع با گزینهٔ --coverage در GCC/LLVM کامپایل شود. geninfo زمانی که گزینهٔ --initial مشخص شده باشد، فایلهای .gcno را میخواند. نکته: نسخههای قدیمیتر کامپایلر از پسوندهای .bb و .bbg برای این نوع فایل استفاده میکردند.
یک .gcov file نمایشی متنی یا به قالب JSON از دادههای موجود در فایلهای .gcda و .gcno است. این فایل توسط ابزار gcov که بخشی از GCC است ایجاد میشود (برای نکات مربوط به LLVM گزینهٔ --gcov-tool را ببینید). چندین نسخه از قالب فایل gcov وجود دارد، از جمله متنی، میانی (intermediate) و قالب JSON. دستور geninfo در ساختار داخلی خود از gcov برای استخراج دادههای پوشش از فایلهای .gcda و .gcno با استفاده از بهترین قالب پشتیبانیشدهٔ gcov بهره میبرد.
برای دریافت اطلاعات بیشتر در خصوص قالبهای خروجی .gcda، .gcno و .gcov، صفحهٔ راهنمای gcov را ببینید..SS نشانگرهای استثنا (Exclusion markers)
برای مستثنی کردن خطوط خاصی از کد از یک tracefile، میتوانید نشانگرهای استثنا را به کد منبع اضافه کنید. به همین ترتیب، میتوانید بخشهای خاصی از کد را بهعنوان «دستنیافتنی» (unreachable) علامتگذاری کنید. در صورتی که هر نقطه پوشش (coverpoint) در بخشهای دستنیافتنی اجرا شود (i.e. شمارش برخورد غیرصفر داشته باشد)، پیام خطای «unreachable» ایجاد میشود. برای توضیحات در مورد اقدامات انجامشده در این مورد، بخش retain_unreachable_coverpoints_if_executed را در lcovrc(1) <file://../man/lcovrc.1.html> ببینید.
علاوه بر این، میتوانید شاخهها یا عبارتهای MC/DC خاصی را بدون مستثنی کردن خطوط مربوطه از پوشش خطی و تابعی، مستثنی کنید.
نشانگرهای استثنا کلمات کلیدی هستند که برای مثال میتوانند در قالب یک کامنت اضافه شوند. برای چگونگی بازنویسی کلمات کلیدی استثنا به lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید (e.g. برای استفاده مجدد از نشانگرهای درجشده برای ابزارهای دیگر یا برای تولید گزارشها با مجموعههای متفاوتی از نواحی مستثنیشده).
نشانگرهای زیر توسط geninfo شناسایی میشوند:
- LCOV_EXCL_LINE
- خطوط حاوی این نشانگر مستثنی خواهند شد.
- LCOV_EXCL_START
- آغاز یک بخش مستثنیشده را مشخص میکند. خط فعلی بخشی از این بخش است.
- LCOV_EXCL_STOP
- پایان یک بخش مستثنیشده را مشخص میکند. خط فعلی بخشی از این بخش نیست.
- LCOV_UNREACHABLE_LINE
- اگر خط علامتگذاریشده «اجرا» (hit) شود، خطایی ایجاد میشود: فرض بر این است که کد علامتگذاریشده دستنیافتنی است و بنابراین یک باگ در کد، محل قرارگیری دستورالعمل یا هر دو وجود دارد. خطوط حاوی این نشانگر از گزارشگیری مستثنی خواهند شد. به جز گزارش خطا، این دستورالعمل معادل LCOV_EXCL_LINE است.
- LCOV_UNREACHABLE_START
- آغاز یک بخش دستنیافتنی از کد را مشخص میکند. خط فعلی بخشی از این ناحیه است. همانطور که در بخش LCOV_UNREACHABLE_LINE در بالا شرح داده شد: اگر کدی در این ناحیه اجرا شود خطایی ایجاد میشود، اما کد از گزارشگیری مستثنی میگردد.
- LCOV_UNREACHABLE_STOP
- پایان ناحیه کد دستنیافتنی را مشخص میکند. خط فعلی بخشی از این بخش نیست.
- LCOV_EXCL_BR_LINE
- خطوط حاوی این نشانگر از پوشش شاخه (branch coverage) مستثنی خواهند شد.
- LCOV_EXCL_BR_START
- آغاز بخشی را مشخص میکند که از پوشش شاخه مستثنی شده است. خط فعلی بخشی از این بخش است.
- LCOV_EXCL_BR_STOP
- پایان بخشی را مشخص میکند که از پوشش شاخه مستثنی شده است. خط فعلی بخشی از این بخش نیست.
- LCOV_EXCL_EXCEPTION_BR_LINE
- خطوط حاوی این نشانگر از پوشش شاخه استثنا (exception branch coverage) مستثنی خواهند شد: شاخههای استثنا نادیده گرفته میشوند، اما شاخههای غیراستثنا تحت تأثیر قرار نخواهند گرفت.
- LCOV_EXCL_EXCEPTION_BR_START
- آغاز بخشی را مشخص میکند که از پوشش شاخه استثنا مستثنی شده است. خط فعلی بخشی از این بخش است.
- LCOV_EXCL_EXCEPTION_BR_STOP
- پایان بخشی را مشخص میکند که از پوشش شاخه استثنا مستثنی شده است. خط فعلی بخشی از این بخش نیست.
علاوه بر این، geninfo از گزینه “–unreachable-script” نیز پشتیبانی میکند. این گزینه سازوکاری را برای مستثنی کردن عبارتهای شاخه خاص یا شرایط MC/DC از گزارشهای پوشش فراهم میکند. یک بازخوانی (callback) نمونه ساده را میتوان در مسیر زیر یافت:
این callback نمونه، پشتیبانی از استثناهای مخصوص شاخه و مخصوص شرط را که با حاشیهنویسیهای انتهای خط در کد منبع مشخص میشوند، اضافه میکند:
- LCOV_EXCLUDE_BRANCH (expressionId[,blockId])+
- میتوان یک یا چند مورد استثنای شاخه را که با فاصله جدا شدهاند مشخص کرد.
- expressionId:
- عدد صحیح دهدهی که مشخص میکند کدام شاخه مستثنی شود. در صورت نامعتبر بودن اندیس، خطا ایجاد میشود.
- blockId
- عدد صحیح دهدهی که اندیس بلوک حاوی عبارت مستثنیشده را مشخص میکند. در صورت نامعتبر بودن اندیس بلوک، خطا ایجاد میشود. اگر در این مکان تنها یک بلوک شاخه وجود داشته باشد، نیازی به تعیین شناسه بلوک نیست.
- LCOV_UNREACHABLE_COND ([groupSize,]conditionId(t|f))+
- میتوان یک یا چند مورد استثنای MC/DC را که با فاصله جدا شدهاند مشخص کرد.
- groupSize
- عدد صحیح دهدهی که گروه حاوی شرط مستثنیشده را مشخص میکند. در صورت نامعتبر بودن groupSize خطا ایجاد میشود. اگر در این مکان تنها یک گروه MC/DC وجود داشته باشد، نیازی به تعیین groupSize نیست.
- conditionId
- عدد صحیح دهدهی که مشخص میکند کدام شرط مستثنی شود. در صورت نامعتبر بودن اندیس، خطا ایجاد میشود.
- sense
- ‘t’ یا ‘f’: مقدار شرطی که دستنیافتنی است
به عنوان مثال، خط:
code // LCOV_EXCLUDE_BRANCH 0,1 3 LCOV_EXCLUDE_CONDITION 0f
عبارتهای شاخه ۱ و ۳ را از بلوک ۰ مستثنی میکند (یا اگر بیش از یک بلوک شاخه در این خط وجود داشته باشد خطا ایجاد میکند)، و مقدار «false» شرط ۰ را مستثنی میسازد (یا اگر بیش از یک گروه MC/DC در این خط وجود داشته باشد خطا میدهد).
یک راه برای تعیین شناسه شاخه و/یا شرط به منظور مستثنی کردن آنها این است که یک گزارش HTML بدون استثناها تولید کنید، سپس نشانگر ماوس را روی ناحیه رنگی شاخه/شرط ببرید و شناسهها را از پنجره بازشو (tooltip) بخوانید. راه دیگر این است که به سادگی مدخلهای BRDA/MCDC را در فایل دادههای پوشش بخوانید.
برای جزئیات بیشتر، کامنت بالای اسکریپت نمونه را ببینید.
گزینهها (OPTIONS)
به طور کلی، (تقریباً) تمام گزینههای geninfo را میتوان در فایل پیکربندی شخصی، گروهی، پروژه یا سراسری نیز مشخص کرد - برای جزئیات به بخش –config-file در زیر و lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید.
- -b, --base-directory directory
- استفاده از directory بهعنوان دایرکتوری پایه برای مسیرهای نسبی.
ERROR: could not read source file /home/user/project/subdir1/subdir2/subdir1/subdir2/file.c
در این مثال، از /home/user/project به عنوان دایرکتوری پایه استفاده کنید.
این گزینه هنگام استفاده از geninfo روی پروژههای ساختهشده با libtool یا محیطهای ساخت مشابهی که با یک دایرکتوری پایه کار میکنند لازم است، i.e. محیطهایی که در آنها دایرکتوری کاری فعلی هنگام فراخوانی کامپایلر با دایرکتوری که فایل کد منبع در آن قرار دارد یکسان نیست.
توجه داشته باشید که این گزینه در محیطهایی که در آنها از چندین دایرکتوری پایه استفاده میشود کار نخواهد کرد. در این حالت از تنظیم فایل پیکربندی geninfo_auto_base=1 استفاده کنید (به lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید).
- --build-directory build_dir
- جستجوی
فایلهای
داده .gcno از build_dir
به جای پیدا
کردن آنها
صرفاً در
مجاورت
فایلهای
مربوطه .o یا
.gcda.
بهطور پیشفرض، geninfo انتظار دارد که فایلهای .gcno و .gcda (به ترتیب دادههای زمان کامپایل و زمان اجرا) را در یک دایرکتوری پیدا کند.
هنگامی که این گزینه استفاده شود:
geninfo path1 --build-directory path2 ...
آنگاه geninfo به دنبال فایل .gcno:
path2/relative/path/to/da_base.gcno
خواهد گشت، هنگامی که فایل .gcda:
path1/relative/path/to/da_base.gcda.
را بیابد.
از این گزینه زمانی استفاده کنید که از متغیر محیطی GCOV_PREFIX برای هدایت محیط زمان اجرای gcc یا llvm به منظور نوشتن فایلهای داده پوشش در جایی غیر از دایرکتوری اصلی کامپایل کد استفاده کردهاید. به gcc(1) <file://../man/gcc.1.html> مراجعه کرده و/یا GCOV_PREFIX و GCOV_PREFIX_STRIP را جستجو کنید.
این گزینه میتواند چندین بار برای تعیین چندین دایرکتوری جایگزین به منظور جستجوی فایلهای .gcno استفاده شود. این امر ممکن است زمانی مفید باشد که برنامه شما از کدهایی استفاده میکند که در چندین مکان مجزا کامپایل شدهاند - برای مثال، کتابخانههای مشترکی که میان تیمها به اشتراک گذاشته شدهاند.
- --source-directory dirname
- افزودن ‘dirname’
به فهرست
مکانهای
جستجوی
فایلهای
منبع.
برای مسیرهای نسبی فایلهای منبع که در دادههای gcov یافت میشوند - احتمالاً پس از اعمال جایگزینیها، geninfo ابتدا مسیر را از ‘cwd’ (جایی که genhtml فراخوانی شده بود) و سپس از هر نام دایرکتوری جایگزین به ترتیب مشخصشده جستجو خواهد کرد. نخستین مکان منطبق استفاده میشود.
این گزینه را میتوان چندین بار مشخص کرد تا دایرکتوریهای بیشتری به مسیر جستجوی منبع افزوده شوند.
- --branch-coverage
- جمعآوری و
نگهداری
دادههای
پوشش شاخه.
این معادل استفاده از گزینه «–rc branch_coverage=1» است؛ این گزینه برای سازگاری بهتر با رابط genhtml اضافه شده است.
- --mcdc-coverage
- جمعآوری و
نگهداری
دادههای MC/DC.
این معادل استفاده از گزینه «–rc mcdc_coverage=1» است. دریافت پوشش MC/DC برای GCC نسخههای 14.2 و بالاتر، یا LLVM نسخههای 18.1 و بالاتر پشتیبانی میشود.
برای جزئیات در مورد دریافت دادههای MC/DC در LLVM به llvm2lcov –help مراجعه کنید.
برای جزئیات بیشتر به بخش MC/DC در genhtml(1) <file://../man/genhtml.1.html> مراجعه کنید.
- --checksum, --no-checksum
- مشخص کردن اینکه آیا دادههای چکسام هنگام نوشتن tracefileها تولید شوند یا خیر.
هنگامی که تولید چکسام فعال باشد، یک چکسام برای هر خط کد منبع تولید شده و به همراه دادههای پوشش ذخیره میشود. این چکسام برای جلوگیری از تلاشها جهت ترکیب دادههای پوشش از نسخههای مختلف کد منبع استفاده خواهد شد.
اگر با نسخههای مختلف کد منبع کار نمیکنید، این گزینه را غیرفعال کنید تا پردازش دادههای پوشش تسریع شده و اندازه tracefileها کاهش یابد.
توجه داشته باشید که این گزینه تا حدی تحت پوشش گزینه --version-script قرار دارد - که کاری مشابه انجام میدهد، اما در سطح «کل فایل».
- --compat mode = value [,*mode* = value,…]
- تنظیم حالت
سازگاری.
از --compat برای تعیین اینکه geninfo باید هنگام دریافت دادههای پوشش یک یا چند حالت سازگاری را فعال کند، استفاده کنید. میتوانید فهرستی از جفتهای mode=value که با کاما از هم جدا شدهاند ارائه دهید تا مقادیر چندین حالت را مشخص کنید.
مقادیر معتبر عبارتند از:
اگر مقداری مشخص نشود، ‘on’ به عنوان مقدار پیشفرض در نظر گرفته میشود.
حالتهای (modes) معتبر عبارتند از:
- libtool
- اگر در حال
جمعآوری
دادههای
پوشش کد
برای
پروژهای
هستید که با
سازوکار libtool
ساخته شده
است، این
حالت را
فعال کنید.
همچنین --compat-libtool
را ببینید.
مقدار پیشفرض برای این تنظیم ‘on’ است.
- hammer
- اگر در حال
جمعآوری
دادههای
پوشش کد
برای
پروژهای
هستید که با
نسخهای از
GCC 3.3 شامل
تغییرات
(وصله hammer)
نسخههای
بعدی GCC
ساخته شده
است، این
حالت را
فعال کنید.
میتوانید
یک نسخه
تغییریافته
GCC 3.3 را با
بررسی
دایرکتوری
ساخت پروژه
خود برای
فایلهایی
با پسوند .bbg
شناسایی
کنید.
نسخههای
تغییرنیافته
GCC 3.3 این
فایلها را
.bb
نامگذاری
میکنند.
مقدار پیشفرض برای این تنظیم ‘auto’ است.
- split_crc
- اگر در حال
جمعآوری
دادههای
پوشش کد
برای
پروژهای
هستید که با
نسخهای از
GCC 4.6 شامل
تغییرات
(چکسام
توابع
تفکیکشده)
نسخههای
بعدی GCC
ساخته شده
است، این
حالت را
فعال کنید.
پیامهای
خطای معمول
هنگام
اجرای geninfo روی
دادههای
پوشش
تولیدشده
توسط این
نسخههای GCC
عبارتند از
‘out of memory’ و ‘reached unexpected end of
file’.
مقدار پیشفرض برای این تنظیم ‘auto’ است.
- --compat-libtool, --no-compat-libtool
- مشخص کردن اینکه آیا حالت سازگاری libtool فعال شود یا خیر.
هنگامی که حالت سازگاری libtool فعال است، geninfo فرض میکند کد منبع مربوط به یک فایل .gcda واقع در دایرکتوری با نام «.libs» را میتوان در دایرکتوری والد آن یافت.
اگر در محیط ساخت خود دایرکتوریهایی با نام «.libs» دارید اما از libtool استفاده نمیکنید، این گزینه را غیرفعال کنید تا از بروز مشکل هنگام جمعآوری دادههای پوشش کد جلوگیری شود.
- --config-file config-file
- مشخص کردن
یک فایل
پیکربندی
برای
استفاده.
برای
جزئیات
قالب فایل و
گزینهها،
lcovrc(5) <file://../man/lcovrc.5.html> را
ببینید.
همچنین
برای
جزئیات
نحوه
گنجاندن یک
فایل
پیکربندی
در فایلی
دیگر، مدخل
config_file را در
همان صفحه
راهنما
ببینید.
هنگامی که این گزینه مشخص شود، نه فایل پیکربندی سراسری سیستم /etc/lcovrc و نه فایل پیکربندی اختصاصی کاربر ~/.lcovrc خوانده نخواهند شد.
این گزینه زمانی مفید است که نیاز به اجرای همزمان چندین نمونه از geninfo با گزینههای پیکربندی مختلف وجود داشته باشد.
توجه داشته باشید که این گزینه باید به صورت کامل مشخص شود - از شکلهای مخفف پشتیبانی نمیشود.
- --profile [profile-data-file]
- به ابزار
دستور
میدهد تا
کارایی و
سایر
دادههای
پیکربندی
را ردیابی
کند. اگر
profile-data-file
اختیاری
مشخص نشود،
دادههای
پروفایل در
فایلی با
همان نام
پایه –output-filename
همراه با
پسوند «.json»
ذخیره
میشوند.
دادههای پروفایل زمانی مفید هستند که در حال تلاش برای بهینهسازی پیادهسازی geninfo باشید (به $LCOV_ROOT/share/lcov/support-scripts/spreadsheet.py مراجعه کنید)، و همچنین میتوانند اجرای سریعتر ‘geninfo –parallel’ را امکانپذیر کنند (بخش «–history-script» این صفحه راهنما را ببینید).
- --history-script callback
- به ابزار
دستور
میدهد تا
از
دادههای
کارایی
مربوط به
اجرای قبلی
برای
پیشبینی
مصرف منابع
در اجرای
فعلی
استفاده
کند. این
کار امکان
تقسیمبندی
بهتر را
فراهم کرده
و توزیع بار
کاری
متوازنتری
بین
رشتههای
موازی
ایجاد
میکند - و
در نتیجه
زمان کل
اجرای
برنامه را
بهبود
میبخشد.
یک منبع معمول برای تاریخچه کارایی، previous-profile-data-file است که توسط آرگومان «–profile» تولید میشود.
یک نمونه پیادهسازی callback را در $LCOV_ROOT/share/lcov/support-scripts/history.pm و نحوه استفاده از آن را در $LCOV_ROOT/share/lcov/example در نسخه نصبشده ببینید (یا .../example و .../scripts/history.pm در مخزن کد منبع).
برای جزئیات بیشتر genhtml(1) <file://../man/genhtml.1.html> را ببینید.
- --external, --no-external
- مشخص کردن اینکه آیا دادههای پوشش برای فایلهای منبع خارجی جمعآوری شوند یا خیر.
گزینه –no-external تا حدی ابزاری خام و غیردقیق است؛ گزینههای –exclude و –include در صورتی که ساختار پروژه شما پیچیده باشد و/یا –no-external نتیجه دلخواه را ارائه نکند، کنترل دقیقتری روی دادههای پوشش لحاظشده و نشده فراهم میکنند.
دادههای فایلهای منبع خارجی بهطور پیشفرض گنجانده میشوند.
- -f, --follow
- دنبال کردن پیوندها هنگام جستجوی فایلهای .gcda، و همچنین برای تصمیمگیری در مورد اینکه آیا یک دایرکتوری منبع خاص (دارای پیوند نمادین) نسبت به پروژه «داخلی» است یا خیر - برای اطلاعات بیشتر گزینه –no-external در بالا را ببینید. گزینه خط فرمان –follow معادل گزینه فایل پیکربندی geninfo_follow_symlinks است. برای اطلاعات بیشتر lcovrc(5) <file://../man/lcovrc.5.html> را ببینید.
- --sort-input
- مشخص کردن اینکه آیا نام فایلها قبل از جمعآوری و/یا تجمیع مرتبسازی شوند یا خیر. مرتبسازی برخی از انواع تفاوتهای خروجی وابسته به ترتیب پردازش را کاهش میدهد. بخش sort_input را در lcovrc(5) <file://../man/lcovrc.5.html> ببینید.
- --gcov-tool tool
- مشخص کردن
مکان ابزار
gcov.
اگر گزینه --gcov-tool چند بار استفاده شود، هنگام اجرای callback آرگومانها به هم متصل میشوند - مشابه نحوه عملکرد پارامتر -Xlinker در gcc. این ویژگی روشی بالقوه آسانتر برای ارسال آرگومانها به ابزار شما بدون نیاز به اسکریپت پوششی فراهم میکند. در این صورت، callback شما به این شکل اجرا خواهد شد: tool-0 ‘tool-1; … ‘filename’’. توجه داشته باشید که برای مدیریت پارامترهای حاوی فاصله، آرگومان دوم و آرگومانهای پس از آن هنگام ارسال به پوسته درون علامت نقلقول قرار میگیرند.
آرگومان --gcov-tool میتواند رشتهای جداشده با split_char باشد - به man(4) lcovrc مراجعه کنید.
یک کاربرد رایج این گزینه برای فعالسازی LLVM است:
geninfo --gcov-tool llvm-cov --gcov-tool gcov ... geninfo --gcov-tool llvm-cov,gcov ...
نکته: دستور ‘llvm-cov gcov da_file_name’ خروجی را در قالب سازگار با gcov، همانطور که lcov نیاز دارد، تولید میکند.
اگر مشخص نشود، ‘gcov’ به صورت پیشفرض استفاده میشود.
- -h, --help
- نمایش یک متن راهنمای کوتاه و سپس خروج.
- --include pattern
- گنجاندن
فایلهای
منبع منطبق
با pattern.
از این سوییچ زمانی استفاده کنید که میخواهید دادههای پوشش را تنها برای مجموعه خاصی از فایلهای منبع که با هر یک از الگوهای ارائهشده مطابقت دارند بگنجانید. الگوهای چندگانه را میتوان با استفاده از چند سوییچ خط فرمان --include مشخص کرد. این الگوها (patterns) به عنوان الگوهای جانشین پوسته تفسیر خواهند شد (توجه داشته باشید که ممکن است نیاز به گریزدهی مناسب آنها باشد تا پوسته از قبل آنها را بسط ندهد).
برای جزئیات بیشتر صفحه راهنمای lcov را ببینید.
- --exclude pattern
- مستثنی
کردن
فایلهای
منبع منطبق
با pattern.
از این سوییچ زمانی استفاده کنید که میخواهید دادههای پوشش را از مجموعه خاصی از فایلهای منبع که با هر یک از الگوهای ارائهشده مطابقت دارند حذف کنید. الگوهای چندگانه را میتوان با استفاده از چند سوییچ خط فرمان --exclude مشخص کرد. این الگوها (patterns) به عنوان الگوهای جانشین پوسته تفسیر خواهند شد (توجه داشته باشید که ممکن است نیاز به گریزدهی مناسب آنها باشد تا پوسته از قبل آنها را بسط ندهد). نکته: الگو باید به گونهای مشخص شود که با مسیر مطلق هر فایل منبع مطابقت داشته باشد.
میتواند با سوییچ خط فرمان --include ترکیب شود. اگر یک فایل مشخص هم با الگوی include و هم با الگوی exclude مطابقت داشته باشد، اولویت با الگوی exclude خواهد بود.
برای جزئیات بیشتر صفحه راهنمای lcov را ببینید.
- --erase-functions regexp
- مستثنی
کردن
دادههای
پوشش از
خطوطی که
درون تابعی
قرار دارند
که نام آن
با عبارت
باقاعده (regexp)
ارائهشده
مطابقت
دارد. توجه
داشته
باشید بسته
به اینکه از
گزینه –demangle-cpp
استفاده
شده باشد یا
خیر، این
نام
میتواند mangled
یا demangled باشد.
توجه داشته باشید که این گزینه مستلزم استفاده از نسخهای از gcc است که به اندازه کافی جدید باشد تا از گزارش خطوط شروع/پایان تابع پشتیبانی کند، یا اینکه ابزار را برای استخراج دادههای مورد نیاز پیکربندی کنید - به بحث derive_function_end_line در صفحه راهنمای lcovrc مراجعه کنید.
- --substitute regexp_pattern
- اعمال عبارت باقاعده پرل regexp_pattern روی نام فایلهای منبع یافتشده در حین پردازش. این گزینه زمانی مفید است که نام مسیر گزارششده توسط gcov با ساختار منبع شما مطابقت ندارد و فایل پیدا نمیشود. برای جزئیات بیشتر به صفحه راهنمای lcov مراجعه کنید.
- --omit-lines regexp
- مستثنی
کردن
دادههای
پوشش از
خطوطی که
محتوای
آنها با regexp
مطابقت
دارد.
اگر میخواهید دادههای پوشش خط، انشعاب (branch) و MC/DC را برای برخی ساختارهای خاص در کد خود (برای مثال، یک ماکروی پیچیده) نادیده بگیرید، از این سوییچ استفاده کنید. برای جزئیات به صفحه راهنمای lcov مراجعه کنید.
- --forget-test-names
- در صورت
غیرصفر
بودن،
نامهای
موارد
آزمون در
فایل
ردگیری (tracefile)
نادیده
گرفته
میشوند -
به این
معنی که با
تمام
دادههای
پوشش طوری
رفتار
میشود که
گویی از یک
مورد آزمون
یکسان
آمدهاند.
این کار
میتواند
کارایی را
بهبود بخشد
و مصرف
حافظه را
کاهش دهد،
در صورتی که
کاربر به
خلاصه پوشش
به تفکیک
مورد آزمون
در
گزارشهای
پوشش نیازی
نداشته
باشد.
این گزینه همچنین میتواند با استفاده از گزینه فایل پیکربندی forget_testcase_names به طور دائمی پیکربندی شود.
- --msg-log [log_file_name]
- مشخص کردن مکانی برای ذخیره پیامهای خطا و هشدار (علاوه بر نوشتن در STDERR). اگر log_file_name مشخص نشود، از مکان پیشفرض استفاده میشود.
- --ignore-errors errors
- مشخص کردن
فهرستی از
خطاها که پس
از وقوع
آنها
پردازش
باید ادامه
یابد.
از این گزینه برای مشخص کردن فهرستی از یک یا چند دسته خطا استفاده کنید که پس از وقوع آنها geninfo باید به جای متوقف شدن، پردازش را ادامه دهد. توجه داشته باشید که ابزار یک هشدار تولید خواهد کرد (به جای یک خطای مهلک)، مگر اینکه خطا را دو (یا چند) بار نادیده بگیرید:
geninfo ... --ignore-errors unused,unused
مقدار errors میتواند فهرستی از کلیدواژههای زیر باشد که با کاما جدا شدهاند:
- branch
- شناسه انشعاب (فیلد دوم در مدخل ‘BRDA’ فایل .info) از توالی عدد صحیح مورد انتظار پیروی نمیکند.
- callback
- خطای اسکریپت نسخه (Version script error).
- child
- فرآیند فرزند در حین اجرای –parallel کد خروج غیرصفر برگردانده است. این معمولاً نشان میدهد که فرآیند فرزند با خطا مواجه شده است: فایل لاگ دقیقاً بالای این پیام را بررسی کنید. در مقابل: خطای parallel نشاندهنده یک استثنای غیرمنتظره/مدیریتنشده در فرآیند فرزند است - نه یک خطای معمول lcov.
- corrupt
- فایل خراب/غیرقابلخواندن پیدا شد.
- count
- تعداد بیش از حدی پیام از یک دسته خاص گزارش شده است - پیامهای بعدی از آن نوع نادیده گرفته خواهند شد. این حد را میتوان توسط متغیر ‘max_message_count’ کنترل کرد. صفحه راهنمای lcovrc را ببینید.
- deprecated
- شما در حال استفاده از یک گزینه منسوخشده هستید. این گزینه در نسخههای آینده حذف خواهد شد - بنابراین باید اسکریپتهای خود را اکنون تغییر دهید.
- empty
- فایل داده .info خالی است (برای مثال، به این دلیل که تمام کد «حذف» یا مستثنی شده است).
- excessive
- دادههای
پوشش شما
شامل تعداد
مراجعات به
طور مشکوکی
بالاست که
بعید است
صحیح باشد -
که
احتمالاً
نشاندهنده
یک باگ در
زنجیره
ابزار شما
است.
برای جزئیات بیشتر بخش excessive_count_threshold را در lcovrc(5) <file://../man/lcovrc.5.html> ببینید.
- fork
- ناتوانی در ایجاد فرآیند فرزند هنگام اجرای –parallel. اگر پیام نادیده گرفته شود (–ignore-errors fork)، آنگاه genhtml مدت کوتاهی منتظر مانده و سپس اجرای ناموفق را دوباره امتحان میکند. اگر خطاهای مداوم مشاهده میکنید، موازیسازی را غیرفعال کنید یا کاهش دهید، یک محدودیت حافظه تعیین کنید، یا سرور قدرتمندتری برای اجرای این وظیفه بیابید.
- format
- نحو یا مقدار غیرمنتظره در فایل .info یافت شد - برای مثال، مواجهه با عدد منفی یا شماره خط صفر.
- gcov
- ابزار gcov با یک کد خروج غیرصفر بازگشت.
- graph
- فایل گراف پیدا نشد یا آسیب دیده است..TP inconsistent دادههای پوشش شما از نظر درونی متناقض هستند: دو یا چند ادعای مانعةالجمع دارند. برای نمونه، عبارتی هم به عنوان شاخه استثنا و هم غیر استثنا علامتگذاری شده است. (برای جزئیات بیشتر به genhtml(1) <file://../man/genhtml.1.html> مراجعه کنید).
- internal
- مشکل درونی ابزار شناسایی شد. لطفاً این باگ را به همراه یک نمونه آزمایشی (testcase) گزارش دهید.
- mismatch
- اطلاعات نادرستی در دادههای پوشش و/یا کد مبدأ یافت شد - برای نمونه، کد مبدأ شامل دستورالعملهای استثنای همپوشان است.
- missing
- فایل وجود ندارد یا قابل خواندن نیست.
- negative
- تعداد
دفعات
اجرای منفی
(«hit») یافت شد.
توجه داشته باشید که مقادیر منفی ممکن است به دلیل یک باگ شناختهشده در GCC باشد - ببینید:
و کامپایل را با «-fprofile-update=atomic» امتحان کنید. شما باید مجدداً کامپایل کرده، آزمونهای خود را دوباره اجرا نمایید و دادههای پوشش را دوباره ثبت کنید.
- package
- یک بسته مورد نیاز perl روی سیستم شما نصب نشده است. در برخی موارد، امکان نادیده گرفتن این پیام و ادامه کار وجود دارد - هرچند، در این صورت برخی ویژگیها غیرفعال خواهند شد.
- parallel
- انواع
خطاهای
مربوط به
موازیسازی
- به عنوان
مثال یک
فرایند
فرزند به
دلیل خطا
متوقف شد.
پیام خطای
مربوطه
بلافاصله
پیش از خطای
parallel در فایل
لاگ ظاهر
میشود.
اگر خطایی مربوط به اجرای موازی مشاهده کردید که به نظر نامعتبر میرسد، شاید بهتر باشد پرچم –parallel را حذف کرده و دوباره امتحان کنید. اگر حذف این پرچم به نتیجه متفاوتی منجر شد، لطفاً مشکل را (به همراه یک نمونه آزمایشی) گزارش دهید تا ابزار اصلاح شود.
- parent
- فرایند والد در حین فعال بودن فرزند طی اجرای –parallel خارج شد. این اتفاق زمانی رخ میدهد که والد با یک خطای مهلک مواجه شده باشد - مثلاً خطایی در یک فرایند فرزند دیگر که نادیده گرفته نشده است. این فرزند نمیتواند بدون والد خود به کار ادامه دهد - و بنابراین خارج خواهد شد.
- path
- برخی مسیرهای فایل شناسایی نشدند - مثلاً فایل .gcno مربوط به یک فایل .gcda یافت نشد؛ برای اطلاعات بیشتر گزینه –build-directory را ببینید.
- range
- دادههای پوشش به شماره خطی اشاره دارند که از تعداد خطوط فایل مبدأ بزرگتر است. این موضوع میتواند ناشی از عدم تطابق نسخه یا مشکلی در دادههای gcov باشد.
- source
- فایل کد مبدأ برای یک مجموعه داده یافت نشد.
- unreachable
- یک نقطه پوشش (خط، انشعاب، تابع یا MC/DC) در داخل یک ناحیه «دستنیافتنی» (unreachable) اجرا شده است (hit)؛ کد، جایگذاری دستورالعمل، یا هر دو نادرست هستند. در صورت نادیده گرفتن خطا، نقطه پوشش متخلف بسته به مقدار پارامتر پیکربندی retain_unreachable_coverpoints_if_executed حفظ میشود (مستثنی نمیشود) یا خیر. به lcovrc(5) <file://../man/lcovrc.5.html> و بخش «Exclusion markers» در بالا مراجعه کنید.
- unsupported
- ویژگی درخواستشده برای این پیکربندی ابزار پشتیبانی نمیشود. برای نمونه، استثناهای محدوده خط آغاز/پایان تابع از برخی ویژگیهای GCOV استفاده میکنند که در نگارشهای قدیمیتر GCC در دسترس نیستند.
- unused
- الگوی include/exclude/erase/omit/substitute با هیچ مسیر فایلی مطابقت نداشت.
- usage
- استفاده پشتیبانینشده شناسایی شد - مثلاً ترکیب پشتیبانینشدهای از گزینهها.
- utility
- ابزاری که در حین پردازش فراخوانی شده بود یک کد خطا بازگرداند (مثلاً ‘find’ با یک دایرکتوری غیرقابل خواندن مواجه شد).
- version
- شناسههای کنترل نسخه فایلی که در تلاش برای ادغام آن هستیم یکسان نیستند - شمارهگذاری خطوط و سایر اطلاعات ممکن است نادرست باشند.
همچنین بخش –ignore-errors را در genhtml(1) <file://../man/genhtml.1.html> ببینید. توضیحات آنجا ممکن است کاملتر و/یا با جزئیات بیشتری شرح داده شده باشد.
برای بررسی پارامتر ‘max_message_count’ که میتوان از آن برای کنترل تعداد هشدارهای صادر شده پیش از سرکوب تمام پیامهای بعدی استفاده کرد، به lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید. از این قابلیت میتوان برای کاهش حجم فایل لاگ استفاده کرد.
- --expect-message-count message_type = expr [,*message_type* = expr]
- به geninfo
محدودیتی
در تعداد
پیامهای
یک یا چند
نوع که
انتظار
میرود در
طول اجرا
تولید شوند
اعمال
میکند. اگر
شرط
محدودیت
برقرار
نباشد،
خطایی از
نوع «count»
تولید
میشود
(بالا را
ببینید).
برای جزئیات بیشتر درباره این پرچم به genhtml(1) <file://../man/genhtml.1.html>، و همچنین برای شرح گزینه معادل آن در فایل پیکربندی به بخش «expect_message_count» در lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید.
- --keep-going
- در صورت
بروز خطا
متوقف نشو:
برای تولید
نتیجه تلاش
کن، هرچند
دارای نقص
باشد.
این گزینه خط فرمان متناظر با گزینه stop_on_error [0|1] در lcovrc است. برای جزئیات بیشتر به lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید.
- --fail-under-lines percentage
- از این گزینه استفاده کنید تا به geninfo دستور دهید اگر مجموع پوشش خطوط کمتر از percentage بود، با وضعیت 1 خارج شود. برای جزئیات بیشتر lcov(1) <file://../man/lcov.1.html> را ببینید.
- --preserve
- فایلهای
داده میانی
را حفظ کن
(مثلاً
برای
اشکالزدایی).
بهطور پیشفرض، فایلهای میانی حذف میشوند.
- --filter filters
- فهرستی از فیلترهای نقاط پوشش را برای اعمال روی دادههای ورودی مشخص کنید. برای جزئیات به صفحه راهنمای genhtml مراجعه کنید.
- --demangle-cpp [param]
- نامزدایی (demangle) متدها و توابع C++ در خروجی ثبتشده. برای جزئیات به صفحه راهنمای genhtml مراجعه کنید.
- -i, --initial
- ثبت دادههای اولیه پوشش صفر (zero coverage).
نکته: گزینه --initial برای نگارشهای کمتر از 6 در gcc پشتیبانی نمیشود، و برای نگارشهای کمتر از 8 در gcc اطلاعات پوشش شاخه را تولید نمیکند.
- --all
- ثبت
دادههای
پوشش هم از
فایلهای
داده زمان
کامپایل (.gcno)
که
فایلهای
داده زمان
اجرای (.gcda)
متناظر
ندارند، و
هم از
آنهایی که
دادههای
زمان اجرای
متناظر
دارند.
دادههای
زمان اجرا
وجود
نخواهد
داشت مگر
اینکه فایل
اجرایی
پیونددهنده
فایل شیء
متناظر تا
انتها اجرا
شده باشد.
توجه داشته باشید که تعداد اجرای نقاط پوشش یافتشده منحصراً در فایلهایی که هیچ داده زمان اجرایی ندارند، صفر خواهد بود.
اگر پرچم –initial تنظیم شده باشد، این پرچم نادیده گرفته میشود.
استفاده از پرچم --all معادل اجرای هر دو دستور geninfo –initial … و geninfo … و ادغام نتیجه است.
همچنین مدخل geninfo_capture_all را در man(5) lcovrc ببینید.
- --no-markers
- مگر اینکه
از گزینه
–no-markers
استفاده
شود، geninfo هر
دو فیلتر region
و branch_region را روی
دادههای
پوشش
ثبتشده
اعمال
خواهد کرد.
اگر
میخواهید
دادههای
پوشش را
بدون در نظر
گرفتن
نشانگرهای
استثنا در
فایل کد
مبدأ
دریافت
کنید، از
این گزینه
استفاده
نمایید.
اگر هر یک از گزینههای –filter اعمال شوند، فیلترهای ناحیه پیشفرض استفاده نمیشوند.
گزینه –no-markers نباید همراه با –filter مشخص شود.
- --no-recursion
- اگر میخواهید دادههای پوشش را تنها برای دایرکتوری مشخصشده بدون پردازش زیردایرکتوریها دریافت کنید، از این گزینه استفاده نمایید.
- -o, --output-filename output-filename
- نوشتن تمام دادهها در output-filename.
- --context-script script
- استفاده از
script برای
جمعآوری
اطلاعات
زمینه
اجرای
ابزار
بیشتر - به
منظور کمک
به
اشکالزدایی
زیرساخت
و/یا
ردیابی.
برای جزئیات بیشتر در مورد اسکریپت زمینه به صفحه راهنمای genhtml مراجعه کنید.
- --criteria-script script
- استفاده از
script برای
آزمودن
معیارهای
پذیرش پوشش.
برای جزئیات بیشتر در مورد اسکریپت معیارها به صفحه راهنمای genhtml مراجعه کنید. توجه داشته باشید که geninfo اطلاعات تاریخ و مالک را نگهداری نمیکند (مدخل –annotate-script در صفحه راهنمای genhtml را ببینید) - بنابراین این اطلاعات به بازفراخوانی (callback) geninfo ارسال نمیشود.
- --resolve-script script
- استفاده از
script برای
یافتن مسیر
فایل یک
فایل مبدأ
یا GCNO که در یک
فایل داده
ورودی وجود
دارد،
چنانچه
فایل پس از
اعمال
الگوهای
–substitute و
جستجوی
فهرست –source-directory
یا –build-directory
پیدا نشود.
این گزینه معادل گزینه resolve_script در فایل پیکربندی است. افزون بر این، گزینه پیکربندی geninfo_follow_path_links میتواند برای حل مسیرهای مبدأ به مقصد واقعی آنها استفاده شود.
برای جزئیات به lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید.
- --version-script script
- استفاده از
script برای
دریافت
شناسه
نگارش فایل
مبدأ از
سیستم
کنترل نسخه
هنگام
استخراج
دادهها.
این شناسه
برای بررسی
خطا هنگام
ادغام
فایلهای .info
استفاده
میشود.
برای جزئیات بیشتر درباره اسکریپت نگارش به صفحه راهنمای genhtml مراجعه کنید.
- --unreachable-script module
- استفاده از
module برای
تصمیمگیری
در این باره
که آیا
عبارات
انشعاب خاص
و/یا شرایط MC/DC
باید از
گزارش پوشش
حذف شوند یا
خیر. این
گزینه
معادل
گزینه
پیکربندی
unreachable_script است.
برای
جزئیات به
lcovrc(5) <file://../man/lcovrc.5.html>
مراجعه
کنید.
توجه داشته باشید که «module» باید یک ماژول Perl باشد.
برای اطلاعات بیشتر به صفحه راهنمای genhtml و بخش «Exclusion markers» در بالا مراجعه کنید.
- -v, --verbose
- افزایش تفضیل (verbosity) پیامهای اطلاعاتی. این گزینه عمدتاً برای اشکالزدایی اسکریپت و/یا جریان کار استفاده میشود - مثلاً برای بررسی اینکه کدام فایل داده در کجا پیدا شده است. همچنین پرچم --quiet را ببینید.
- -q, --quiet
- کاهش تفضیل پیامهای اطلاعاتی.
- --debug
- افزایش تفضیل «پیامهای اشکالزدایی». این گزینه اساساً برای توسعهدهندگانی مفید است که مایل به ارتقای مجموعه ابزار lcov هستند.
- --comment comment_string
- الحاق comment_string
به فهرست
یادداشتهای
درجشده در
فایل نتیجه
خروجی. این
گزینه
میتواند
چندین بار
مشخص شود.
یادداشتها
در بالای
فایل و به
ترتیبی که
تعیین
شدهاند
چاپ
میشوند.
یادداشتها میتوانند برای مستندسازی شرایطی که فایل ردگیری (tracefile) تحت آن تولید شده مفید باشند: میزبان، تاریخ، محیط و غیره.
- --parallel [integer], -j [integer]
- تعیین درجه موازیسازی مورد استفاده در طول پردازش (حداکثر تعداد فرایندهای فرزند ایجادشده با fork). اگر پارامتر عددی اختیاری موازیسازی صفر باشد یا مشخص نشود، از تمام هستههای دستگاه استفاده خواهد شد. پیشفرض، استفاده از یک فرایند واحد است (بدون موازیسازی).
همچنین مدخلهای memory, memory_percentage, max_fork_fails, fork_fail_timeout, geninfo_chunk_size و geninfo_interval_update را در lcovrc(5) <file://../man/lcovrc.5.html> برای شرح برخی گزینهها که ممکن است به تنظیم پارامترها و بهینهسازی عملکرد کمک کنند، مشاهده کنید. یک نمایه (profile) اجرای از پیش تولیدشده میتواند به بهرهبرداری بهتر و اجرای موازی سریعتر کمک کند. بخشهای «–profile» و «–history-script» این صفحه راهنما را ببینید.
- --large-file regexp
- فایلهای GCDA
که نام
آنها با یک
عبارت منظم
–large-file مطابقت
دارد، به
صورت
ترتیبی - و
نه به صورت
موازی با
سایر
فایلها -
پردازش
میشوند تا
فرایند gcov
مربوط به
آنها
بتواند از
تمام حافظه
در دسترس
سیستم
استفاده
کند.
اگر با خطاهای مربوط به تخصیص حافظه از سوی gcov مواجه شدید، از این گزینه استفاده کنید.
این قابلیت دقیقاً مانند این است که فایلهای GCDA منطبق را به مکان دیگری منتقل کرده و آنها را به صورت ترتیبی پردازش کنید، سپس فایلهای GCDA باقیمانده را به صورت موازی پردازش کرده و نتایج را ادغام نمایید.
این گزینه میتواند چندین بار برای مشخص کردن بیش از یک عبارت منظم استفاده شود..TP --memory integer حداکثر میزان حافظه برای استفاده در طول پردازش موازی را بر حسب مگابایت (Mb) مشخص میکند. در عمل، در صورتی که این محدودیت نقض شود، فرایند تابع fork() را اجرا نخواهد کرد. پیشفرض 0 (صفر) است - به این معنی که هیچ محدودیتی وجود ندارد.
این گزینه ممکن است زمانی مفید باشد که محیط مزرعه محاسباتی (compute farm) محدودیتهای سختی را بر مصرف منابع اعمال میکند، بهگونهای که اگر کار (job) سعی کند فرایندهای فرزند موازی بیش از حدی ایجاد کند، متوقف (kill) خواهد شد - اما کاربر از قبل حداکثر مقدار مجاز را نمیداند. این گزینه به ابزار امکان میدهد از حداکثر موازیسازی - تا سقف تعیینشده توسط محدودیت حافظه - استفاده کند.
گزینه memory_percentage در فایل پیکربندی راه دیگری برای تنظیم حداکثر مصرف حافظه ارائه میدهد. برای جزئیات به lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید.
- --rc keyword = value
- یک
دستورالعمل
پیکربندی
را
بازنویسی
(override) میکند.
از این گزینه برای تعیین یک عبارت keyword = value استفاده کنید که عبارت پیکربندی متناظر را در فایل پیکربندی lcovrc لغو و بازنویسی میکند. میتوانید این گزینه را چندین بار مشخص کنید تا چندین دستورالعمل پیکربندی بازنویسی شوند. برای فهرستی از کلیدواژههای موجود و معنای آنها به lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید.
- -t, --test-name testname
- از نام مورد آزمون testname برای دادههای حاصل استفاده میکند. نامهای معتبر مورد آزمون میتوانند شامل حروف، ارقام دهدهی و نویسه زیرخط («_») باشند.
- --version
- چاپ شماره نسخه و سپس خروج.
- --tempdir dirname
- نوشتن دادههای موقت و میانی در دایرکتوری مشخصشده. پیشفرض «/tmp» است.
قالب فایل ردگیری (TRACEFILE FORMAT)
در ادامه توضیح مختصری از قالب فایل ردگیری (tracefile) آورده شده است که توسط genhtml، geninfo و lcov استفاده میشود.
یک tracefile از چندین خط متنی خوانا برای انسان تشکیل شده است که به بخشهایی تقسیم میشوند. اگر گزینه ---comment comment_string ارائه شده باشد، آنگاه:
#comment_string
در بالای فایل tracefile ظاهر خواهد شد. هیچ فاصلهای قبل یا بعد از نویسه # وجود ندارد.
در صورت وجود، فایل tracefile با testname آغاز میشود که در قالب زیر ذخیره میشود:
TN:<test name>
برای هر فایل منبع که در فایل .gcda ارجاع داده شده است، بخشی حاوی نام فایل و دادههای پوشش (coverage) وجود دارد:
SF:<path to the source file>
یک شناسه نسخه (version ID) اختیاری برای کد منبع در ادامه میآید:
VER:<version ID>
در صورت وجود، شناسه نسخه قبل از ادغام ورودیهای فایل (به lcov --add-tracefile مراجعه کنید) و قبل از ایجاد نمای «جزئیات منبع» توسط genhtml مقایسه میشود. به مستندات --version-script callback_script و نمونه کاربردهای موجود در مثالهای آزمون پسرفت lcov مراجعه کنید.
دادههای پوشش تابع (function coverage) در ادامه میآید. توجه داشته باشید که قالب دادههای پوشش تابع از نسخه LCOV 2.2 به بعد تغییر یافته است. این ابزار همچنان میتواند قالب قدیمی را بخواند اما اکنون فقط در قالب جدید مینویسد. این تغییر به این دلیل انجام شده است که نتیجه فیلتر function در فایل tracefile تولیدشده ماندگار باشد.
توابع و نامهای مستعار (aliases) آنها بهصورت متوالی ثبت میشوند:
ابتدا، پیشرو (leader):
FNL:<index>,<line number of function start>[,line number of function end>]
سپس نامهای مستعار تابع؛ حداقل یک نام مستعار وجود خواهد داشت. تمام نامهای مستعار یک تابع خاص، شاخص (index) یکسانی دارند.
FNA:<index>,<execution count>,<name>
قالب دادههای تابع که اکنون منسوخ شده است عبارت است از:
FN:<line number of function start>,[<line number of function end>,]<function name>
شماره خط «پایان» اختیاری است و تنها در صورتی تولید میشود که نسخه کامپایلر/زنجیرهابزار به اندازه کافی جدید باشد تا دادهها را تولید کند (مثلاً gcc 9 یا جدیدتر). این دادهها برای پشتیبانی از گزینههای --erase-functions و --show-proportions استفاده میشوند. اگر دادههای خط پایان تابع در دسترس نباشد، این ویژگیها کار نخواهند کرد.
سپس، فهرستی از تعداد دفعات اجرای هر تابع سازمندسازیشده (instrumented function) قرار دارد:
FNDA:<execution count>,<function name>
پس از این فهرست، دو خط شامل تعداد توابع یافتهشده و اجراشده میآید:
FNF:<number of functions found> FNH:<number of function hit>
توجه داشته باشید که از نسخه LCOV 2.2 به بعد، این اعداد گروههای توابع را شمارش میکنند - نه تکتک نامهای مستعار را.
اطلاعات پوشش شاخه (branch coverage) در یک خط به ازای هر شاخه ذخیره میشود:
BRDA:<line_number>,[<exception>][<fallthrough][<unreachable>]<block>,<branch>,<taken>
- <line_number>
- شماره خطی است که شاخه در آن پیدا شده است - و انتظار میرود که یک عدد صحیح غیرصفر باشد.
- <block> و <branch>
- برای تعریف
منحصربهفرد
یک یال مشخص
در درخت
عبارت یک
شرط خاصِ
موجود در خط
مربوطه به
کار
میروند.
درون یک خط مشخص، <block> یک عدد صحیح است که از صفر و بدون فاصله شمارهگذاری میشود. برای برخی زبانها و شیوههای کدنویسی، تنها یک بلوک (مقدار شاخص صفر) در هر خط مشخص وجود خواهد داشت.
<branch> رشتهای است که برای شناسایی منحصربهفرد یک یال خاص به کار میرود. برای برخی زبانها و ابزارها - مثلاً کدهای C/C++ کامپایلشده با gcc یا llvm - مقدار <branch> یک شاخص عددی صحیح و مرتب است که به ترتیب پیمایش درخت عبارتِ شرطی متناظر مربوط میشود. برای موارد دیگر، ممکن است یک رشته معنادار باشد - پایینتر را ببینید. <branch> در پنجره بازشوی «tooltip» شاخه مربوطه در خروجی genhtml ظاهر میشود - بنابراین مقادیر خوانا برای انسان برای کاربرانی که تلاش میکنند نتایج پوشش را درک کنند (بهعنوان مثال، به منظور توسعه آزمونهای پسرفت اضافی برای بهبود پوشش) مفید است.
- <taken>
- یا برابر با «-» است (اگر عبارت مربوطه هرگز ارزیابی نشده باشد؛ مثلاً اگر بلوک پایهای که شامل شاخه است هرگز اجرا نشده باشد) یا عددی است که نشان میدهد آن شاخه چند بار طی شده است.
- <exception>
- اگر این یک شاخه مرتبط با مدیریت استثنا (exception handling) باشد، برابر با «e» (تکنویسه) است - و اگر شاخه به استثناها مربوط نباشد، وجود ندارد. شناسایی شاخههای استثنا نیازمند پشتیبانی کامپایلر است. geninfo تنها در صورتی قادر به شناسایی شاخههای استثنا خواهد بود که نسخه زنجیرهابزار شما به اندازه کافی جدید باشد تا از این ویژگی پشتیبانی کند.
- <fallthrough>
- اگر این شاخه با عنوان «fallthrough» علامتگذاری شده باشد (مثلاً در خروجی gcov)، برابر با «f» (تکنویسه) است - و اگر شاخه علامتگذاری نشده باشد، وجود ندارد. شناسایی شاخههای fallthrough نیازمند پشتیبانی کامپایلر است. geninfo تنها در صورتی میتواند شاخههای fallthrough را شناسایی کند که نسخه زنجیرهابزار شما به اندازه کافی برای پشتیبانی از این ویژگی جدید باشد. یک شاخه ممکن است با عنوان «<exception>» یا «<fallthrough>» علامتگذاری شود - اما نه هر دو.
- <unreachable>
- اگر این
شاخه با یک
دستورالعمل
«unreachable» مرتبط
باشد،
برابر با
«U»
(تکنویسه)
است، و اگر
شاخه قابل
دسترس
باشد، وجود
ندارد.
وضعیت
غیرقابل
دسترس بودن
با این هدف
در نظر
گرفته شده
است تا
عبارات
شاخهای را
علامتگذاری
کند که
نباید در
گزارشهای
پوشش ظاهر
شوند - و به
کاربران
امکان
میدهد تا
شاخههای
پوششدادهنشدهای
را که هرگز
پوشش داده
نمیشوند
نادیده
بگیرند، تا
بتوانند بر
سایر
بخشهای
گزارش پوشش
تمرکز کنند.
برای اطلاعات بیشتر در مورد چگونگی تنظیم و استفاده از نشانگرهای استثنای شاخه، به بحث “–unreachable-script” در genhtml(1) <file://../man/genhtml.1.html> و بحث “ignore_unreachable_flag” در lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید.
در ادامه نمونههایی از رکوردهای شاخه آمده است که مقادیر عبارت <branch> در آنها رشتههایی خوانا برای انسان هستند.
BRDA:10,0,enable,1 BRDA:10,0,!enable,0
در این حالت، کد متناظر در خط ۱۰ بسیار محتمل است که شبیه به کد زیر باشد:
if (enable) {
...
}
بهطوری که مورد آزمون مرتبط وارد بلوک شده است (مقدار «enable» به «true» ارزیابی شده است).
عبارات شاخه با پیچیدگی دلخواه پشتیبانی میشوند - از جمله عبارات شاخهای که حاوی ویرگول هستند (مثلاً در عبارتی که شامل فراخوانی تابع است).
توجه داشته باشید که ابزارهای خاص ممکن است عباراتی را که از نظر ایستایی درست (true) یا از نظر ایستایی نادرست (false) هستند حذف کنند یا نکنند - مثلاً عباراتی که از پارامترهای قالب (template) استفاده میکنند. این امر مقایسه دادههای پوشش تولیدشده توسط دو ابزار مختلف را بالقوه دشوار میسازد.
نکتهای در مورد شناسایی، تطبیق و ادغام شاخهها:
همانطور که قبلاً اشاره شد: lcov صرفاً دادههای پوششی را ارائه میدهد که توسط ابزارهای دیگر مانند gcov شناسایی شدهاند. متأسفانه gcov (و سایر ابزارها) اطلاعات کافی برای شناسایی منحصربهفرد عبارات شاخه تولید نمیکنند - بنابراین lcov مجبور است از یک راهحل اکتشافی مبتنی بر ترتیب ظهور و همچنین تعداد و نوع عناصر شاخهای منفرد - برای مثال در خروجی gcov - استفاده کند.
ابزار lcov یک «امضا» برای هر «<block>» محاسبه میکند. اگر شناسه بلوک و امضا هنگام دریافت دادهها از چندین فایل یا هنگام ادغام دادههای پوشش یافت شود - آنگاه بلوک یکسان در نظر گرفته شده و مقادیر شمارش عبارت متناظر با یکدیگر ترکیب میشوند.
درون یک خط مشخص، ممکن است یک یا چند بلوک با امضای یکسان وجود داشته باشد - برای مثال، متناظر با عبارات شاخه مستقل در آرگومانهای فراخوانی تابع در آن خط، یا بسطهای مختلف ماکرو یا قالب. ابزار lcov ترتیبی را که بلوکهای شاخه در آن پیدا شدهاند (مثلاً در خروجی gcov یا در یک فایل .info متعلق به lcov) پیگیری میکند.
هنگام ادغام دادههای شاخه در یک خط خاص:
- بلوکهایی که امضاهای یکسانی دارند به ترتیب مطابقت داده میشوند: بلوک صفرم با امضای s1 در پایگاهداده پوشش A با بلوک صفرم با امضای s1 در پایگاهداده پوشش B ادغام میشود - و به همین ترتیب.
- اگر یکی از پایگاههای داده شامل امضایی نباشد، یا یک پایگاهداده شامل بلوکهای بیشتری با همان امضا باشد: آنگاه آن بلوکهای نامطابق صرفاً به خروجی ادغامشده رونوشت میشوند.
این روش مکاشفهای (heuristic) میتواند باعث ایجاد ابهام در گزارش تولیدشده شود - بهویژه در مواردی که یک خط خاص به روشهای متفاوتی در واحدهای ترجمه مختلف بسط مییابد - برای مثال، به دلیل بسط الگو (template) یا ماکرو. در چنین مواردی، ممکن است برای lcov ممکن نباشد که بداند بلوکی که امضا و ترتیب آن مطابق به نظر میرسد، در واقع همان بلوک نیست. ممکن است بازنویسی جزئی کد برای معرفی متغیرهای موقت صریح (در خط مخصوص به خودشان) جهت رفع این ابهام امکانپذیر باشد.
خلاصههای پوشش شاخه در دو خط ذخیره میشوند:
BRF:<number of branches found>
توجه داشته باشید که این شمارش شامل شاخههای «مستثنیشده» نمیشود. شاخههای مستثنیشده بهصورت رکوردهای BRDA ظاهر میشوند.
BRH:<number of branches hit>
توجه داشته باشید که این شمارش شامل شاخههای «مستثنیشده» نمیشود. شاخههای مستثنیشده بهصورت رکوردهای BRDA ظاهر میشوند.
اطلاعات MC/DC در هر عبارت در یک خط ذخیره میشود:
MCDC:<line_number>,[<unreachable>]<groupSize>,<sense>,<taken>,<index>,<expression>
که در آن:
- <line_number>
- شماره خطی است که شرط در آن یافت شده است - و انتظار میرود که یک عدد صحیح غیرصفر باشد.
- <groupSize> و <index>
- برای تعریف
یکتای یک
عنصر خاص در
درخت عبارت
مربوط به یک
شرط خاصِ
یافتشده
در خط
متناظر عمل
میکنند.
در یک خط و گروه خاص،
- <index>
- یک عدد صحیح شمارهگذاریشده از صفر تا <groupSize> - 1 بدون هیچ فاصلهای است. برای برخی زبانها و برخی شیوههای کدنویسی، تنها یک گروه در هر خط خاص وجود خواهد داشت.
- <sense>
- یا «f» است یا «t»، که نشان میدهد آیا شرط به تغییر مشخصشده حساس است یا خیر - یعنی به ترتیب، آیا نتیجه شرط در صورت تغییر متناظر از ‘false’ به ‘true’ یا از ‘true’ به ‘false’، تغییر میکند یا خیر.
- <taken>
- یک شمارنده است - اگر عبارت حساس نشده باشد، مقدار آن 0 (صفر) است و در صورت حساس شدن، عددی غیرصفر است. توجه داشته باشید که برخی ابزارها ممکن است با <taken> به عنوان تعداد دفعاتی که عبارت حساس شده است رفتار کنند، در حالی که ابزارهای دیگر ممکن است آن را به عنوان یک متغیر بولی در نظر بگیرند - ۱: حساسشده یا ۰: حساسنشده.
- <expression>
- یک رشته
دلخواه است
که هدف از
آن، یک رشته
معنادار
برای کمک به
کاربر در
درک زمینه
شرط است - در
ادامه را
ببینید.
<expression> در
پنجره
بازشوی
«راهنمای
متنی» (tooltip)
شرط MC/DC
مربوطه در
خروجی genhtml
ظاهر
میشود -
بنابراین
مقادیر
خوانا برای
انسان برای
کاربرانی
که تلاش
میکنند
نتایج پوشش
را درک کنند
(به عنوان
مثال برای
توسعه
آزمونهای
رگرسیون
بیشتر جهت
بهبود پوشش)
مفید است.
برای یک <groupSize> و <index> مشخص، مقدار <expression> باید برای هر دو حالت «t» و «f» یکسان باشد.
- <unreachable>
- اگر این شرط
با یک دستور
‘دستنیافتنی’
(unreachable) مرتبط
باشد،
برابر با
‘U’
(تکنویسه)
است، و اگر
شرط
دستیافتنی
باشد وجود
نخواهد
داشت. هدف
از وضعیت
دستنیافتنی،
علامتگذاری
شرطهایی
است که
نباید در
گزارشهای
پوشش ظاهر
شوند - تا به
کاربران
امکان دهد
شرطهای
پوششنیافتهای
را که هرگز
نمیتوان
آنها را
پوشش داد
نادیده
بگیرند و
روی سایر
بخشهای
گزارش پوشش
تمرکز کنند.
برای اطلاعات بیشتر در مورد چگونگی تنظیم و استفاده از نشانگرهای استثنای شاخه، به بحث «–unreachable-script» در genhtml(1) <file://../man/genhtml.1.html> و بحث «ignore_unreachable_flag» در lcovrc(5) <file://../man/lcovrc.5.html> مراجعه کنید.
در ادامه نمونههایی از رکوردهای MC/DC آمده است که مقادیر <expression> آنها رشتههای خوانا برای انسان است:
MCDC:10,2,f,0,0,enable MCDC:10,2,t,1,0,enable ...
در این حالت، کد متناظر در خط ۱۰ بسیار محتمل است که مشابه این باشد:
if (enable ...) {
...
}
به گونهای که آزمون مربوطه به تغییر ‘enable’ از true به false حساس بوده است (اما نه برعکس).
عبارتهای با پیچیدگی دلخواه پشتیبانی میشوند - از جمله عبارتهایی که حاوی کاما هستند (برای مثال، در عبارتی که شامل یک فراخوانی تابع است).
توجه داشته باشید که ابزارهای خاص ممکن است عباراتی را که از نظر ایستایی (statically) درست یا نادرست هستند حذف کنند یا نکنند - برای مثال، عبارتهایی که از پارامترهای الگو (template) استفاده میکنند. این امر مقایسه دادههای پوشش تولیدشده توسط دو ابزار مختلف را بالقوه پیچیده میکند.
خلاصههای پوشش MCDC در دو خط ذخیره میشوند:
MCF:<number of conditions found>
توجه داشته باشید که این شمارش شامل شرطهای «مستثنیشده» نمیشود. شاخههای مستثنیشده بهصورت رکوردهای MCDC ظاهر میشوند.
MCH:<number of condition hit>
توجه داشته باشید که این شمارش شامل شرطهای «مستثنیشده» نمیشود. شاخههای مستثنیشده بهصورت رکوردهای MCDC ظاهر میشوند.
سپس فهرستی از تعداد اجرا برای هر خط ابزارگذاریشده (یعنی خطی که منجر به تولید کد اجرایی شده است) وجود دارد:
DA:<line number>,<execution count>[,<checksum>]
توجه داشته باشید که ممکن است یک جمعآزمای (checksum) اختیاری برای هر خط ابزارگذاریشده وجود داشته باشد. پیادهسازی فعلی geninfo از درهمسازی MD5 به عنوان الگوریتم محاسبه چکسام استفاده میکند.
در انتهای هر بخش، خلاصهای از تعداد خطوط یافتشده و تعداد خطوطی که در عمل ابزارگذاری شدهاند وجود دارد:
LH:<number of lines with a non-zero execution count> LF:<number of instrumented lines>
هر بخش با این عبارت پایان مییابد:
end_of_record
علاوه بر فایل اصلی کد منبع، بخشهایی برای تمامی فایلهای #include شده که شامل کد اجرایی نیز هستند وجود دارد.
توجه داشته باشید که مسیر مطلق یک فایل منبع، از طریق تفسیر محتویات فایل .gcno مربوطه تولید میشود (برای اطلاعات بیشتر در مورد این نوع فایل به gcov(1) <file://../man/gcov.1.html> مراجعه کنید). نام فایلهای نسبی با دایرکتوریای که فایل .gcno در آن یافت میشود پیشوند میگیرند.
همچنین توجه داشته باشید که پیوندهای نمادین به فایل .gcno تفکیک خواهند شد تا مسیر واقعی فایل به جای مسیر پیوند استفاده شود. این رویکرد برای عملکرد این سازوکار با فایلهای /proc/gcov ضروری است..SH "فایلها (FILES)"
- /etc/lcovrc
- فایل پیکربندی سراسری سیستم.
- ~/.lcovrc
- فایل پیکربندی اختصاصی کاربر.
- bin/getp4version
- اسکریپت نمونه برای استفاده با --version-script که شناسههای نگارش را از طریق Perforce به دست میآورد.
- bin/get_signature
- اسکریپت نمونه برای استفاده با --version-script که از md5hash به عنوان شناسههای نگارش استفاده میکند.
نویسندگان (AUTHORS)
Peter Oberparleiter <<Peter.Oberparleiter@de.ibm.com>>
- Henry Cox <<henry.cox@mediatek.com>>
- بخشهای فیلترسازی، مدیریت خطا و اجرای موازی.
همچنین ببینید (SEE ALSO)
genhtml(1) <file://../man/genhtml.1.html>, lcov(1) <file://../man/lcov.1.html>, lcovrc(5) <file://../man/lcovrc.5.html>, gcov(1) <file://../man/gcov.1.html>, llvm2lcov(1) <file://../man/llvm2lcov.1.html>
کپیرایت و تکثیر (COPYRIGHT)
2024-2026, LCOV Project
| 2026-07-07 | 2.5 |