VALGRIND(1) دستورات عمومی کاربر VALGRIND(1)

valgrind - مجموعه‌ای از ابزارها برای اشکال‌زدایی و تحلیل کارایی برنامه‌ها

valgrind [valgrind-options] [your-program] [your-program-options]

Valgrind برنامه‌ای انعطاف‌پذیر برای اشکال‌زدایی و تحلیل کارایی (پروفایلینگ) فایل‌های اجرایی لینوکس است. این برنامه از یک هسته، که یک پردازنده شبیه‌سازی‌شده نرم‌افزاری ارائه می‌دهد، و مجموعه‌ای از ابزارهای اشکال‌زدایی و تحلیل کارایی تشکیل شده است. معماری آن ماژولار است، به طوری که ابزارهای جدید می‌توانند به سادگی و بدون برهم زدن ساختار موجود ایجاد شوند.

برخی از گزینه‌های شرح داده‌شده در ادامه با تمام ابزارهای والگریند کار می‌کنند و برخی دیگر تنها با چند ابزار یا یک ابزار خاص کارایی دارند. بخش «گزینه‌های مم‌چک (MEMCHECK OPTIONS)» و بخش‌های پس از آن، گزینه‌های مختص هر ابزار را توضیح می‌دهند.

این صفحه راهنما تنها نحوه استفاده و گزینه‌های پایه را پوشش می‌دهد. برای اطلاعات جامع‌تر، لطفاً مستندات HTML موجود بر روی سیستم خود را در $INSTALL/share/doc/valgrind/html/index.html یا به صورت برخط در http://www.valgrind.org/docs/manual/index.html مشاهده کنید.

مهم‌ترین گزینه منفرد.

--tool=<toolname> [default: memcheck]

اجرای ابزار والگریند با نام toolname، به عنوان مثال memcheck، cachegrind، callgrind، helgrind، drd، massif، dhat، lackey، none، exp-bbv و غیره.

این گزینه‌ها با تمام ابزارها کار می‌کنند.

-h --help

نمایش راهنما برای تمامی گزینه‌ها، هم برای هسته و هم برای ابزار انتخاب‌شده. در صورت تکرار این گزینه، معادل با تعیین --help-debug خواهد بود.

--help-debug

همانند --help، اما علاوه بر آن گزینه‌های اشکال‌زدایی را نیز فهرست می‌کند که معمولاً فقط برای توسعه‌دهندگان والگریند کاربرد دارند.

--version

نمایش شماره نسخه هسته والگریند. ابزارها می‌توانند شماره نسخه مخصوص به خود را داشته باشند. سازوکاری تعبیه شده است تا اطمینان حاصل شود ابزارها تنها زمانی اجرا می‌شوند که نسخه هسته برای آن‌ها شناخته‌شده و سازگار باشد. این کار به منظور به حداقل رساندن احتمال بروز مشکلات عجیب ناشی از ناسازگاری نسخه ابزار و هسته انجام شده است.

-q, --quiet

اجرای بی‌صدا، و تنها چاپ پیام‌های خطا. زمانی مفید است که آزمون‌های رگرسیون (regression tests) یا سازوکار آزمون خودکار دیگری را اجرا می‌کنید.

-v, --verbose

ارائه جزئیات بیشتر (حالت پرگویی). اطلاعات بیشتری را درباره جنبه‌های گوناگون برنامه شما ارائه می‌دهد، مانند: اشیاء اشتراکی بارگذاری‌شده، سرکوب‌های استفاده‌شده، پیشرفت موتورهای ابزار دقیق و اجرا، و هشدارهایی پیرامون رفتارهای غیرعادی. تکرار این گزینه سطح جزئیات خروجی را افزایش می‌دهد.

--trace-children=<yes|no> [default: no]

در صورت فعال بودن، والگریند به درون زیرپردازش‌هایی که از طریق فراخوانی سیستمی exec آغاز شده‌اند نیز ردگیری انجام می‌دهد. این گزینه برای برنامه‌های چندپردازشی ضروری است.

توجه داشته باشید که والگریند پردازش فرزند ناشی از fork را ردگیری می‌کند (انجام ندادن آن دشوار خواهد بود، چرا که fork یک کپی همسان از پردازش می‌سازد)، بنابراین نام‌گذاری این گزینه شاید چندان دقیق نباشد. با این حال، اکثر فرزندان فراخوانی‌های fork بلافاصله فراخوانی exec را اجرا می‌کنند.

--trace-children-skip=patt1,patt2,...

این گزینه تنها زمانی اثرگذار است که --trace-children=yes تعیین شده باشد. این گزینه امکان نادیده گرفتن برخی فرزندان را فراهم می‌کند. این گزینه فهرستی جداشده با کاما از الگوها برای نام فایل‌های اجرایی فرزند که والگریند نباید به درون آن‌ها ردگیری کند را دریافت می‌نماید. الگوها می‌توانند شامل نویسه‌های عام ? و * باشند که معنای متداول خود را دارند.

این امر می‌تواند برای هرس کردن شاخه‌های نامربوط از درخت پردازش‌های در حال اجرا بر روی والگریند مفید باشد. اما هنگام استفاده از آن باید احتیاط کنید. وقتی والگریند از ردگیری به درون یک فایل اجرایی صرف‌نظر می‌کند، نه‌تنها از ردگیری آن فایل اجرایی، بلکه از ردگیری تمامی پردازش‌های فرزند آن فایل اجرایی نیز صرف‌نظر می‌کند. به عبارت دیگر، این فلگ صرفاً مانع توقف ردگیری در فایل‌های اجرایی مشخص‌شده نمی‌شود -- بلکه از ردگیری کل زیردرخت‌های پردازش که ریشه در هر یک از فایل‌های اجرایی مشخص‌شده دارند، صرف‌نظر می‌کند.

--trace-children-skip-by-arg=patt1,patt2,...

همانند --trace-children-skip است، با یک تفاوت: تصمیم‌گیری درباره اینکه آیا به درون یک پردازش فرزند ردگیری صورت گیرد یا خیر، با بررسی آرگومان‌های پردازش فرزند انجام می‌شود، نه نام فایل اجرایی آن.

--child-silent-after-fork=<yes|no> [default: no]

در صورت فعال بودن، والگریند هیچ‌گونه خروجی اشکال‌زدایی یا گزارش‌گیری برای پردازش فرزندی که در نتیجه فراخوانی fork ایجاد شده است، نمایش نمی‌دهد. این کار می‌تواند هنگام کار با پردازش‌هایی که فرزند ایجاد می‌کنند، از سردرگمی خروجی بکاهد (هرچند ممکن است گمراه‌کننده‌تر شود). این گزینه به‌ویژه همراه با --trace-children= مفید است. همچنین استفاده از این گزینه در صورتی که درخواست خروجی XML داده‌اید (--xml=yes) قویاً توصیه می‌شود؛ زیرا در غیر این صورت، خروجی XML پردازش فرزند و والد ممکن است با یکدیگر آمیخته شده و معمولاً بی‌استفاده گردد.

--vgdb=<no|yes|full> [default: yes]

والگریند در صورت تعیین --vgdb=yes یا --vgdb=full، قابلیت "gdbserver" را فراهم می‌کند. این قابلیت به یک اشکال‌زدای خارجی GNU GDB اجازه می‌دهد تا هنگام اجرای برنامه شما بر روی والگریند، آن را کنترل و اشکال‌زدایی کند. --vgdb=full سربار کارایی قابل توجهی به همراه دارد، اما نقاط توقف (breakpoints) و نقاط نظارت (watchpoints) دقیق‌تری فراهم می‌آورد. برای توضیحات دقیق، بخش Debugging your program using Valgrind's gdbserver and GDB را ببینید.

اگر gdbserver داخلی فعال باشد اما در حال حاضر هیچ gdbای مورد استفاده قرار نگرفته باشد، ابزار خط فرمان vgdb می‌تواند «دستورات نظارتی» (monitor commands) را از یک شل به والگریند ارسال کند. هسته والگریند مجموعه‌ای از دستورات نظارتی والگریند را ارائه می‌دهد. یک ابزار می‌تواند به‌طور اختیاری دستورات نظارتی ویژه آن ابزار را ارائه دهد که در فصل مربوط به ابزار مستند شده‌اند.

--vgdb-error=<number> [default: 999999999]

زمانی از این گزینه استفاده کنید که gdbserver والگریند با --vgdb=yes یا --vgdb=full فعال شده باشد. ابزارهایی که خطاها را گزارش می‌کنند، پیش از متوقف کردن برنامه و انتظار برای اتصال شما از طریق GDB، منتظر گزارش شدن به تعداد "number" خطا می‌مانند. بنابراین مقدار صفر باعث می‌شود که gdbserver پیش از اجرای برنامه شما راه‌اندازی شود. این شیوه معمولاً برای درج نقاط توقف GDB پیش از اجرا به کار می‌رود، و همچنین با ابزارهایی که خطا گزارش نمی‌کنند، مانند Massif نیز کار می‌کند.

--vgdb-stop-at=<set> [default: none]

زمانی از این گزینه استفاده کنید که gdbserver والگریند با --vgdb=yes یا --vgdb=full فعال شده باشد. سرور gdb والگریند پس از گزارش شدن تعداد خطاهای تعیین‌شده در --vgdb-error، به ازای هر خطا فراخوانی می‌شود. علاوه بر این می‌توانید درخواست کنید سرور gdb والگریند برای رویدادهای دیگر نیز فراخوانی شود که به یکی از روش‌های زیر تعیین می‌شوند:
•فهرستی جداشده با کاما از یک یا چند مورد از startup exit abexit valgrindabexit.

مقادیر startup exit valgrindabexit به ترتیب نشان‌دهنده فراخوانی gdbserver پیش از اجرای برنامه، پس از آخرین دستورالعمل برنامه، و هنگام خروج غیرعادی والگریند (مانند خطای داخلی، اتمام حافظه، و غیره) هستند.

گزینه abexit مشابه exit است، اما تعیین می‌کند که gdbserver تنها زمانی فراخوانی شود که برنامه شما به طور غیرعادی خارج شود (یعنی با کد خروجی غیر از صفر).

نکته: startup و --vgdb-error=0 هر دو باعث می‌شوند سرور gdb والگریند پیش از اجرای برنامه شما فراخوانی شود. گزینه --vgdb-error=0 علاوه بر این باعث می‌شود برنامه شما روی تمامی خطاهای بعدی متوقف گردد.

•all برای تعیین کل مجموعه. این معادل با --vgdb-stop-at=startup,exit,abexit,valgrindabexit است.
•none برای مجموعه خالی.

--track-fds=<yes|no|all> [default: no]

در صورت فعال بودن، والگریند فهرستی از توصیف‌کننده‌های باز فایل را در هنگام خروج یا بر حسب درخواست، از طریق دستور نظارتی gdbserver یعنی v.info open_fds چاپ می‌کند. در کنار هر توصیف‌کننده فایل، یک ردپای پشته (stack backtrace) از محل باز شدن فایل و هرگونه جزئیات مرتبط با توصیف‌کننده فایل مانند نام فایل یا جزئیات سوکت چاپ می‌شود. از all برای گنجاندن گزارش پیرامون stdin، stdout و stderr استفاده کنید.

--modify-fds=<no|high> [default: no]

در صورت فعال بودن، هنگامی که برنامه یک توصیف‌کننده فایل جدید باز می‌کند، بالاترین توصیف‌کننده فایل در دسترس به جای پایین‌ترین آن بازگردانده می‌شود.

--time-stamp=<yes|no> [default: no]

در صورت فعال بودن، در ابتدای هر پیام نشانگری از زمان سپری‌شده واقعی (wallclock) از زمان راه‌اندازی، به صورت روز، ساعت، دقیقه، ثانیه و میلی‌ثانیه درج می‌شود.

--log-fd=<number> [default: 2, stderr]

مشخص می‌کند که والگریند باید تمام پیام‌های خود را به توصیف‌کننده فایل تعیین‌شده بفرستد. مقدار پیش‌فرض، 2، کانال خطای استاندارد (stderr) است. توجه داشته باشید که این ممکن است با استفاده خود برنامه کلاینت از stderr تداخل پیدا کند، زیرا خروجی والگریند با خروجی ارسالی کلاینت به stderr درهم‌آمیخته خواهد شد.

--log-file=<filename>

مشخص می‌کند که والگریند باید تمام پیام‌های خود را به فایل تعیین‌شده بفرستد. اگر نام فایل خالی باشد، باعث لغو اجرا (abort) می‌شود. سه مشخصه‌کننده قالب ویژه وجود دارد که می‌توان در نام فایل استفاده کرد.

%p با شناسه پردازش فعلی (PID) جایگزین می‌شود. این برای برنامه‌هایی که چندین پردازش را فراخوانی می‌کنند بسیار مفید است. هشدار: اگر از --trace-children=yes استفاده می‌کنید و برنامه شما چندین پردازش را فراخوانی می‌کند، یا برنامه شما فرآیند fork انجام می‌دهد بدون اینکه پس از آن exec را فراخوانی کند، و شما از این مشخصه‌کننده (یا مشخصه‌کننده %q در زیر) استفاده نکنید، خروجی والگریند از تمام آن پردازش‌ها به یک فایل ریخته می‌شود که احتمالاً درهم‌ریخته و ناقص خواهد بود. نکته: اگر برنامه fork کند و پس از آن exec را فراخوانی کند، خروجی والگریند برای فرزند در بازه زمانی بین fork و exec از دست خواهد رفت. خوشبختانه این شکاف برای اکثر برنامه‌ها بسیار ناچیز است؛ و برنامه‌های امروزی در هر صورت از posix_spawn استفاده می‌کنند.

%n با یک شماره ترتیبی فایل که برای این پردازش یکتا است جایگزین می‌شود. این برای پردازش‌هایی مفید است که چندین فایل از یک الگوی نام فایل یکسان تولید می‌کنند.

%q{FOO} با محتوای متغیر محیطی FOO جایگزین می‌شود. اگر بخش {FOO} نادرست باشد، باعث لغو اجرا می‌شود. این مشخصه‌کننده به ندرت مورد نیاز است، اما در شرایط خاص (مثلاً هنگام اجرای برنامه‌های MPI) بسیار کاربردی است. ایده این است که متغیری را مشخص کنید که برای هر پردازش در کار مقدار متفاوتی داشته باشد، برای مثال BPROC_RANK یا هر متغیر دیگری که در پیکربندی MPI شما صدق می‌کند. اگر متغیر محیطی نام‌برده تنظیم نشده باشد، باعث لغو اجرا می‌شود. توجه داشته باشید که در برخی شل‌ها، ممکن است نیاز باشد نویسه‌های { و } با یک بک‌اسلش اسکیپ شوند.

%% با % جایگزین می‌شود.

اگر به دنبال % هر نویسه دیگری بیاید، باعث لغو اجرا خواهد شد.

اگر نام فایل یک نام فایل نسبی باشد، در دایرکتوری کاری اولیه برنامه قرار می‌گیرد: این دایرکتوری جاری در لحظه شروع اجرای برنامه پس از fork یا exec است. اگر یک نام فایل مطلق را مشخص کند (یعنی با '/' شروع شود)، در همان مسیر قرار می‌گیرد.

--log-socket=<ip-address:port-number>

مشخص می‌کند که والگریند باید تمام پیام‌های خود را به پورت مشخص‌شده در آدرس IP تعیین‌شده بفرستد. ممکن است پورت حذف شود که در این صورت از پورت 1500 استفاده می‌شود. اگر اتصال به سوکت مشخص‌شده برقرار نشود، والگریند به نوشتن خروجی در خطای استاندارد (stderr) بازمی‌گردد. این گزینه برای استفاده به همراه برنامه valgrind-listener در نظر گرفته شده است. برای جزئیات بیشتر، بخش the commentary در راهنما را ببینید.

--enable-debuginfod=<no|yes> [default: yes]

در صورت فعال بودن، چنانچه آدرس‌های سرور جداشده با فاصله در متغیر محیطی $DEBUGINFOD_URLS وجود داشته باشد، والگریند تلاش خواهد کرد تا اطلاعات اشکال‌زدایی مفقود (debuginfo) را از سرورهای debuginfod بارگیری کند. این گزینه تنها بر روی لینوکس پشتیبانی می‌شود.

این گزینه‌ها توسط تمام ابزارهایی که می‌توانند خطاها را گزارش کنند، مانند Memcheck (و نه Cachegrind)، استفاده می‌شوند.

--xml=<yes|no> [default: no]

در صورت فعال بودن، بخش‌های مهم خروجی (مانند پیام‌های خطای ابزار) به جای متن ساده، در قالب XML خواهند بود. علاوه بر این، خروجی XML به کانال خروجی متفاوتی نسبت به خروجی متن ساده ارسال خواهد شد. بنابراین، شما باید از یکی از گزینه‌های --xml-fd، --xml-file یا --xml-socket برای تعیین محل ارسال خروجی XML استفاده کنید.

پیام‌های کم‌اهمیت‌تر همچنان به صورت متن ساده چاپ می‌شوند، اما از آنجا که خروجی XML و خروجی متن ساده به کانال‌های خروجی متفاوتی ارسال می‌شوند (مقصد خروجی متن ساده همچنان توسط --log-fd، --log-file و --log-socket) کنترل می‌شود) این موضوع نباید مشکلی ایجاد کند.

هدف این گزینه آسان‌تر کردن کار برای ابزارهایی است که خروجی والگریند را به عنوان ورودی مصرف می‌کنند، مانند رابط‌های کاربری گرافیکی (GUI). در حال حاضر این گزینه با Memcheck، Helgrind و DRD کار می‌کند. قالب خروجی در فایل docs/internals/xml-output-protocol4.txt در درخت کد منبع برای Valgrind 3.5.0 یا بالاتر مشخص شده است.

گزینه‌های پیشنهادی برای ارسال توسط یک رابط گرافیکی (GUI)، هنگام درخواست خروجی XML، عبارتند از: --xml=yes برای فعال کردن خروجی XML، --xml-file برای ارسال خروجی XML به یک فایل (احتمالاً انتخاب‌شده توسط GUI)، --log-file برای ارسال خروجی متن ساده به فایل دوم انتخاب‌شده توسط GUI، --child-silent-after-fork=yes، و -q برای محدود کردن خروجی متن ساده به پیام‌های خطای بحرانی ایجادشده توسط خود والگریند. برای مثال، ناتوانی در خواندن یک فایل سرکوب (suppressions) مشخص‌شده یک پیام خطای بحرانی محسوب می‌شود. بدین ترتیب، برای یک اجرای موفق، فایل خروجی متنی خالی خواهد بود؛ اما اگر خالی نباشد، حاوی اطلاعات مهمی است که کاربر رابط گرافیکی باید از آن آگاه شود.

--xml-fd=<number> [default: -1, disabled]

مشخص می‌کند که والگریند باید خروجی XML خود را به توصیف‌گر فایل (file descriptor) تعیین‌شده ارسال کند. این گزینه باید همراه با --xml=yes استفاده شود.

--xml-file=<filename>

مشخص می‌کند که والگریند باید خروجی XML خود را به فایل تعیین‌شده ارسال کند. این گزینه باید همراه با --xml=yes استفاده شود. هر توالی %p یا %q که در نام فایل ظاهر شود، دقیقاً به همان روشی که برای --log-file عمل می‌کند، بسط داده خواهد شد. برای جزئیات به توضیحات --log-file مراجعه کنید.

--xml-socket=<ip-address:port-number>

مشخص می‌کند که والگریند باید خروجی XML خود را به درگاه (پورت) مشخص‌شده در آدرس IP تعیین‌شده ارسال کند. این گزینه باید همراه با --xml=yes استفاده شود. ساختار آرگومان همانند ساختار مورد استفاده توسط --log-socket است. برای جزئیات بیشتر به توضیحات --log-socket مراجعه کنید.

--xml-user-comment=<string>

یک رشته توضیح اضافی کاربر را در ابتدای خروجی XML درج می‌کند. فقط زمانی کار می‌کند که --xml=yes مشخص شده باشد؛ در غیر این صورت نادیده گرفته می‌شود.

--demangle=<yes|no> [default: yes]

فعال/غیرفعال کردن رمزگشایی خودکار نام‌ها (demangling) برای زبان‌های C++، D، Rust، Java و Ada. این گزینه به طور پیش‌فرض فعال است. در صورت فعال بودن، والگریند تلاش می‌کند نام‌های رمزگذاری‌شده در زبان‌های ذکرشده را به چیزی نزدیک به نام اصلی آن‌ها برگرداند. توجه داشته باشید که ابزار callgrind همیشه رمزگشایی نام‌های Ada را غیرفعال می‌کند تا بتواند توابع و رویه‌های سربارگذاری‌شده (overloaded) را در گراف فراخوانی تفکیک کند. بخش رمزگشا نمادهای تغییرنام‌یافته توسط نسخه‌های 2.X، 3.X و 4.X از g++ را مدیریت می‌کند.

یک نکته مهم درباره رمزگشایی نام‌ها این است که نام توابع ذکرشده در فایل‌های سرکوب باید به شکل تغییرنام‌یافته (mangled) باشند. والگریند هنگام جستجو برای سرکوب‌های قابل‌اعمال، نام توابع را رمزگشایی نمی‌کند، زیرا در غیر این صورت محتوای فایل سرکوب به وضعیت سازوکار رمزگشایی والگریند وابسته شده و همچنین سرعت تطبیق سرکوب‌ها کاهش می‌یابد.

--num-callers=<number> [default: 12]

حداکثر تعداد مدخل‌های نمایش‌داده‌شده در ردگیری‌های پشته را که مکان‌های برنامه را مشخص می‌کنند، تعیین می‌کند. توجه داشته باشید که خطاها تنها بر اساس مکان چهار تابع بالایی (مکان در تابع فعلی، و مکان سه فراخواننده مستقیم آن) یکی می‌شوند (ادغام می‌گردند). بنابراین این گزینه بر تعداد کل خطاهای گزارش‌شده تأثیری ندارد.

حداکثر مقدار برای این گزینه ۵۰۰ است. توجه داشته باشید که مقادیر بالاتر باعث می‌شوند والگریند کمی کندتر اجرا شود و حافظه کمی بیشتری مصرف کند، اما هنگام کار با برنامه‌هایی با زنجیره‌های فراخوانی عمیقاً تو در تو می‌تواند مفید باشد.

--unw-stack-scan-thresh=<number> [default: 0] , --unw-stack-scan-frames=<number> [default: 5]

پشتیبانی از پیمایش پشته (stack-scanning) تنها روی اهداف ARM در دسترس است.

این گزینه‌ها باز کردن پشته (stack unwinding) از طریق پیمایش پشته را فعال و کنترل می‌کنند. هنگامی که سازوکارهای عادی باز کردن پشته -- استفاده از رکوردهای Dwarf CFI و دنبال کردن اشاره‌گر فریم (frame-pointer) -- با شکست مواجه شوند، پیمایش پشته ممکن است بتواند ردگیری پشته را بازیابی کند.

توجه داشته باشید که پیمایش پشته یک سازوکار تقریبی و اکتشافی است که ممکن است نتایج بسیار گمراه‌کننده یا حتی هیچ نتیجه‌ای ارائه ندهد. این ویژگی تنها باید در شرایط اضطراری استفاده شود؛ یعنی زمانی که باز کردن عادی پشته شکست می‌خورد اما داشتن ردگیری پشته با این وجود حائز اهمیت است.

پیمایش پشته یک روش ساده است: بخش بازکننده پشته، کلمات (words) را از پشته می‌خواند و سعی می‌کند با بررسی اینکه آیا آنها دقیقاً به بعد از دستورالعمل‌های فراخوانی ARM یا Thumb اشاره دارند یا خیر، حدس بزند کدام‌یک ممکن است نشانی بازگشت باشند. در صورت تطابق، آن کلمه به ردگیری برگشتی (backtrace) اضافه می‌شود.

خطر اصلی زمانی رخ می‌دهد که یک فراخوانی تابع بازمی‌گردد و نشانی بازگشت آن بر روی پشته باقی می‌ماند، سپس تابع جدیدی فراخوانی می‌شود اما تابع جدید نشانی قدیمی را بازنویسی نمی‌کند. نتیجه این است که ردگیری برگشتی ممکن است حاوی مدخل‌هایی برای توابعی باشد که قبلاً بازگشته‌اند و بنابراین بسیار گیج‌کننده باشد.

محدودیت دوم این پیاده‌سازی این است که تنها صفحه‌ای (معمولاً ۴ کیلوبایت) را که شامل اشاره‌گر پشته اولیه است پیمایش می‌کند. اگر فریم‌های پشته بزرگ باشند، ممکن است تنها تعداد انگشت‌شماری (یا حتی هیچ مدخلی) در ردگیری حاضر باشند. همچنین، اگر بدشانس باشید و اشاره‌گر پشته اولیه نزدیک انتهای صفحه حاوی آن باشد، ممکن است پیمایش تمام فریم‌های مهم را از دست بدهد.

به طور پیش‌فرض، پیمایش پشته غیرفعال است. کاربرد عادی آن این است که وقتی یک ردگیری پشته در حالت عادی بسیار کوتاه می‌شود، آن را درخواست کنید. بنابراین برای فعال‌سازی آن، از --unw-stack-scan-thresh=number استفاده کنید. این درخواست از والگریند می‌خواهد تا از پیمایش پشته برای «گسترش» ردگیری‌های پشته‌ای که کمتر از number فریم دارند، استفاده کند.

اگر پیمایش پشته انجام شود، حداکثر به تعداد فریم‌های مشخص‌شده توسط --unw-stack-scan-frames تولید خواهد کرد. معمولاً پیمایش پشته آن‌چنان مدخل‌های بیهوده‌ای تولید می‌کند که این مقدار به طور پیش‌فرض روی مقدار پایینی (۵) تنظیم شده است. در هیچ حالتی ردگیری پشته‌ای بزرگ‌تر از مقدار مشخص‌شده توسط --num-callers ایجاد نخواهد شد.

--error-limit=<yes|no> [default: yes]

در صورت فعال بودن، والگریند پس از مشاهده ۱۰٬۰۰۰٬۰۰۰ خطا در مجموع، یا ۱٬۰۰۰ خطای متفاوت، گزارش خطاها را متوقف می‌کند. این کار برای جلوگیری از تبدیل شدن سازوکار ردیابی خطا به یک سربار بزرگ کارایی در برنامه‌های دارای خطاهای متعدد است.

--error-exitcode=<number> [default: 0]

کد خروج جایگزینی را مشخص می‌کند که در صورت گزارش هرگونه خطا توسط والگریند در طول اجرا، بازگردانده شود. در صورت تنظیم روی مقدار پیش‌فرض (صفر)، مقدار بازگشتی از والگریند همیشه مقدار بازگشتی فرآیند شبیه‌سازی‌شده خواهد بود. هنگامی که روی مقداری غیرصفر تنظیم شود، در صورت شناسایی هرگونه خطا توسط والگریند، آن مقدار به جای کد خروج فرآیند بازگردانده می‌شود. این قابلیت برای استفاده از والگریند به عنوان بخشی از یک مجموعه آزمون خودکار بسیار مفید است، زیرا با بررسی کدهای بازگشتی به سادگی می‌توان مواردی را که والگریند برای آنها خطا گزارش کرده است شناسایی کرد. هنگامی که روی یک مقدار غیرصفر تنظیم شده باشد و والگریند هیچ خطایی شناسایی نکند، مقدار بازگشتی والگریند همان مقدار بازگشتی برنامه شبیه‌سازی‌شده خواهد بود.

--exit-on-first-error=<yes|no> [default: no]

اگر این گزینه فعال باشد، والگریند با وقوع اولین خطا خارج می‌شود. یک مقدار خروج غیرصفر باید با استفاده از گزینه --error-exitcode تعریف شده باشد. این گزینه زمانی که در حال اجرای آزمون‌های رگرسیون (regression tests) هستید یا از سازوکارهای آزمون خودکار دیگری استفاده می‌کنید، مفید است.

--error-markers=<begin>,<end> [default: none]

هنگامی که خطاها به صورت متن ساده خروجی داده می‌شوند (یعنی XML استفاده نمی‌شود)، --error-markers دستور می‌دهد که خطی حاوی رشته begin (end) قبل از (بعد از) هر خطا چاپ شود.

چنین خطوط نشانه‌گذاری، جستجو برای خطاها و/یا استخراج خطاها را در یک فایل خروجی که حاوی خطاهای والگریند آمیخته با خروجی برنامه است، تسهیل می‌کنند.

توجه داشته باشید که نشانه‌گذارهای خالی نیز پذیرفته می‌شوند. بنابراین، استفاده از تنها یک نشانه‌گذار شروع (یا پایان) امکان‌پذیر است.

--show-error-list=no|yes|all [default: no]

اگر این گزینه yes باشد، برای ابزارهایی که خطاها را گزارش می‌کنند، والگریند فهرست خطاهای شناسایی‌شده و فهرست سرکوب‌های استفاده‌شده را هنگام خروج نمایش می‌دهد. مقدار all مشخص می‌کند که فهرست خطاهای سرکوب‌شده نیز نمایش داده شود.

توجه داشته باشید که در سطح پرگویی (verbosity) ۲ و بالاتر، والگریند به طور خودکار فهرست خطاهای شناسایی‌شده و فهرست سرکوب‌های استفاده‌شده را در هنگام خروج نمایش می‌دهد، مگر اینکه --show-error-list=no انتخاب شده باشد.

-s

مشخص کردن -s معادل با --show-error-list=yes است.

--sigill-diagnostics=<yes|no> [default: yes]

فعال/غیرفعال کردن چاپ عیب‌یابی‌های دستورالعمل غیرمجاز (illegal instruction). به طور پیش‌فرض فعال است، اما در صورت ارائه --quiet به طور پیش‌فرض غیرفعال می‌شود. با مشخص کردن این گزینه همیشه می‌توان این رفتار پیش‌فرض را به صراحت لغو کرد.

در صورت فعال بودن، هر زمان که دستورالعملی مشاهده شود که والگریند قادر به رمزگشایی یا ترجمه آن نیست، پیش از ارسال سیگنال SIGILL به برنامه، یک پیام هشدار همراه با برخی اطلاعات عیب‌یابی چاپ می‌شود. اغلب یک دستورالعمل غیرمجاز نشان‌دهنده یک باگ در برنامه یا عدم پشتیبانی والگریند از آن دستورالعمل خاص است. اما برخی برنامه‌ها عمداً تلاش می‌کنند دستورالعملی را اجرا کنند که ممکن است پشتیبانی نشود و سیگنال SIGILL را دریافت (trap) کنند تا قابلیت‌های پردازنده را شناسایی نمایند. استفاده از این گزینه اجتناب از خروجی‌های عیب‌یابی را که در چنین مواردی دریافت می‌کردید، ممکن می‌سازد.

--keep-debuginfo=<yes|no> [default: no]

در صورت فعال بودن، نمادها و تمام اطلاعات اشکال‌زدایی دیگر برای کدهای تخلیه‌شده از حافظه نگهداری («آرشیو») می‌شوند. این کار به ردگیری‌های پشته ذخیره‌شده اجازه می‌دهد تا اطلاعات فایل/خط را برای کدهایی که dlclose شده‌اند (یا موارد مشابه) در بر گیرند. در استفاده از این گزینه احتیاط کنید، زیرا می‌تواند منجر به مصرف نامحدود حافظه برای برنامه‌هایی شود که مکرراً اشیاء مشترک (shared objects) را بارگذاری و تخلیه می‌کنند.

برخی ابزارها و برخی قابلیت‌ها پشتیبانی محدودی از اطلاعات اشکال‌زدایی آرشیوشده دارند. ابزار Memcheck به طور کامل از آن پشتیبانی می‌کند. به طور کلی، ابزارهایی که خطاها را گزارش می‌دهند می‌توانند از اطلاعات اشکال‌زدایی آرشیوشده برای نمایش ردگیری‌های پشته خطا استفاده کنند. محدودیت‌های شناخته‌شده عبارتند از: ردگیری پشته دسترسی قبلی به شرایط مسابقه (race condition) در Helgrind از اطلاعات اشکال‌زدایی آرشیوشده استفاده نمی‌کند. ابزار Massif (و به طور کلی‌تر قالب خروجی xtree Massif) از اطلاعات اشکال‌زدایی آرشیوشده استفاده نمی‌کند. تنها Memcheck تا حدی با --keep-debuginfo=yes آزمایش شده است، بنابراین سایر ابزارها ممکن است محدودیت‌های ناشناخته‌ای داشته باشند.

--show-below-main=<yes|no> [default: no]

به طور پیش‌فرض، ردگیری‌های پشته برای خطاها هیچ‌یک از توابعی را که زیر main ظاهر می‌شوند نمایش نمی‌دهند، زیرا در اکثر مواقع کدهای غیرجذاب کتابخانه C و/یا موارد نامفهوم هستند. متناوباً، اگر main در ردگیری پشته حضور نداشته باشد، ردگیری‌های پشته توابع زیر توابع شبیه به main (مانند __libc_start_main در glibc) را نمایش نخواهند داد. علاوه بر این، اگر توابع مشابه main در ردگیری حاضر باشند، به صورت (below main) نرمال‌سازی می‌شوند تا خروجی قطعی‌تر و یکدست‌تر شود.

در صورت فعال بودن این گزینه، تمام مدخل‌های ردگیری پشته نمایش داده خواهند شد و توابع شبه main نرمال‌سازی نمی‌شوند.

--fullpath-after=<string> [default: don't show source paths]

به طور پیش‌فرض والگریند تنها نام فایل‌ها را در ردگیری‌های پشته نمایش می‌دهد و مسیر کامل فایل‌های منبع را نشان نمی‌دهد. هنگام استفاده از والگریند در پروژه‌های بزرگ که فایل‌های منبع در چندین دایرکتوری مختلف قرار دارند، این امر می‌تواند ناخوشایند باشد. گزینه --fullpath-after یک راه‌حل انعطاف‌پذیر برای این مشکل ارائه می‌دهد. هنگامی که این گزینه تعیین شود، مسیر هر فایل منبع با این شرط بسیار مهم نمایش داده می‌شود: اگر string در مسیر یافت شود، آن‌گاه مسیر تا string و با احتساب آن حذف می‌شود، در غیر این صورت مسیر بدون تغییر نمایش داده خواهد شد. توجه داشته باشید که الزامی نیست string پیشوند مسیر باشد.

به عنوان مثال، فایلی به نام /home/janedoe/blah/src/foo/bar/xyzzy.c را در نظر بگیرید. تعیین --fullpath-after=/home/janedoe/blah/src/ باعث می‌شود والگریند نام را به صورت foo/bar/xyzzy.c نمایش دهد.

از آنجا که الزامی نیست رشته یک پیشوند باشد، گزینه --fullpath-after=src/ همان خروجی را تولید خواهد کرد. این ویژگی زمانی مفید است که مسیر حاوی کاراکترهای دلخواه تولیدشده توسط ماشین باشد. برای مثال، مسیر /my/build/dir/C32A1B47/blah/src/foo/xyzzy می‌تواند با استفاده از --fullpath-after=/blah/src/ به foo/xyzzy کوتاه شود.

اگر صرفاً می‌خواهید مسیر کامل را مشاهده کنید، کافی است یک رشته خالی تعیین کنید: --fullpath-after=. این یک حالت خاص نیست، بلکه صرفاً یک پیامد منطقی از قوانین فوق است.

در نهایت، شما می‌توانید از --fullpath-after چندین بار استفاده کنید. هر بار استفاده از آن باعث می‌شود والگریند به حالت تولید مسیرهای کامل سوییچ کرده و قانون پالایش فوق را اعمال کند. هر مسیر تولیدشده با تمام رشته‌های مشخص‌شده توسط --fullpath-after، به ترتیبی که تعیین شده‌اند، مقایسه می‌شود. اولین رشته‌ای که مطابقت داشته باشد، باعث کوتاه شدن مسیر به روش شرح‌داده‌شده در بالا می‌شود. اگر هیچ‌کدام مطابقت نداشته باشند، مسیر کامل نمایش داده می‌شود. این کار حذف پیشوندها را در مواردی که منابع از چندین دایرکتوری نامرتبط گرفته شده‌اند تسهیل می‌کند.

--extra-debuginfo-path=<path> [default: undefined and unused]

به طور پیش‌فرض والگریند در چندین مسیر شناخته‌شده به دنبال اشیاء اشکال‌زدایی (debug objects) می‌گردد، مانند /usr/lib/debug.

با این حال، ممکن است سناریوهایی وجود داشته باشد که در آنها مایل باشید اشیاء اشکال‌زدایی را در مکانی دلخواه قرار دهید، مانند یک حافظه خارجی هنگام اجرای والگریند بر روی دستگاه همراه با حافظه محلی محدود. مثال دیگر می‌تواند وضعیتی باشد که در آن مجوز نصب بسته‌های اشیاء اشکال‌زدایی را بر روی سیستمی که والگریند را روی آن اجرا می‌کنید ندارید.

در این سناریوها، می‌توانید با مشخص کردن --extra-debuginfo-path=/path/to/debug/objects یک مسیر مطلق را به عنوان مکانی اضافی و نهایی برای جستجوی اشیاء اشکال‌زدایی توسط والگریند ارائه دهید. مسیر ارائه‌شده به ابتدای نام مسیر مطلق شیء مورد جستجو الحاق خواهد شد. به عنوان مثال، اگر والگریند به دنبال اطلاعات اشکال‌زدایی برای /w/x/y/zz.so باشد و --extra-debuginfo-path=/a/b/c مشخص شده باشد، در مسیر /a/b/c/w/x/y/zz.so به دنبال شیء اشکال‌زدایی خواهد گشت.

این گزینه تنها باید یک بار مشخص شود. اگر چندین بار مشخص شود، تنها آخرین مورد اعمال خواهد شد.

--debuginfo-server=ipaddr:port [default: undefined and unused]

این یک ویژگی جدید و آزمایشی است که در نسخه 3.9.0 معرفی شده است.

در برخی سناریوها ممکن است خواندن اطلاعات اشکال‌زدایی از اشیاء ذخیره‌شده در یک ماشین دیگر راحت‌تر باشد. با این گزینه، والگریند در صورتی که نتواند شیء اشکال‌زدایی را در سامانه فایل محلی پیدا کند، از یک کارساز (سرور) debuginfo که روی ipaddr اجرا می‌شود و به درگاه port گوش می‌دهد، استعلام خواهد کرد.

کارساز debuginfo باید اتصالات TCP را روی درگاه port بپذیرد. کارساز debuginfo در فایل منبع auxprogs/valgrind-di-server.c قرار دارد. این برنامه تنها فایل‌ها را از دایرکتوری‌ای که در آن اجرا شده است ارائه می‌دهد. در صورت عدم تعیین، درگاه port هم در کلاینت و هم در سرور به طور پیش‌فرض ۱۵۰۰ است.

اگر والگریند با استفاده از کارساز debuginfo به دنبال اطلاعات اشکال‌زدایی برای /w/x/y/zz.so بگردد، بخش‌های مسیر فایل را حذف کرده و صرفاً zz.so را از سرور درخواست می‌کند. سرور نیز به نوبه خود تنها در دایرکتوری کاری فعلی خود به دنبال شیء اشکال‌زدایی منطبق خواهد گشت.

داده‌های debuginfo به درخواست والگریند در قطعات کوچک (۸ کیلوبایت) منتقل می‌شوند. هر بلوک با استفاده از LZO فشرده می‌شود تا زمان انتقال کاهش یابد. این پیاده‌سازی برای بهترین کارایی بر روی یک پیوند شبکه تک‌مرحله‌ای 802.11g (WiFi) تنظیم شده است.

توجه داشته باشید که بررسی‌ها برای تطابق اشیاء اصلی در برابر اشیاء اشکال‌زدایی، با استفاده از طرحواره GNU debuglink CRC، حتی هنگام استفاده از سرور debuginfo نیز انجام می‌شود. برای غیرفعال کردن چنین بررسی‌ای، باید گزینه --allow-mismatched-debuginfo=yes را نیز تعیین کنید.

به طور پیش‌فرض سیستم ساخت والگریند برنامه valgrind-di-server را برای پلتفرم هدف (target) می‌سازد، که مسلماً آن چیزی نیست که شما می‌خواهید. تا کنون نتوانسته‌ایم دریابیم که چگونه automake/autoconf را وادار کنیم آن را برای پلتفرم ساخت (build) بسازد. اگر می‌خواهید از آن استفاده کنید، باید با استفاده از دستور نمایش‌داده‌شده در بالای فایل auxprogs/valgrind-di-server.c آن را به صورت دستی دوباره کامپایل کنید.

والگریند همچنین می‌تواند اطلاعات اشکال‌زدایی را از طریق debuginfod بارگیری کند. برای اطلاعات بیشتر بخش DEBUGINFOD را ببینید.

--allow-mismatched-debuginfo=no|yes [no]

هنگام خواندن اطلاعات اشکال‌زدایی از اشیاء مجزای debuginfo، والگریند به طور پیش‌فرض با استفاده از سازوکار GNU debuglink بررسی می‌کند که اشیاء اصلی و debuginfo با یکدیگر مطابقت داشته باشند. این کار تضمین می‌کند که اطلاعات اشکال‌زدایی از اشیاء اشکال‌زدایی منسوخ‌شده خوانده نشوند، و همچنین اطمینان حاصل می‌کند که والگریند در نتیجه عدم تطابق‌ها دچار فروپاشی نخواهد شد.

این بررسی را می‌توان با استفاده از --allow-mismatched-debuginfo=yes لغو کرد. این کار ممکن است در مواردی مفید باشد که اشیاء debuginfo و اصلی به روش مناسب از یکدیگر تفکیک نشده باشند. با این حال هنگام استفاده از آن محتاط باشید: این کار تمام بررسی‌های یکپارچگی را غیرفعال می‌کند و مشاهده شده است که والگریند هنگام عدم تطابق اشیاء اصلی و اشکال‌زدایی دچار فروپاشی می‌شود.

--suppressions=<filename> [default: $PREFIX/lib/valgrind/default.supp]

یک فایل اضافی را برای خواندن توضیحات خطاهایی که باید سرکوب شوند، مشخص می‌کند. شما می‌توانید تا ۱۰۰ فایل سرکوب اضافی استفاده کنید.

--gen-suppressions=<yes|no|all> [default: no]

هنگامی که روی yes تنظیم شود، والگریند پس از هر خطای نمایش‌داده‌شده مکث کرده و خط زیر را چاپ می‌کند:
---- Print suppression ? --- [Return/N/n/Y/y/C/c] ----

فشردن کلید Ret، یا N Ret یا n Ret، باعث می‌شود والگریند بدون چاپ سرکوب برای این خطا، به اجرای خود ادامه دهد.

فشردن کلید Y Ret یا y Ret باعث می‌شود والگریند یک رکورد سرکوب برای این خطا بنویسد. سپس می‌توانید آن را کپی کرده و در یک فایل سرکوب جای‌گذاری کنید تا در آینده دیگر درباره این خطا پیامی دریافت نکنید.

هنگامی که روی all تنظیم شود، والگریند برای هر خطای گزارش‌شده، بدون پرسش از کاربر، یک رکورد سرکوب چاپ می‌کند.

این گزینه به ویژه برای برنامه‌های C++ بسیار کاربردی است، زیرا سرکوب‌ها را دقیقاً همان‌طور که نیاز است با نام‌های تغییرنام‌یافته (mangled) چاپ می‌کند.

توجه داشته باشید که سرکوب‌های چاپ‌شده تا حد امکان خاص و دقیق هستند. ممکن است بخواهید موارد مشابه را با افزودن نویسه‌های عمومی (wildcards) به نام توابع و استفاده از نویسه‌های عمومی در سطح فریم، یکی کنید (ادغام نمایید). امکانات نویسه‌های عمومی قدرتمند و در عین حال انعطاف‌پذیر هستند و با کمی ویرایش دقیق، می‌توانید یک خانواده کامل از خطاهای مرتبط را تنها با چند رکورد سرکوب، مهار کنید.

گاهی اوقات دو خطای متفاوت با یک رکورد سرکوب یکسان مهار می‌شوند؛ در این حالت والگریند سرکوب را بیش از یک بار در خروجی می‌آورَد، اما شما تنها به داشتن یک نسخه در فایل سرکوب خود نیاز دارید (البته داشتن بیش از یک مورد نیز مشکلی ایجاد نخواهد کرد). همچنین نام سرکوب به صورت <insert a suppression name here> داده می‌شود؛ این نام اهمیت چندانی ندارد و صرفاً همراه با گزینه -v که تمام رکوردهای سرکوب استفاده‌شده را چاپ می‌کند، استفاده می‌شود.

--input-fd=<number> [default: 0, stdin]

هنگام استفاده از --gen-suppressions=yes، والگریند در زمان وقوع هر خطا متوقف می‌شود تا ورودی صفحه‌کلید را از شما بخواند. به طور پیش‌فرض این ورودی از ورودی استاندارد (stdin) خوانده می‌شود که برای برنامه‌هایی که stdin را می‌بندند مشکل‌ساز است. این گزینه به شما امکان می‌دهد یک توصیف‌گر فایل جایگزین را برای خواندن ورودی تعیین کنید.

--dsymutil=no|yes [yes]

این گزینه تنها هنگام اجرای والگریند در سیستم‌عامل macOS مرتبط است.

سیستم‌عامل macOS از یک طرح پیوند اطلاعات اشکال‌زدایی (debuginfo) به تعویق افتاده استفاده می‌کند. هنگامی که فایل‌های شیء حاوی اطلاعات اشکال‌زدایی در یک .dylib یا یک فایل اجرایی پیوند داده می‌شوند، اطلاعات اشکال‌زدایی در فایل نهایی کپی نمی‌شوند. در عوض، اطلاعات اشکال‌زدایی باید به صورت دستی با اجرای dsymutil (یک ابزار ارائه‌شده توسط سیستم) روی فایل اجرایی یا .dylib پیوند داده شوند. اطلاعات اشکال‌زدایی ترکیب‌شده حاصل در پوشه‌ای در کنار فایل اجرایی یا .dylib، اما با پسوند .dSYM قرار می‌گیرد.

با تنظیم --dsymutil=no، والگریند مواردی را که در آنها پوشه .dSYM یا وجود ندارد، یا وجود دارد اما به نظر می‌رسد با فایل اجرایی یا .dylib مرتبط مطابقت ندارد (به احتمال زیاد به دلیل قدیمی بودن)، شناسایی می‌کند. در این موارد، والگریند یک پیام هشدار چاپ می‌کند اما هیچ اقدام دیگری انجام نمی‌دهد.

با تنظیم --dsymutil=yes، والگریند در چنین مواردی به طور خودکار dsymutil را بر حسب نیاز اجرا می‌کند تا اطلاعات اشکال‌زدایی را به‌روز کند. از تمام جهات کاربردی، اگر همیشه از --dsymutil=yes استفاده کنید، دیگر هیچ نیازی به اجرای دستی dsymutil یا اجرای آن به عنوان بخشی از سیستم ساخت برنامه شما وجود نخواهد داشت، زیرا والگریند آن را در صورت لزوم اجرا خواهد کرد.

والگریند برای اجرای dsymutil روی هیچ فایل اجرایی یا کتابخانه‌ای در پوشه‌های /usr، /bin، /sbin، /opt، /sw، /System، /Library یا /Applications تلاش نخواهد کرد، زیرا dsymutil در چنین شرایطی همیشه با شکست مواجه می‌شود. این شکست هم به این دلیل است که اطلاعات اشکال‌زدایی برای چنین مؤلفه‌های سیستمی پیش‌نصب‌شده‌ای در هیچ کجا موجود نیست، و هم به این دلیل که به مجوز نوشتن در آن دایرکتوری‌ها نیاز خواهد داشت.

هنگام استفاده از --dsymutil=yes محتاط باشید، زیرا باعث می‌شود پوشه‌های .dSYM قبلی بدون اخطار حذف شده و دوباره ایجاد شوند. همچنین توجه داشته باشید که dsymutil بسیار کند است و گاهی این کندی بیش از حد است.

--max-stackframe=<number> [default: 2000000]

حداکثر اندازه یک فریم پشته (stack frame). اگر اشاره‌گر پشته بیش از این مقدار جابجا شود، والگریند فرض می‌کند که برنامه در حال جابجایی به یک پشته دیگر است.

اگر برنامه شما آرایه‌های بزرگی دارد که روی پشته تخصیص داده شده‌اند، ممکن است لازم باشد از این گزینه استفاده کنید. والگریند اشاره‌گر پشته برنامه شما را ردیابی می‌کند. اگر این مقدار بیشتر از مقدار آستانه تغییر کند، والگریند فرض می‌کند که برنامه شما به پشته متفاوتی سوییچ می‌کند و Memcheck رفتاری متفاوت با زمانی که تغییر اشاره‌گر پشته کمتر از آستانه است، نشان می‌دهد. معمولاً این روش اکتشافی به خوبی کار می‌کند. با این حال، اگر برنامه شما ساختارهای بزرگی را روی پشته تخصیص دهد، این روش اکتشافی به اشتباه می‌افتد و متعاقباً Memcheck تعداد زیادی دسترسی نامعتبر به پشته را گزارش خواهد داد. این گزینه به شما امکان می‌دهد این آستانه را به مقدار متفاوتی تغییر دهید.

تنها در صورتی باید استفاده از این گزینه را مد نظر قرار دهید که خروجی اشکال‌زدایی والگریند به شما دستور این کار را بدهد. در این حالت، خروجی مقدار آستانه جدیدی را که باید مشخص کنید به شما خواهد گفت.

به طور کلی، تخصیص ساختارهای بزرگ روی پشته ایده بدی است، زیرا به راحتی ممکن است با کمبود فضای پشته مواجه شوید، به ویژه در سیستم‌هایی با حافظه محدود یا سیستم‌هایی که انتظار می‌رود تعداد زیادی ریسه (thread) را که هر کدام پشته کوچکی دارند پشتیبانی کنند، و همچنین به این دلیل که بررسی خطای انجام‌شده توسط Memcheck برای داده‌های تخصیص‌یافته در هیپ (heap) مؤثرتر از داده‌های تخصیص‌یافته در پشته است. اگر مجبور به استفاده از این گزینه شدید، ممکن است بخواهید بازنویسی کد خود را برای تخصیص روی هیپ به جای پشته مد نظر قرار دهید.

--main-stacksize=<number> [default: use current 'ulimit' value]

اندازه پشته ریسه اصلی (main thread) را مشخص می‌کند.

برای ساده‌سازی مدیریت حافظه خود، والگریند تمام فضای مورد نیاز برای پشته ریسه اصلی را در زمان راه‌اندازی رزرو می‌کند. این بدان معناست که باید اندازه پشته مورد نیاز را در ابتدای راه‌اندازی بداند.

به طور پیش‌فرض، والگریند از مقدار فعلی «ulimit» برای اندازه پشته، یا ۱۶ مگابایت (هر کدام که کمتر باشد) استفاده می‌کند. در بسیاری از موارد این امر اندازه‌ای در محدوده ۸ تا ۱۶ مگابایت به پشته می‌دهد که تقریباً برای اکثر برنامه‌ها هرگز سرریز نمی‌شود.

اگر به اندازه پشته کلی بزرگ‌تری نیاز دارید، از --main-stacksize برای تعیین آن استفاده کنید. آن را تنها به اندازه‌ای که واقعاً نیاز دارید بالا ببرید، زیرا رزرو فضایی بسیار بیشتر از نیاز شما (یعنی صدها مگابایت بیشتر از حد نیاز) تخصیص‌دهنده‌های حافظه والگریند را محدود کرده و ممکن است مقدار کل حافظه‌ای را که والگریند می‌تواند استفاده کند کاهش دهد. این موضوع در عمل تنها در ماشین‌های ۳۲ بیتی اهمیت دارد.

در لینوکس، می‌توانید پشته‌ای به اندازه حداکثر ۲ گیگابایت درخواست کنید. در صورتی که پشته نتواند تخصیص یابد، والگریند با یک پیام عیب‌یابی متوقف خواهد شد.

گزینه --main-stacksize تنها بر اندازه پشته برای ریسه اولیه برنامه تأثیر می‌گذارد. این گزینه هیچ ارتباطی با اندازه پشته سایر ریسه‌ها ندارد، زیرا والگریند آنها را تخصیص نمی‌دهد.

ممکن است لازم باشد از هر دو گزینه --main-stacksize و --max-stackframe به صورت توأم استفاده کنید. درک این نکته مهم است که --main-stacksize حداکثر اندازه کل پشته را تعیین می‌کند، در حالی که --max-stackframe بزرگ‌ترین اندازه هر تک‌فریم پشته را مشخص می‌سازد. شما باید مقدار --main-stacksize را خودتان محاسبه و تعیین کنید (معمولاً اگر برنامه شما خطای segfault دهد). اما والگریند در صورت نیاز، اندازه مورد نیاز --max-stackframe را به شما خواهد گفت.

همان‌طور که در توضیحات --max-stackframe نیز بحث شد، نیاز به یک پشته بزرگ نشانه‌ای از مشکلات احتمالی سازگاری و حمل‌پذیری است. بهترین توصیه این است که تمام داده‌های حجیم را در حافظه تخصیص‌یافته در هیپ قرار دهید.

--max-threads=<number> [default: 500]

به طور پیش‌فرض والگریند می‌تواند تا ۵۰۰ ریسه (thread) را مدیریت کند. گهگاه این تعداد خیلی کوچک است. از این گزینه برای ارائه یک حد متفاوت استفاده کنید؛ به عنوان مثال --max-threads=3000.

--realloc-zero-bytes-frees=yes|no [default: yes for glibc no otherwise]

رفتار تابع realloc() با اندازه صفر، در استاندارد C17 وابسته به پیاده‌سازی (implementation defined) و در استاندارد C23 تعریف‌نشده (undefined) است. والگریند تلاش می‌کند به همان شیوه سیستم زیربنایی و کتابخانه زمان اجرای C که روی آن پیکربندی و ساخته شده است عمل کند. با این حال، اگر از کتابخانه زمان اجرای C دیگری استفاده کنید، ممکن است این مقدار پیش‌فرض نادرست باشد. اگر مقدار yes باشد، آن‌گاه realloc حافظه را آزادسازی کرده و NULL برمی‌گرداند. اگر مقدار no باشد، realloc حافظه را آزاد نمی‌کند و با اندازه به گونه‌ای رفتار می‌شود که گویی یک بایت است.

به عنوان مثال، اگر از والگریندی استفاده می‌کنید که از طریق یک بسته روی یک توزیع لینوکس مبتنی بر GNU libc نصب شده است اما برنامه آزمایشی خود را با musl libc یا کتابخانه JEMalloc پیوند می‌دهید، استفاده از --realloc-zero-bytes-frees=no را مد نظر قرار دهید.

ابزار Address Sanitizer گزینه مشابه و حتی طولانی‌تری به نام allocator_frees_and_returns_null_on_realloc_zero دارد.

برای ابزارهایی که از نسخه اختصاصی خود برای malloc استفاده می‌کنند (مانند Memcheck، Massif، Helgrind و DRD)، گزینه‌های زیر اعمال می‌شوند.

--alignment=<number> [default: 8 or 16, depending on the platform]

به طور پیش‌فرض توابع malloc، realloc و غیره در والگریند بلوکی را برمی‌گردانند که نشانی شروع آن هم‌تراز با ۸ بایت یا ۱۶ بایت است (این مقدار به پلتفرم بستگی دارد و با پیش‌فرض پلتفرم مطابقت دارد). این گزینه به شما امکان می‌دهد هم‌ترازی (alignment) متفاوتی را مشخص کنید. مقدار ارائه‌شده باید بزرگ‌تر یا مساوی با مقدار پیش‌فرض، کوچک‌تر یا مساوی با ۴۰۹۶، و توانی از دو باشد.

--redzone-size=<number> [default: depends on the tool]

توابع malloc، realloc و غیره در والگریند بلوک‌های فاصله‌گذاری (padding) را قبل و بعد از هر بلوک هیپ تخصیص‌یافته توسط برنامه در حال اجرا اضافه می‌کنند. به چنین بلوک‌های فاصله‌گذاری «منطقه قرمز» (redzone) گفته می‌شود. مقدار پیش‌فرض اندازه منطقه قرمز به ابزار مورد استفاده بستگی دارد. برای مثال، Memcheck حداقل ۱۶ بایت را قبل و بعد از هر بلوک تخصیص‌یافته توسط کلاینت اضافه و محافظت می‌کند. این ویژگی امکان شناسایی سرریز منفی (underrun) یا سرریز مثبت (overrun) بلوک را تا ۱۶ بایت فراهم می‌سازد.

افزایش اندازه منطقه قرمز، تشخیص سرریزهای با فواصل بزرگ‌تر را ممکن می‌سازد، اما مقدار حافظه مصرفی والگریند را افزایش می‌دهد. کاهش اندازه منطقه قرمز حافظه مورد نیاز والگریند را کاهش می‌دهد اما شانس شناسایی سرریزها یا زیرریزها را نیز کم می‌کند، بنابراین توصیه نمی‌شود.

--xtree-memory=none|allocs|full [none]

ابزارهایی که جایگزین malloc، realloc و غیره در والگریند می‌شوند، می‌توانند به صورت اختیاری یک درخت اجرا (execution tree) تولید کنند که با جزئیات نشان می‌دهد کدام قطعه از کد مسئول مصرف حافظه هیپ است. برای توضیح دقیق درباره درخت‌های اجرا، بخش Execution Trees را ببینید.

هنگامی که روی none تنظیم شود، هیچ درخت اجرای حافظه‌ای تولید نمی‌شود.

هنگامی که روی allocs تنظیم شود، درخت اجرای حافظه تعداد فعلی بایت‌های تخصیص‌یافته و تعداد فعلی بلوک‌های تخصیص‌یافته را ارائه می‌دهد.

هنگامی که روی full تنظیم شود، درخت اجرای حافظه ۶ اندازه‌گیری مختلف را ارائه می‌دهد: تعداد فعلی بایت‌ها و بلوک‌های تخصیص‌یافته (مقادیر یکسان با allocs)، تعداد کل بایت‌ها و بلوک‌های تخصیص‌یافته، و تعداد کل بایت‌ها و بلوک‌های آزادشده.

توجه داشته باشید که سربار پردازنده (cpu) و حافظه برای تولید یک xtree به ابزار بستگی دارد. سربار پردازنده برای مقدار allocs کم است، زیرا اطلاعات مورد نیاز برای تولید این گزارش در هر صورت توسط ابزار نگهداری می‌شود. برای massif و helgrind، مشخص کردن full به معنای ثبت یک ردگیری پشته برای هر عملیات آزادسازی (free) است، در حالی که این ابزارها در حالت عادی تنها یک ردگیری پشته برای تخصیص (allocation) ثبت می‌کنند. برای Memcheck، سربار پردازنده برای مقدار full کم است، زیرا این گزینه تنها می‌تواند در ترکیب با --keep-stacktraces=alloc-and-free یا --keep-stacktraces=alloc-then-free استفاده شود، که خود از قبل یک ردگیری پشته را برای هر عملیات آزادسازی ثبت می‌کند. سربار حافظه بین ۵ تا ۱۰ کلمه (word) به ازای هر ردگیری پشته یکتا در xtree متغیر است، به علاوه حافظه مورد نیاز برای ثبت ردگیری پشته برای عملیات‌های آزادسازی، در صورتی که به طور خاص برای xtree مورد نیاز باشد.

--xtree-memory-file=<filename> [default: xtmemory.kcg.%p]

مشخص می‌کند که والگریند باید گزارش حافظه xtree را در فایل تعیین‌شده تولید کند. هر توالی %p یا %q که در نام فایل ظاهر شود، دقیقاً به همان روشی که برای --log-file عمل می‌کند، بسط داده خواهد شد. برای جزئیات به توضیحات --log-file مراجعه کنید.

اگر نام فایل حاوی پسوند .ms باشد، آن‌گاه قالب فایل تولیدشده قالب خروجی massif خواهد بود. اگر نام فایل حاوی پسوند .kcg باشد یا هیچ پسوندی ارائه نشده یا شناسایی نشود، آن‌گاه قالب فایل تولیدشده قالب خروجی callgrind خواهد بود.

برای توضیح دقیق درباره قالب‌های درخت اجرا، بخش Execution Trees را ببینید.

این گزینه‌ها برای تمام ابزارها اعمال می‌شوند، زیرا بر برخی سازوکارهای درونی و کمترشناخته‌شده هسته والگریند تأثیر می‌گذارند. بیشتر افراد نیازی به استفاده از آن‌ها نخواهند داشت.

--smc-check=<none|stack|all|all-non-file> [default: all-non-file for x86/amd64/s390x, stack for other archs]

این گزینه تشخیص کد خودتغییردهنده توسط والگریند را کنترل می‌کند. اگر هیچ بررسی‌ای انجام نشود، هنگامی که یک برنامه کدی را اجرا کرده و سپس روی آن کد جدیدی می‌نویسد و کد جدید را اجرا می‌کند، والگریند به اجرای ترجمه‌هایی که برای کد قدیمی ساخته است ادامه خواهد داد. این امر به احتمال زیاد منجر به رفتار نادرست و/یا از کار افتادن برنامه (کرش) خواهد شد.

برای معماری‌های «مدرن» -- یعنی هر معماری به غیر از x86، amd64 یا s390x -- مقدار پیش‌فرض stack است. دلیل این امر آن است که یک برنامه صحیح باید پس از اصلاح کد، اقدامی صریح برای برقراری مجدد همدوسی حافظه پنهان D-I (دستورالعمل و داده) انجام دهد. والگریند چنین اقداماتی را مشاهده کرده و رعایت می‌کند، که نتیجه آن مدیریت شفاف کد خودتغییردهنده بدون هیچ هزینه اضافی است.

برای x86، amd64 و s390x، نیازی نیست برنامه به سخت‌افزار اعلام کند که هماهنگ‌سازی همدوسی D-I لازم است. از این رو مقدار پیش‌فرض all-non-file است، که حالت معمول تولید کد در یک ناحیه ناشناس (غیروابسته به فایل) نگاشت‌شده با mmap را پوشش می‌دهد.

معانی چهار مقدار موجود به شرح زیر است: بدون تشخیص (none)، تشخیص کد خودتغییردهنده روی پشته (که توسط GCC برای پیاده‌سازی توابع تو در تو استفاده می‌شود) (stack)، تشخیص کد خودتغییردهنده در همه‌جا (all)، و تشخیص کد خودتغییردهنده در همه‌جا به جز در نگاشت‌های متکی به فایل (all-non-file).

اجرا با گزینه all سرعت والگریند را به طور محسوسی کاهش می‌دهد. اجرا با none به ندرت باعث افزایش سرعت می‌شود، چرا که در بیشتر برنامه‌ها مقدار بسیار کمی کد به صورت پویا تولید می‌شود. درخواست کلاینت VALGRIND_DISCARD_TRANSLATIONS جایگزینی برای --smc-check=all و --smc-check=all-non-file است که به تلاش بیشتری از سوی برنامه‌نویس نیاز دارد اما به والگریند اجازه می‌دهد برنامه شما را سریع‌تر اجرا کند، زیرا دقیقاً به آن اطلاع می‌دهد چه زمانی باید ترجمه‌ها مجدداً ساخته شوند.

--smc-check=all-non-file نسخه‌ای کم‌هزینه‌تر اما محدودتر از --smc-check=all ارائه می‌دهد. این گزینه به هر ترجمه‌ای که منشأ آن نگاشت‌های حافظه مبتنی بر فایل نباشد، بررسی‌هایی اضافه می‌کند. برنامه‌های کاربردی شاخصی که کد تولید می‌کنند، به عنوان مثال JITها در مرورگرهای وب، کد را در نواحی mmap ناشناس تولید می‌کنند، در حالی که کد «ثابت» مرورگر همواره در نگاشت‌های متکی به فایل قرار دارد. --smc-check=all-non-file از این ویژگی بهره می‌برد و سربار بررسی را به کدهایی محدود می‌کند که احتمالاً توسط JIT تولید شده‌اند.

--read-inline-info=<yes|no> [default: see below]

در صورت فعال بودن، والگریند اطلاعات مربوط به فراخوانی‌های توابع درون‌خطی (inlined) را از اطلاعات اشکال‌زدایی DWARF3 می‌خواند. این کار سرعت راه‌اندازی والگریند را کاهش داده و حافظه بیشتری مصرف می‌کند (به طور معمول به ازای هر قطعه کد درون‌خطی، ۶ کلمه و فضایی برای نام تابع)، اما منجر به ردیابی پشته (stacktrace) توصیفی‌تر و دقیق‌تری می‌شود. در حال حاضر، این قابلیت به طور پیش‌فرض تنها برای اهداف Linux، FreeBSD، Android و Solaris و فقط برای ابزارهای Memcheck، Massif، Helgrind و DRD فعال است. در اینجا نمونه‌ای از ردیابی پشته با --read-inline-info=no:
==15380== Conditional jump or move depends on uninitialised value(s)
==15380==    at 0x80484EA: main (inlinfo.c:6)
==15380== 
==15380== Conditional jump or move depends on uninitialised value(s)
==15380==    at 0x8048550: fun_noninline (inlinfo.c:6)
==15380==    by 0x804850E: main (inlinfo.c:34)
==15380== 
==15380== Conditional jump or move depends on uninitialised value(s)
==15380==    at 0x8048520: main (inlinfo.c:6)

و در اینجا همان خطاها با --read-inline-info=yes:

==15377== Conditional jump or move depends on uninitialised value(s)
==15377==    at 0x80484EA: fun_d (inlinfo.c:6)
==15377==    by 0x80484EA: fun_c (inlinfo.c:14)
==15377==    by 0x80484EA: fun_b (inlinfo.c:20)
==15377==    by 0x80484EA: fun_a (inlinfo.c:26)
==15377==    by 0x80484EA: main (inlinfo.c:33)
==15377== 
==15377== Conditional jump or move depends on uninitialised value(s)
==15377==    at 0x8048550: fun_d (inlinfo.c:6)
==15377==    by 0x8048550: fun_noninline (inlinfo.c:41)
==15377==    by 0x804850E: main (inlinfo.c:34)
==15377== 
==15377== Conditional jump or move depends on uninitialised value(s)
==15377==    at 0x8048520: fun_d (inlinfo.c:6)
==15377==    by 0x8048520: main (inlinfo.c:35)

--read-var-info=<yes|no> [default: no]

در صورت فعال بودن، والگریند اطلاعات مربوط به انواع و مکان‌های متغیرها را از اطلاعات اشکال‌زدایی DWARF3 می‌خواند. این کار سرعت راه‌اندازی والگریند را به طور قابل‌توجهی کاهش داده و حافظه بسیار بیشتری مصرف می‌کند، اما برای ابزارهایی که می‌توانند از آن بهره ببرند (Memcheck، Helgrind، DRD) می‌تواند منجر به پیام‌های خطای دقیق‌تری شود. به عنوان مثال، در اینجا چند خطای استاندارد صادرشده توسط Memcheck آمده است:
==15363== Uninitialised byte(s) found during client check request
==15363==    at 0x80484A9: croak (varinfo1.c:28)
==15363==    by 0x8048544: main (varinfo1.c:55)
==15363==  Address 0x80497f7 is 7 bytes inside data symbol "global_i2"
==15363== 
==15363== Uninitialised byte(s) found during client check request
==15363==    at 0x80484A9: croak (varinfo1.c:28)
==15363==    by 0x8048550: main (varinfo1.c:56)
==15363==  Address 0xbea0d0cc is on thread 1's stack
==15363==  in frame #1, created by main (varinfo1.c:45)

و در اینجا همان خطاها با --read-var-info=yes:

==15370== Uninitialised byte(s) found during client check request
==15370==    at 0x80484A9: croak (varinfo1.c:28)
==15370==    by 0x8048544: main (varinfo1.c:55)
==15370==  Location 0x80497f7 is 0 bytes inside global_i2[7],
==15370==  a global variable declared at varinfo1.c:41
==15370== 
==15370== Uninitialised byte(s) found during client check request
==15370==    at 0x80484A9: croak (varinfo1.c:28)
==15370==    by 0x8048550: main (varinfo1.c:56)
==15370==  Location 0xbeb4a0cc is 0 bytes inside local var "local"
==15370==  declared at varinfo1.c:46, in frame #1 of thread 1

--vgdb-poll=<number> [default: 5000]

به عنوان بخشی از حلقه اصلی خود، زمان‌بند والگریند بررسی می‌کند (poll) تا ببیند آیا فعالیتی (مانند یک دستور خارجی یا ورودی از سوی gdb) باید توسط gdbserver رسیدگی شود یا خیر. این نظرسنجی فعالیت پس از اجرای تعداد بلوک‌های پایه مشخص‌شده (یا اندکی بیشتر از تعداد بلوک‌های پایه مشخص‌شده) انجام می‌شود. این نظرسنجی بسیار کم‌هزینه است، بنابراین مقدار پیش‌فرض آن نسبتاً کم تعیین شده است. در صورتی که vgdb نتواند از فراخوانی سیستمی ptrace برای ایجاد وقفه در والگریند استفاده کند هنگامی که تمام نخ‌ها (بیشتر اوقات) در یک فراخوانی سیستمی مسدود هستند، می‌توانید این مقدار را بیشتر کاهش دهید.

--vgdb-shadow-registers=no|yes [default: no]

در صورت فعال شدن، gdbserver ثبات‌های سایه (shadow registers) والگریند را در دسترس GDB قرار می‌دهد. با این کار، مقدار ثبات‌های سایه والگریند می‌تواند با استفاده از GDB بررسی یا تغییر داده شود. آشکارسازی ثبات‌های سایه تنها با نسخه 7.1 یا بالاتر GDB کار می‌کند.

--vgdb-prefix=<prefix> [default: /tmp/vgdb-pipe]

برای ارتباط با gdb/vgdb، سرور gdbserver والگریند ۳ فایل ایجاد می‌کند (۲ نام‌لوله FIFO و یک فایل حافظه اشتراکی mmap). گزینه prefix دایرکتوری و پیشوند نام ایجاد این فایل‌ها را کنترل می‌کند.

--run-libc-freeres=<yes|no> [default: yes]

این گزینه تنها هنگام اجرای والگریند روی لینوکس با GNU libc کاربرد دارد.

کتابخانه C گنو (libc.so) که توسط تمام برنامه‌ها استفاده می‌شود، ممکن است برای کاربردهای داخلی خود حافظه تخصیص دهد. معمولاً هنگام پایان برنامه زحمت آزادسازی آن حافظه را به خود نمی‌دهد—چرا که فایده‌ای ندارد، زیرا هسته لینوکس در هر حال با خروج پردازه تمام منابع آن را بازپس می‌گیرد، بنابراین این کار تنها سرعت را کاهش می‌دهد.

توسعه‌دهندگان glibc متوجه شدند که این رفتار باعث می‌شود ابزارهای بررسی نشت حافظه، مانند والگریند، در هنگام خروج برنامه نشت‌هایی را به اشتباه در glibc گزارش کنند. برای جلوگیری از این مشکل، آن‌ها تابعی به نام __libc_freeres را به طور ویژه فراهم کردند تا glibc تمام حافظه‌ای را که تخصیص داده است آزاد کند. از این رو Memcheck تلاش می‌کند در هنگام خروج برنامه تابع __libc_freeres را اجرا کند.

متأسفانه در برخی نسخه‌های بسیار قدیمی glibc، تابع __libc_freeres به قدری دارای اشکال است که باعث بروز خطای نقض قطعه‌بندی (segmentation fault) می‌شود. این موضوع به ویژه در Red Hat 7.1 مشهود بود. بنابراین این گزینه به منظور جلوگیری از اجرای __libc_freeres فراهم شده است. اگر برنامه شما به نظر می‌رسد روی والگریند به خوبی اجرا می‌شود اما در هنگام خروج با خطای سگفالت متوقف می‌شود، ممکن است متوجه شوید که --run-libc-freeres=no آن را برطرف می‌کند، هرچند به قیمت احتمال گزارش نادرست نشت حافظه در libc.so.

--run-cxx-freeres=<yes|no> [default: yes]

این گزینه تنها هنگام اجرای والگریند بر روی برنامه‌های C++ در لینوکس، FreeBSD یا Solaris که از libstdc++ استفاده می‌کنند مرتبط است.

کتابخانه استاندارد C++ گنو (libstdc++.so) که توسط تمام برنامه‌های C++ کامپایل‌شده با g++ استفاده می‌شود، ممکن است برای مقاصد خود حافظه تخصیص دهد. معمولاً هنگام پایان برنامه زحمت آزادسازی آن حافظه را به خود نمی‌دهد—چرا که فایده‌ای ندارد، زیرا هسته در هر حال هنگام خروج پردازه تمام منابع آن را بازپس می‌گیرد، بنابراین این کار فقط سرعت را کاهش می‌دهد.

توسعه‌دهندگان gcc دریافتند که این رفتار موجب می‌شود ابزارهای بررسی نشت، مانند والگریند، در پایان برنامه نشت‌هایی را به غلط در libstdc++ گزارش دهند. به منظور جلوگیری از این امر، آن‌ها تابعی به نام __gnu_cxx::__freeres را اختصاصاً فراهم کردند تا libstdc++ تمام حافظه‌ای را که تخصیص داده است آزاد کند. بنابراین Memcheck سعی می‌کند __gnu_cxx::__freeres را در هنگام خروج اجرا نماید.

به دلیل انعطاف‌پذیری و مشکلات پیش‌بینی‌نشده در رابطه با __gnu_cxx::__freeres، گزینه --run-cxx-freeres=no وجود دارد، اگرچه به بهای احتمال گزارش نادرست نشت فضا در libstdc++.so.

--sim-hints=hint1,hint2,...

انتقال راهنماها و نکات گوناگون به والگریند که رفتار شبیه‌سازی‌شده را به شیوه‌های غیر استاندارد یا خطرناک اندکی تغییر می‌دهد، احتمالاً برای کمک به شبیه‌سازی قابلیت‌های نامتعارف. به طور پیش‌فرض هیچ راهنمایی فعال نیست. با احتیاط استفاده کنید! راهنماهای شناخته‌شده کنونی عبارتند از:
•lax-ioctls: در رسیدگی به ioctl بسیار آسان‌گیر باشید؛ تنها فرض بر این است که اندازه درست است. نیازی نیست کل بافر هنگام نوشتن مقداردهی اولیه شده باشد. بدون این گزینه، استفاده از برخی درایورهای دستگاه که دارای تعداد زیادی دستور عجیب ioctl هستند بسیار خسته‌کننده و دشوار می‌شود.
•fuse-compatible: فعال‌سازی مدیریت ویژه برای برخی فراخوانی‌های سیستمی که ممکن است در یک سیستم‌فایل FUSE مسدود شوند. این ممکن است هنگام اجرای والگریند بر روی یک برنامه چندنخی که از یک نخ برای مدیریت سیستم‌فایل FUSE و از نخ دیگری برای دسترسی به آن سیستم‌فایل استفاده می‌کند، لازم باشد.
•enable-outer: فعال‌سازی برخی سازوکارهای خاص مورد نیاز در شرایطی که برنامه‌ای که اجرا می‌شود خود والگریند باشد.
•no-inner-prefix: غیرفعال کردن چاپ پیشوند > در جلوی هر خط از خروجی stdout یا stderr در یک والگریند داخلی که توسط یک والگریند خارجی اجرا می‌شود. این هنگام اجرای آزمون‌های رگرسیون والگریند در یک پیکربندی خارجی/داخلی کاربرد دارد. توجه داشته باشید که پیشوند > همواره در ابتدای خطوط گزارش اشکال‌زدایی داخلی چاپ خواهد شد.
•no-nptl-pthread-stackcache: این راهنما تنها هنگام اجرای والگریند بر روی لینوکس مرتبط است؛ در FreeBSD، Solaris و macOS نادیده گرفته می‌شود.

کتابخانه GNU glibc pthread (libpthread.so) که توسط برنامه‌های چندنخی pthread استفاده می‌شود، حافظه پنهانی (cache) از پشته‌های pthread نگه می‌دارد. هنگامی که یک pthread پایان می‌یابد، حافظه مورد استفاده برای پشته pthread و برخی ساختارهای داده مرتبط با حافظه محلی نخ (thread local storage) همیشه بلافاصله آزاد نمی‌شوند. این حافظه در یک حافظه پنهان (تا اندازه‌ای مشخص) نگهداری می‌شود و در صورت شروع یک نخ جدید دوباره استفاده می‌شود.

این حافظه پنهان باعث می‌شود ابزار helgrind برخی خطاهای مثبت کاذب در رابطه با شرایط رقابت (race condition) را روی این حافظه پنهان‌شده گزارش کند، زیرا helgrind متدهای اولیه همگام‌سازی داخلی حافظه پنهان glibc را درک نمی‌کند. بنابراین، هنگام استفاده از helgrind، غیرفعال کردن این حافظه پنهان به جلوگیری از خطاهای مثبت کاذب شرایط رقابت کمک می‌کند، به ویژه هنگام استفاده از متغیرهای حافظه محلی نخ (مانند متغیرهایی که از توصیف‌کننده __thread استفاده می‌کنند).

هنگام استفاده از ابزار memcheck، غیرفعال کردن حافظه پنهان اطمینان حاصل می‌کند که حافظه استفاده‌شده توسط glibc برای مدیریت متغیرهای __thread در هنگام پایان کار یک نخ مستقیماً آزاد می‌شود.

توجه: والگریند این حافظه پنهان را با استفاده از برخی آگاهی‌های داخلی از پیاده‌سازی کش پشته glibc و با بررسی اطلاعات اشکال‌زدایی کتابخانه pthread غیرفعال می‌کند. بنابراین این تکنیک تا حدی شکننده است و ممکن است برای تمام نسخه‌های glibc کار نکند. این قابلیت با موفقیت بر روی نسخه‌های مختلف glibc (مانند 2.11، 2.16، 2.18) در پلتفرم‌های مختلف آزمایش شده است.

•lax-doors: (فقط در Solaris) بسیار آسان‌گیر بودن در مورد مدیریت فراخوانی سیستمی door بر روی توصیف‌کننده‌های فایل ناشناخته door. نیازی نیست کل بافر هنگام نوشتن مقداردهی اولیه شده باشد. بدون این گزینه، برنامه‌هایی که از قابلیت libdoor(3LIB) با رفتارهای کاملاً اختصاصی استفاده می‌کنند ممکن است تعداد زیادی خطای مثبت کاذب گزارش کنند.
•fallback-llsc: (فقط در MIPS و ARM64): یک پیاده‌سازی جایگزین از دستورالعمل‌های بارگذاری پیوندیافته (Load-Linked یا LL) و ذخیره مشروط (Store-Conditional یا SC) را فعال می‌کند. پیاده‌سازی استاندارد رفتار دقیق‌تری ارائه می‌دهد، اما می‌تواند در برخی پیاده‌سازی‌های پردازنده که ارجاعات اضافی به حافظه بین LL و SC را تحمل نمی‌کنند، باعث ایجاد حلقه‌های بی‌پایان شود. تاکنون این وضعیت تنها در هسته‌های Cavium 3 مشاهده شده است. شما نباید نیازی به استفاده از این فلگ داشته باشید، زیرا هسته‌های مربوطه در زمان راه‌اندازی شناسایی می‌شوند و پیاده‌سازی جایگزین در صورت نیاز به طور خودکار فعال می‌شود. هیچ فلگ مخالفی وجود ندارد: اگر پیاده‌سازی جایگزین به طور خودکار فعال شده باشد، نمی‌توانید آن را به اجبار غیرفعال کنید. مشکل اساسی به این دلیل وجود دارد که پیاده‌سازی «استاندارد» LL و SC با کپی کردن مستقیم دستورالعمل‌های LL و SC در کد ابزار دقیق‌شده انجام می‌شود. با این حال، ابزارها ممکن است مراجعات اضافی ابزار دقیق به حافظه را بین دستورالعمل‌های LL و SC وارد کنند. این مراجعات به حافظه در کد اصلی فاقد ابزار دقیق وجود ندارند و حضور آن‌ها در کد ابزار دقیق‌شده می‌تواند باعث شود دستورالعمل‌های SC مکرراً با شکست مواجه شوند، که منجر به حلقه بی‌نهایت در بلوک‌های LL-SC می‌شود. پیاده‌سازی جایگزین رفتار صحیحی از دستورالعمل‌های LL و SC را بین نخ‌ها در یک پردازه، تا سناریوی ABA و با احتساب آن، ارائه می‌دهد. همچنین رفتار صحیحی را بین یک نخ تحت کنترل والگریند و یک نخ خارج از والگریند که در پردازه‌ای دیگر اجرا می‌شوند و از طریق حافظه اشتراکی ارتباط برقرار می‌کنند ارائه می‌دهد، اما تنها تا رفتار صحیح CAS و با احتساب آن -- در این حالت سناریوی ABA ممکن است به درستی مدیریت نشود.

--scheduling-quantum=<number> [default: 100000]

گزینه --scheduling-quantum حداکثر تعداد بلوک‌های پایه‌ای را که توسط یک نخ قبل از آزادسازی قفل مورد استفاده والگریند برای سریالی کردن اجرای نخ‌ها اجرا می‌شود، کنترل می‌کند. مقادیر کوچک‌تر درهم‌آمیزی (interleaving) دقیق‌تری فراهم می‌کنند اما سربار زمان‌بندی را افزایش می‌دهند. درهم‌آمیزی دقیق‌تر می‌تواند برای بازتولید شرایط رقابت (race conditions) با helgrind یا DRD مفید باشد. برای جزئیات بیشتر در مورد طرح سریالی کردن نخ‌های والگریند و تأثیر آن بر عملکرد و زمان‌بندی نخ‌ها، به بخش Scheduling and Multi-Thread Performance مراجعه کنید.

--fair-sched=<no|yes|try> [default: no]

گزینه --fair-sched سازوکار قفل‌گذاری استفاده‌شده توسط والگریند برای سریالی کردن اجرای نخ‌ها را کنترل می‌کند. سازوکار قفل‌گذاری شیوه زمان‌بندی نخ‌ها را کنترل می‌کند و تنظیمات مختلف مصالحه‌های متفاوتی را میان عدالت در زمان‌بندی و عملکرد ارائه می‌دهند. برای جزئیات بیشتر در مورد طرح سریالی کردن نخ‌های والگریند و تأثیر آن بر عملکرد و زمان‌بندی نخ‌ها، به بخش Scheduling and Multi-Thread Performance مراجعه کنید.
•مقدار --fair-sched=yes یک زمان‌بند منصفانه را فعال می‌کند. به طور خلاصه، اگر چندین نخ آماده اجرا باشند، نخ‌ها به روش نوبت‌گردشی (round robin) زمان‌بندی خواهند شد. این سازوکار در تمام پلتفرم‌ها یا نسخه‌های لینوکس در دسترس نیست. در صورت عدم دسترسی، استفاده از --fair-sched=yes باعث خاتمه والگریند با یک خطا می‌شود.

اگر برنامه‌ای چندنخی و تعاملی مانند یک مرورگر وب را روی والگریند اجرا می‌کنید، ممکن است متوجه شوید که این تنظیم پاسخ‌دهی کلی برنامه را بهبود می‌بخشد.

•مقدار --fair-sched=try در صورت موجود بودن زمان‌بندی منصفانه در پلتفرم، آن را فعال می‌کند. در غیر این صورت، به طور خودکار به --fair-sched=no بازمی‌گردد.
•مقدار --fair-sched=no زمان‌بندی را فعال می‌کند که عدالت را بین نخ‌های آماده اجرا تضمین نمی‌کند، اما به طور کلی بیشترین کارایی را به همراه دارد.

--kernel-variant=variant1,variant2,...

رسیدگی به فراخوانی‌های سیستمی و ioctlهای ناشی از نسخه‌های فرعی و جزئی هسته پیش‌فرض این پلتفرم. این گزینه برای مثال برای اجرا روی هسته‌های دست‌کاری‌شده یا با ماژول‌های هسته‌ای که از ioctlهای غیر استاندارد پشتیبانی می‌کنند مفید است. با احتیاط استفاده کنید. اگر متوجه نمی‌شوید این گزینه چه کاری انجام می‌دهد، تقریباً به طور قطع به آن نیازی ندارید. گونه‌های شناخته‌شده کنونی عبارتند از:
•bproc: پشتیبانی از فراخوانی سیستمی sys_broc روی x86. این برای اجرا روی BProc است، که گونه‌ای فرعی از لینوکس استاندارد بوده و گاهی برای ساخت خوشه‌ها (کلسترها) استفاده می‌شود.
•android-no-hw-tls: برخی نسخه‌های شبیه‌ساز اندروید برای ARM ثبات سخت‌افزاری TLS (وضعیت محلی نخ) را فراهم نمی‌کنند، و والگریند در زمان راه‌اندازی با خطا مواجه می‌شود. از این گونه برای انتخاب پشتیبانی نرم‌افزاری از TLS استفاده کنید.
•android-gpu-sgx5xx: از این گزینه برای پشتیبانی از رسیدگی به ioctlهای اختصاصی سری پردازنده‌های گرافیکی PowerVR SGX 5XX در دستگاه‌های اندروید استفاده کنید. عدم انتخاب این گزینه باعث مشکلات پایداری نمی‌شود، اما ممکن است پس از انجام ioctlهای مخصوص GPU توسط برنامه، باعث گزارش خطاهای نادرست توسط Memcheck شود.
•android-gpu-adreno3xx: به همین ترتیب، از این گزینه برای پشتیبانی از رسیدگی به ioctlهای اختصاصی سری پردازنده‌های گرافیکی Qualcomm Adreno 3XX در دستگاه‌های اندروید استفاده کنید.

--merge-recursive-frames=<number> [default: 0]

برخی الگوریتم‌های بازگشتی، به عنوان مثال پیاده‌سازی‌های درخت دودویی متوازن، ردگیری‌های پشته متعددی ایجاد می‌کنند که هر کدام حاوی چرخه‌هایی از فراخوانی‌ها هستند. یک چرخه به صورت دو مقدار یکسان شمارنده برنامه تعریف می‌شود که با صفر یا چند مقدار دیگر شمارنده برنامه از هم جدا شده‌اند. والگریند ممکن است در این صورت حافظه زیادی را برای ذخیره تمام این ردگیری‌های پشته مصرف کند. این استفاده نامناسبی از حافظه است، با توجه به اینکه چنین ردگیری‌های پشته‌ای حاوی فراخوانی‌های بازگشتی تکراری و غیرجذاب هستند، به جای اطلاعات مفیدتری مانند تابعی که فراخوانی بازگشتی را آغاز کرده است.

گزینه --merge-recursive-frames=<number> به والگریند دستور می‌دهد چرخه‌های فراخوانی بازگشتی با اندازه تا سقف <number> فریم را شناسایی و ادغام کند. هنگامی که چنین چرخه‌ای شناسایی می‌شود، والگریند چرخه را در ردگیری پشته به عنوان یک شمارنده برنامه منحصربه‌فرد ثبت می‌کند.

مقدار 0 (پیش‌فرض) باعث عدم ادغام فراخوانی‌های بازگشتی می‌شود. مقدار 1 باعث فشرده‌سازی ردگیری پشته الگوریتم‌های بازگشتی ساده (به عنوان مثال، پیاده‌سازی فاکتوریل) خواهد شد. مقدار 2 معمولاً برای ادغام ردگیری‌های پشته تولیدشده توسط الگوریتم‌های بازگشتی مانند درخت‌های دودویی، مرتب‌سازی سریع و غیره مورد نیاز است. برای الگوریتم‌های بازگشتی پیچیده‌تر ممکن است مقادیر بالاتری لازم باشد.

توجه: فراخوانی‌های بازگشتی از طریق تحلیل مقادیر شمارنده برنامه شناسایی می‌شوند. آن‌ها از روی بررسی نام توابع شناسایی نمی‌شوند.

--num-transtab-sectors=<number> [default: 6 for Android platforms, 16 for all others]

والگریند کد ماشین برنامه شما را در قطعات کوچک (بلوک‌های پایه یا basic blocks) ترجمه و ابزار دقیق (instrument) می‌کند. ترجمه‌ها در یک حافظه پنهان ترجمه نگهداری می‌شوند که به تعدادی بخش (قطاع یا sector) تقسیم شده است. اگر حافظه پنهان پر شود، بخشی که حاوی قدیمی‌ترین ترجمه‌ها است خالی شده و مجدداً استفاده می‌شود. اگر این ترجمه‌های قدیمی دوباره مورد نیاز باشند، والگریند باید کد ماشین مربوطه را مجدداً ترجمه و ابزار دقیق کند، که عملیاتی پرهزینه است. اگر مجموعه کاری «دستورالعمل‌های اجرا شده» یک برنامه بزرگ باشد، افزایش تعداد بخش‌ها می‌تواند با کاهش تعداد ترجمه‌های مجدد مورد نیاز، کارایی را بهبود بخشد. بخش‌ها بر حسب تقاضا تخصیص داده می‌شوند. پس از تخصیص، یک بخش هرگز آزاد نمی‌شود و بسته به ابزار و مقدار --avg-transtab-entry-size، فضای قابل‌توجهی را اشغال می‌کند (حدود ۴۰ مگابایت به ازای هر بخش برای Memcheck). از گزینه --stats=yes برای به دست آوردن اطلاعات دقیق در مورد حافظه مصرفی یک بخش و تخصیص و بازیافت بخش‌ها استفاده کنید.

--avg-transtab-entry-size=<number> [default: 0, meaning use tool provided default]

اندازه میانگین بلوک پایه ترجمه‌شده. این اندازه میانگین برای تعیین ابعاد و اندازه یک بخش استفاده می‌شود. هر ابزار مقدار پیش‌فرضی را برای استفاده فراهم می‌کند. اگر این مقدار پیش‌فرض خیلی کوچک باشد، بخش‌های ترجمه خیلی سریع پر می‌شوند. اگر این مقدار پیش‌فرض خیلی بزرگ باشد، بخش قابل‌توجهی از حافظه بخش ترجمه بدون استفاده باقی خواهد ماند. توجه داشته باشید که اندازه میانگین ترجمه یک بلوک پایه به ابزار بستگی دارد، و ممکن است به گزینه‌های ابزار نیز وابسته باشد. برای مثال، گزینه memcheck با نام --track-origins=yes اندازه ترجمه‌های بلوک پایه را افزایش می‌دهد. از --avg-transtab-entry-size برای تنظیم دقیق اندازه بخش‌ها، چه برای صرفه‌جویی در حافظه و چه برای جلوگیری از ترجمه‌های مجدد بیش از حد استفاده کنید.

--aspace-minaddr=<address> [default: depends on the platform]

برای جلوگیری از تداخل‌های احتمالی با برخی کتابخانه‌های سیستم، والگریند از فضای آدرس زیر مقدار --aspace-minaddr استفاده نمی‌کند و آن را رزرو نگه می‌دارد تا در صورتی که کتابخانه‌ای مشخصاً در این ناحیه درخواست حافظه کرد، در دسترس باشد. بنابراین، یک مقدار «بدبینانه» توسط والگریند بسته به پلتفرم حدس زده می‌شود. در لینوکس، به طور پیش‌فرض، والگریند از ۶۴ مگابایت اول استفاده نمی‌کند، حتی اگر معمولاً هیچ تداخلی در تمام این ناحیه وجود نداشته باشد. می‌توانید از گزینه --aspace-minaddr استفاده کنید تا برنامه پرمصرف شما از نظر حافظه بتواند از مقدار بیشتری از این حافظه پایینی بهره‌مند شود. از سوی دیگر، اگر با یک تداخل مواجه شدید، افزایش مقدار aspace-minaddr ممکن است آن را حل کند. تداخل‌ها معمولاً به شکل شکست‌های mmap در محدوده پایین فضای آدرس ظاهر می‌شوند. آدرس ارائه‌شده باید هم‌تراز صفحه (page aligned) باشد و باید برابر یا بزرگ‌تر از 0x1000 (۴ کیلوبایت) باشد. برای یافتن مقدار پیش‌فرض در پلتفرم خود، دستوری مانند زیر را اجرا کنید: valgrind -d -d date 2>&1 | grep -i minaddr. شناخته شده است که مقادیر کمتر از 0x10000 (۶۴ کیلوبایت) در برخی توزیع‌ها مشکل ایجاد می‌کنند.

--valgrind-stacksize=<number> [default: 1MB]

برای هر نخ، والگریند به پشته «اختصاصی» خود نیاز دارد. اندازه پیش‌فرض برای این پشته‌ها به طور سخاوتمندانه‌ای تعیین شده است و بنابراین در بیشتر موارد باید کافی باشد. در صورتی که این اندازه خیلی کوچک باشد، والگریند دچار خطای سگفالت خواهد شد. پیش از بروز سگفالت، هنگامی که والگریند به این حد نزدیک می‌شود ممکن است یک هشدار صادر کند.

در صورتی که چنین هشدار (بعیدی) صادر شد، یا والگریند به دلیل خطای نقض قطعه‌بندی متوقف گردید، از گزینه --valgrind-stacksize استفاده کنید. چنین خطاهای نقض قطعه‌بندی هنگام ابهام‌زدایی (demangling) از نمادهای عظیم C++ مشاهده شده است.

اگر برنامه کاربردی شما از نخ‌های زیادی استفاده می‌کند و به حافظه زیادی نیاز دارد، می‌توانید با کاهش اندازه این پشته‌های والگریند با استفاده از گزینه --valgrind-stacksize مقداری حافظه آزاد به دست آورید.

--show-emwarns=<yes|no> [default: no]

در صورت فعال بودن، والگریند در برخی موارد هشدارهایی را درباره شبیه‌سازی پردازنده صادر می‌کند. این موارد معمولاً چندان حائز اهمیت نیستند.

--require-text-symbol=:sonamepatt:fnnamepatt

هنگامی که یک شیء اشتراکی که soname آن با sonamepatt تطابق دارد درون پردازه بارگذاری می‌شود، تمام نمادهای متنی (text symbols) که صادر می‌کند را بررسی کنید. اگر هیچ‌یک از آن‌ها با fnnamepatt مطابقت نداشته باشد، یک پیام خطا چاپ کرده و از اجرای برنامه انصراف دهید. این امر اطمینان حاصل کردن از عدم ادامه اجرا را ممکن می‌سازد، مگر اینکه یک شیء اشتراکی داده‌شده حاوی یک نام تابع خاص باشد.

هر دو الگوی sonamepatt و fnnamepatt را می‌توان با استفاده از نویسه‌های عمومی معمول ? و * نوشت. برای مثال: ":*libc.so*:foo?bar". می‌توانید از نویسه‌هایی غیر از دو نقطه برای جدا کردن دو الگو استفاده کنید. تنها نکته مهم این است که نویسه اول و نویسه جداکننده یکسان باشند. به عنوان مثال، نمونه بالا را می‌توان به این صورت نیز نوشت: "Q*libc.so*Qfoo?bar". استفاده از چندین فلگ --require-text-symbol مجاز است، که در این صورت اشیاء اشتراکی بارگذاری‌شده در پردازه در برابر همه آن‌ها بررسی خواهند شد.

هدف از این کار، پشتیبانی از استفاده مطمئن از کتابخانه‌های نشانه‌گذاری‌شده است. برای مثال، فرض کنید نسخه‌ای از کتابخانه GCC با نام libgomp.so داریم که با حاشیه‌نویسی‌هایی برای پشتیبانی از Helgrind نشانه‌گذاری شده است. بسیار آسان و گیج‌کننده است که نسخه اشتباه و بدون حاشیه‌نویسی libgomp.so در برنامه بارگذاری شود. بنابراین ایده این است: یک نماد متنی به کتابخانه نشانه‌گذاری‌شده اضافه کنید، به عنوان مثال annotated_for_helgrind_3_6، و سپس فلگ --require-text-symbol=:*libgomp*so*:annotated_for_helgrind_3_6 را تعیین کنید تا هنگامی که libgomp.so بارگذاری شد، والگریند جدول نمادهای آن را پیمایش کند، و اگر نماد وجود نداشت اجرا متوقف شود، به جای اینکه بدون هشدار با کتابخانه نشانه‌گذاری‌نشده ادامه دهد. توجه داشته باشید که باید کل فلگ را درون گیومه قرار دهید تا از بسط دادن نویسه‌های عمومی * و ? توسط پوسته جلوگیری شود.

--soname-synonyms=syn1=pattern1,syn2=pattern2,...

هنگامی که یک کتابخانه اشتراکی بارگذاری می‌شود، والگریند توابعی را در کتابخانه که باید جایگزین یا بسته‌بندی (wrapped) شوند بررسی می‌کند. برای مثال، Memcheck برخی از توابع رشته‌ای و حافظه (مانند strchr، strlen، strcpy، memchr، memcpy، memmove و غیره) را با نسخه‌های خود جایگزین می‌کند. چنین جایگزینی‌هایی معمولاً فقط در کتابخانه‌های اشتراکی انجام می‌شود که soname آن‌ها با یک الگوی پیش‌تعریف‌شده soname مطابقت داشته باشد (به عنوان مثال libc.so* در لینوکس). به طور پیش‌فرض، هیچ جایگزینی برای باینری‌های پیوند ایستا (statically linked) یا کتابخانه‌های جایگزین انجام نمی‌شود، به جز توابع تخصیص حافظه (مانند malloc، free، calloc، memalign، realloc، operator new، operator delete و غیره). چنین توابع تخصیصی به طور پیش‌فرض در هر کتابخانه اشتراکی یا در فایل اجرایی در صورتی که به عنوان نمادهای سراسری صادر شده باشند، رهگیری (intercept) می‌شوند. این بدان معناست که اگر یک کتابخانه جایگزین تخصیص مانند tcmalloc پیدا شود، توابع آن نیز به طور پیش‌فرض رهگیری می‌شوند. در برخی موارد، جایگزینی‌ها به --soname-synonyms اجازه می‌دهند یک الگوی مترادف اضافی تعیین کند که انعطاف‌پذیری در جایگزینی را فراهم می‌سازد. یا برای جلوگیری از رهگیری تمام نمادهای تخصیص عمومی.

در حال حاضر، این انعطاف‌پذیری تنها برای توابع مرتبط با malloc و با استفاده از مترادف somalloc مجاز است. این مترادف برای تمام ابزارهایی که جایگزینی استاندارد توابع مربوط به malloc را انجام می‌دهند قابل استفاده است (مانند memcheck، helgrind، drd، massif، dhat).

•کتابخانه جایگزین malloc: برای جایگزینی توابع مرتبط با malloc در یک کتابخانه جایگزین خاص با soname با نام mymalloclib.so (و نه در هیچ کتابخانه دیگری)، گزینه --soname-synonyms=somalloc=mymalloclib.so را وارد کنید. یک الگو می‌تواند برای تطبیق با soname چندین کتابخانه استفاده شود. برای مثال، --soname-synonyms=somalloc=*tcmalloc* با soname تمام انواع کتابخانه tcmalloc (گونه‌های اصلی، اشکال‌زدایی، پروفایل‌شده و غیره tcmalloc) مطابقت خواهد داشت.

توجه: soname یک کتابخانه اشتراکی elf را می‌توان با استفاده از ابزار readelf به دست آورد.

•جایگزینی‌ها در یک کتابخانه با پیوند ایستا با استفاده از الگوی NONE انجام می‌شود. برای مثال، اگر با libtcmalloc.a پیوند ایجاد کنید و تنها بخواهید توابع مرتبط با malloc را در خود فایل اجرایی (و کتابخانه‌های استاندارد) رهگیری کنید و نه در سایر کتابخانه‌های اشتراکی، می‌توانید گزینه --soname-synonyms=somalloc=NONE را مشخص نمایید. توجه داشته باشید که الگوی NONE با فایل اجرایی اصلی و هر کتابخانه اشتراکی فاقد soname مطابقت خواهد داشت.
•برای رهگیری نمادهای تخصیص تنها در کتابخانه‌های پیش‌فرض سیستم، و نه در هیچ کتابخانه اشتراکی دیگر یا فایل اجرایی که توابع عمومی مرتبط با malloc یا operator new را تعریف می‌کند، از نام کتابخانه‌ای ناموجود مانند --soname-synonyms=somalloc=nouserintercepts استفاده کنید (که در آن nouserintercepts می‌تواند هر نام کتابخانه ناموجودی باشد).
•کتابخانه اشتراکی پیونددهنده پویا (زمان اجرا) از جستجو برای نمادهای عمومی سراسری، مانند نمادهای مربوط به توابع malloc (که با مترادف somalloc مشخص می‌شوند)، مستثنی است.

--progress-interval=<number> [default: 0, meaning 'disabled']

این قابلیتی برای بهبود خروجی اشکال‌زدایی والگریند است. بعید است برای کاربران نهایی جالب باشد.

هنگامی که number روی یک مقدار غیر صفر تنظیم شود، والگریند خلاصه‌ای از پیشرفت را در یک خط در هر number ثانیه چاپ می‌کند. مقادیر معتبر برای number بین 0 و 3600 (شامل هر دو) است. در اینجا یک نمونه خروجی با مقدار number برابر ۱۰ آمده است:

PROGRESS: U 110s, W 113s, 97.3% CPU, EvC 414.79M, TIn 616.7k, TOut 0.5k, #thr 67
PROGRESS: U 120s, W 124s, 96.8% CPU, EvC 505.27M, TIn 636.6k, TOut 3.0k, #thr 64
PROGRESS: U 130s, W 134s, 97.0% CPU, EvC 574.90M, TIn 657.5k, TOut 3.0k, #thr 63

هر خط نشان‌دهنده موارد زیر است:

•U: کل زمان کاربر (user time)
•W: کل زمان واقعی (wallclock time)
•CPU: میانگین کلی مصرف پردازنده
•EvC: تعداد بررسی‌های رویداد (event checks). یک بررسی رویداد، یک انشعاب به عقب در برنامه شبیه‌سازی‌شده است، بنابراین این معیاری از پیشرفت رو به جلوی برنامه است
•TIn: تعداد بلوک‌های کدی که توسط JIT ابزار دقیق شده‌اند
•TOut: تعداد بلوک‌های کد ابزار دقیق‌شده که دور ریخته شده‌اند
•#thr: تعداد نخ‌های موجود در برنامه

از روند پیشرفت این مقادیر، می‌توان موارد زیر را مشاهده کرد:

•زمانی که برنامه محدود به توان محاسباتی است (TIn به آرامی افزایش می‌یابد، EvC به سرعت بالا می‌رود)
•زمانی که برنامه در یک حلقه چرخشی (spinloop) قرار دارد (TIn/TOut ثابت است، EvC به سرعت بالا می‌رود)
•زمانی که برنامه محدود به JIT است (TIn به سرعت افزایش می‌یابد)
•زمانی که برنامه به سرعت کدها را دور می‌ریزد (TOut به سرعت افزایش می‌یابد)
•زمانی که برنامه در شرف رسیدن به وضعیتی مورد انتظار است (EvC به مقداری که انتظار دارید می‌رسد)
•زمانی که برنامه در حالت بیکار است (U آهسته‌تر از W رشد می‌کند)

همچنین گزینه‌هایی برای اشکال‌زدایی خود والگریند وجود دارد. در روال معمول کارها نباید نیازی به استفاده از آن‌ها داشته باشید. اگر مایل به دیدن این فهرست هستید، از گزینه --help-debug استفاده کنید.

--leak-check=<no|summary|yes|full> [default: summary]

در صورت فعال بودن، هنگام پایان برنامه کلاینت به جستجوی نشت‌های حافظه (memory leaks) می‌پردازد. در صورت تنظیم روی summary، تعداد نشت‌های رخ‌داده را اعلام می‌کند. در صورت تنظیم روی full یا yes، هر نشت حافظه به صورت جداگانه با جزئیات نمایش داده می‌شود و/یا به عنوان خطا شمارش خواهد شد، همان‌گونه که توسط گزینه‌های --show-leak-kinds و --errors-for-leak-kinds مشخص شده است.

اگر --xml=yes داده شود، ممچک به طور خودکار مقدار --leak-check=full را استفاده خواهد کرد. می‌توانید از --show-leak-kinds=none برای کاهش اندازه خروجی xml استفاده کنید، چنانچه به نتایج نشت حافظه علاقه‌ای ندارید.

--leak-resolution=<low|med|high> [default: high]

هنگام انجام بررسی نشت، تعیین می‌کند که ممچک تا چه اندازه تمایل دارد ردگیری‌های بازگشتی (backtraces) متفاوت را برای ادغام چندین نشت حافظه در یک گزارش نشت واحد، یکسان در نظر بگیرد. هنگامی که روی low تنظیم شود، فقط دو مدخل اول باید تطابق داشته باشند. در حالت med، چهار مدخل باید مطابقت داشته باشند. در حالت high، تمام مدخل‌ها باید مطابقت داشته باشند.

برای اشکال‌زدایی دقیق و موشکافانه نشت حافظه، احتمالاً مایل خواهید بود از --leak-resolution=high همراه با --num-callers=40 یا عددی به همین اندازه بزرگ استفاده کنید.

توجه داشته باشید که تنظیم --leak-resolution بر توانایی ممچک در یافتن نشت‌های حافظه تأثیری نمی‌گذارد. این گزینه تنها نحوه ارائه و نمایش نتایج را تغییر می‌دهد.

--show-leak-kinds=<set> [default: definite,possible]

انواع نشت حافظه را برای نمایش در یک جستجوی نشت full، به یکی از روش‌های زیر مشخص می‌کند:
•فهرستی جداشده با کاما از یک یا چند مورد از definite indirect possible reachable.
•all برای تعیین مجموعه کامل (تمامی انواع نشت حافظه). این مقدار معادل است با --show-leak-kinds=definite,indirect,possible,reachable.
•none برای مجموعه تهی.

--errors-for-leak-kinds=<set> [default: definite,possible]

انواع نشت‌های حافظه را برای شمارش به عنوان خطا در یک جستجوی نشت full مشخص می‌کند. مقدار <set> مشابه با --show-leak-kinds تعیین می‌شود.

--leak-check-heuristics=<set> [default: all]

مجموعه روش‌های مکاشفه‌ای (heuristics) بررسی نشت حافظه را مشخص می‌کند که در طول جستجوهای نشت به کار می‌روند. این روش‌های مکاشفه‌ای کنترل می‌کنند که کدام اشاره‌گرهای درونی (interior pointers) به یک بلوک باعث می‌شوند آن بلوک به عنوان قابل دسترسی در نظر گرفته شود. مجموعه روش‌های مکاشفه‌ای به یکی از روش‌های زیر مشخص می‌شود:
•فهرستی جداشده با کاما از یک یا چند مورد از stdstring length64 newarray multipleinheritance.
•all برای فعال‌سازی مجموعه کامل روش‌های مکاشفه‌ای. این مقدار معادل است با --leak-check-heuristics=stdstring,length64,newarray,multipleinheritance.
•none برای مجموعه تهی.

توجه داشته باشید که این روش‌های مکاشفه‌ای به چیدمان اشیاء تولیدشده توسط کامپایلر ++C وابسته هستند. آن‌ها با برخی از نسخه‌های gcc (مانند 4.4 و 4.7) آزمایش شده‌اند. ممکن است با سایر کامپایلرهای ++C به درستی کار نکنند.

--show-reachable=<yes|no> , --show-possibly-lost=<yes|no>

این گزینه‌ها روش جایگزینی را برای مشخص کردن انواع نشت حافظه جهت نمایش ارائه می‌دهند:
•--show-reachable=no --show-possibly-lost=yes معادل است با --show-leak-kinds=definite,possible.
•--show-reachable=no --show-possibly-lost=no معادل است با --show-leak-kinds=definite.
•--show-reachable=yes معادل است با --show-leak-kinds=all.

توجه داشته باشید که --show-possibly-lost=no در صورتی که --show-reachable=yes تعیین شده باشد، هیچ اثری ندارد.

--xtree-leak=<no|yes> [no]

در صورت تنظیم روی yes، نتایج حاصل از جستجوی نشت حافظه که هنگام خروج برنامه انجام می‌شود، در یک فایل درخت اجرای 'Callgrind Format' خروجی داده خواهد شد. توجه داشته باشید که این گزینه به طور خودکار گزینه‌های --leak-check=full و --show-leak-kinds=all را تنظیم می‌کند، تا به ابزارهای تجسم تصویری xtree مانند kcachegrind امکان دهد نوع نشت مورد نظر برای نمایش را انتخاب نمایند. فایل تولیدشده شامل رویدادهای زیر خواهد بود:
•RB : بایت‌های قابل دسترسی (Reachable Bytes)
•PB : بایت‌های احتمالاً از دست رفته (Possibly lost Bytes)
•IB : بایت‌های غیرمستقیم از دست رفته (Indirectly lost Bytes)
•DB : بایت‌های قطعاً از دست رفته (مستقیم به علاوه غیرمستقیم)
•DIB : بایت‌های قطعاً غیرمستقیم از دست رفته (زیرمجموعه DB)
•RBk : بلوک‌های قابل دسترسی (reachable Blocks)
•PBk : بلوک‌های احتمالاً از دست رفته (Possibly lost Blocks)
•IBk : بلوک‌های غیرمستقیم از دست رفته (Indirectly lost Blocks)
•DBk : بلوک‌های قطعاً از دست رفته (Definitely lost Blocks)

افزایش یا کاهش تمامی رویدادهای بالا نیز در فایل خروجی درج خواهد شد تا تغییرات تفاضلی (دلتا: افزایش یا کاهش) بین ۲ جستجوی متوالی نشت حافظه ارائه شود. برای مثال، iRB میزان افزایش در رویداد RB است، و dPBk میزان کاهش در رویداد PBk است. مقادیر مربوط به رویدادهای افزایش و کاهش برای اولین جستجوی نشت انجام‌شده صفر خواهند بود.

برای توضیحات دقیق پیرامون درخت‌های اجرا، بخش درخت‌های اجرا (Execution Trees) را ببینید.

--xtree-leak-file=<filename> [default: xtleak.kcg.%p]

مشخص می‌کند که والگریند باید گزارش نشت xtree را در فایل تعیین‌شده تولید کند. هر توالی %p، %q یا %n که در نام فایل ظاهر شود، دقیقاً به همان شکلی جایگزین و باز می‌شود که برای گزینه --log-file انجام می‌پذیرد. برای جزئیات، توضیحات مربوط به --log-file را ببینید.

برای توضیحات دقیق درباره قالب‌های درخت‌های اجرا، بخش درخت‌های اجرا (Execution Trees) را ببینید.

--undef-value-errors=<yes|no> [default: yes]

کنترل می‌کند که آیا ممچک خطاهای ناشی از استفاده از متغیرهای تعریف‌نشده (undefined value errors) را گزارش دهد یا خیر. اگر مایل به دیدن خطاهای متغیرهای تعریف‌نشده نیستید، این گزینه را روی no تنظیم کنید. این کار اثر جانبی اندکی سرعت بخشیدن به عملکرد ممچک را نیز دارد. ابزار AddrCheck (که در نسخه 3.1.0 والگریند حذف شد) مانند ممچک به همراه گزینه --undef-value-errors=no عمل می‌کرد.

--track-origins=<yes|no> [default: no]

کنترل می‌کند که آیا ممچک منشأ متغیرهای تعریف‌نشده را ردگیری کند یا خیر. به طور پیش‌فرض این کار انجام نمی‌شود، به این معنی که اگرچه می‌تواند به شما اعلام کند که یک متغیر تعریف‌نشده در موقعیتی خطرناک استفاده شده است، اما نمی‌تواند بگوید که این متغیر تعریف‌نشده از کجا آمده است. این امر اغلب ریشه‌یابی و رفع مشکل اصلی را دشوار می‌سازد.

هنگامی که روی yes تنظیم شود، ممچک منشأ تمام متغیرهای تعریف‌نشده را ثبت و ردگیری می‌کند. سپس، هنگامی که خطایی مرتبط با متغیرهای تعریف‌نشده گزارش می‌شود، ممچک تلاش خواهد کرد تا منشأ آن مقدار را نمایش دهد. منشأ می‌تواند یکی از چهار مورد زیر باشد: یک بلوک هیپ (heap block)، یک تخصیص در استک (stack allocation)، یک درخواست کلاینت (client request)، یا سایر منابع متفرقه (مانند یک فراخوانی به brk).

برای متغیرهای تعریف‌نشده‌ای که از یک بلوک هیپ منشأ می‌گیرند، ممچک نشان می‌دهد که آن بلوک در کجا تخصیص یافته است. برای متغیرهای تعریف‌نشده‌ای که از یک تخصیص در استک نشأت می‌گیرند، ممچک می‌تواند به شما بگوید کدام تابع آن مقدار را تخصیص داده است، اما نه بیشتر از آن -- به طور معمول مکان دقیق آکولاد بازکننده تابع در کد مبدأ را به شما نشان می‌دهد. بنابراین باید با دقت بررسی کنید که تمامی متغیرهای محلی آن تابع به درستی مقداردهی اولیه شده باشند.

سربار کارایی: ردگیری منشأ هزینه‌بر و سنگین است. سرعت اجرای ممچک را نصف می‌کند و مصرف حافظه را حداقل ۱۰۰ مگابایت و چه بسا بیشتر افزایش می‌دهد. با این حال، می‌تواند تلاش لازم برای شناسایی علت ریشه‌ای خطاهای متغیرهای تعریف‌نشده را به شدت کاهش دهد و بنابراین علی‌رغم اجرای کندتر، اغلب باعث صرفه‌جویی چشمگیر در وقت و افزایش بهره‌وری برنامه‌نویس می‌شود.

دقت: ممچک منشأها را با دقت بسیار بالایی ردگیری می‌کند. به منظور پرهیز از سربارهای بسیار سنگین زمانی و فضایی، برخی تقریب‌ها اعمال می‌شوند. این احتمال وجود دارد، هرچند بعید، که ممچک یک منشأ نادرست را گزارش کند یا اصلاً نتواند هیچ منشأیی را شناسایی نماید.

توجه داشته باشید که ترکیب همزمان دو گزینه --track-origins=yes و --undef-value-errors=no بی‌معنی و نامفهوم است. ممچک هنگام شروع به کار، این ترکیب را بررسی کرده و آن را رد می‌نماید.

--partial-loads-ok=<yes|no> [default: yes]

کنترل می‌کند که ممچک چگونه با بارگذاری‌های (loads) ۳۲، ۶۴، ۱۲۸ و ۲۵۶ بیتی دارای تراز طبیعی از آدرس‌هایی که برخی بایت‌های آن‌ها قابل آدرس‌دهی و برخی دیگر غیرقابل آدرس‌دهی هستند، برخورد کند. در صورت تنظیم روی yes، چنین بارگذاری‌هایی خطای آدرس تولید نمی‌کنند. در عوض، بایت‌های بارگذاری‌شده‌ای که از آدرس‌های دارای دسترسی غیرمجاز می‌آیند به عنوان متغیرهای تعریف‌نشده علامت‌گذاری می‌شوند و بایت‌های متناظر با آدرس‌های مجاز به شیوه عادی پردازش می‌گردند.

در صورت تنظیم روی no، بارگذاری‌ها از آدرس‌های تا حدی نامعتبر، همانند بارگذاری از آدرس‌های کاملاً نامعتبر رفتار خواهند شد: یک خطای دسترسی غیرمجاز به آدرس صادر می‌شود و بایت‌های حاصل به عنوان مقداردهی‌شده علامت می‌خورند.

توجه داشته باشید کدی که به این شکل رفتار می‌کند استانداردهای ISO C/C++ را نقض کرده و باید کدی خراب تلقی شود. در صورت امکان، چنین کدی باید حتماً اصلاح گردد.

--expensive-definedness-checks=<no|auto|yes> [default: auto]

کنترل می‌کند که آیا ممچک باید هنگام بررسی متغیرهای تعریف‌نشده یا مقادیر معین، ابزار دقیق‌سازی (instrumentation) دقیق‌تر اما پرهزینه‌تر (زمان‌برتر) را به کار گیرد یا خیر. به طور خاص، این مورد بر ابزار دقیق‌سازی عملگرهای جمع، تفریق و مقایسه برابری اعداد صحیح اثر می‌گذارد.

انتخاب --expensive-definedness-checks=yes باعث می‌شود ممچک از دقیق‌ترین تحلیل ممکن استفاده کند. این کار نرخ خطاهای کاذب را به حداقل می‌رساند، اما می‌تواند تا ۳۰٪ افت کارایی ایجاد کند.

انتخاب --expensive-definedness-checks=no باعث می‌شود ممچک از کم‌هزینه‌ترین ابزار دقیق‌سازی ممکن استفاده کند. این کار کارایی را به حداکثر می‌رساند، اما معمولاً نرخ هشدارهای کاذب بسیار بالا و غیرقابل استفاده‌ای ارائه خواهد داد.

تنظیم پیش‌فرض، یعنی --expensive-definedness-checks=auto، اکیداً توصیه می‌شود. این کار سبب می‌شود ممچک از حداقل ابزار دقیق‌سازی پرهزینه لازم جهت دستیابی به همان نرخ خطای کاذبِ حاصل از --expensive-definedness-checks=yes استفاده کند. همچنین یک مرحله تحلیل در زمان ابزار دقیق‌سازی را فعال می‌کند که هدف آن کاهش بیشتر هزینه‌های ابزار دقیق‌سازی دقیق است. در مجموع، افت کارایی در مقایسه با --expensive-definedness-checks=no عموماً در حدود ۵٪ است، هرچند که این میزان به شدت به بار کاری (workload) برنامه وابسته است. توجه داشته باشید که تنظیمات دقیق ابزار دقیق‌سازی در این حالت به معماری سیستم بستگی دارد.

--keep-stacktraces=alloc|free|alloc-and-free|alloc-then-free|none [default: alloc-and-free]

کنترل می‌کند که کدام ردگیری(های) استک برای بلوک‌های تخصیص‌یافته با malloc و/یا آزادشده با free نگهداری شوند.

با گزینه alloc-then-free، یک ردگیری استک در زمان تخصیص ثبت شده و با بلوک مرتبط می‌شود. هنگامی که بلوک آزاد می‌شود، یک ردگیری استک دوم ثبت می‌گردد و این ردگیری جایگزین ردگیری استک تخصیص می‌شود. در نتیجه، هرگونه خطای «استفاده پس از آزادسازی» (use after free) در رابطه با این بلوک تنها می‌تواند ردگیری استک مکانی را نشان دهد که بلوک در آن آزاد شده است.

با گزینه alloc-and-free، ردگیری استک هر دو مرحله تخصیص و آزادسازی برای بلوک ذخیره می‌شود. بنابراین یک خطای «استفاده پس از آزادسازی» هر دو را نشان می‌دهد، که ممکن است خطایابی را ساده‌تر کند. در مقایسه با alloc-then-free، این تنظیم مصرف حافظه والگریند را کمی افزایش می‌دهد زیرا هر بلوک به جای یک مرجع، شامل دو مرجع است.

با گزینه alloc، فقط ردگیری استک زمان تخصیص ثبت (و گزارش) می‌شود. با گزینه free، فقط ردگیری استک زمان آزادسازی ثبت (و گزارش) می‌شود. این مقادیر تا حدی مصرف حافظه و cpu والگریند را کاهش می‌دهند. این گزینه‌ها بسته به نوع خطاهایی که در جستجوی آن‌ها هستید و سطح جزئیاتی که برای تحلیل آن‌ها نیاز دارید می‌توانند مفید واقع شوند. برای مثال، اگر تنها به خطاهای نشت حافظه علاقه‌مند هستید، ثبت ردگیری‌های استک زمان تخصیص کافی خواهد بود.

با گزینه none، هیچ ردگیری استکی برای عملیات malloc و free ثبت نمی‌شود. اگر برنامه شما تعداد زیادی بلوک تخصیص می‌دهد و/یا از ردگیری‌های استک بسیار متفاوتی تخصیص/آزادسازی را به انجام می‌رساند، این تنظیم می‌تواند مصرف cpu و/یا حافظه مورد نیاز را به طرز چشمگیری کاهش دهد. البته، در این حالت جزئیات ناچیزی برای خطاهای مرتبط با بلوک‌های حافظه هیپ گزارش خواهد شد.

توجه داشته باشید که پس از ثبت یک ردگیری استک، والگریند آن ردگیری را در حافظه نگه می‌دارد حتی اگر هیچ بلوکی به آن ارجاع ندهد. برخی برنامه‌ها (به عنوان مثال الگوریتم‌های بازگشتی) می‌توانند تعداد سرسام‌آوری از ردگیری‌های استک تولید کنند. چنانچه والگریند در چنین شرایطی حافظه بسیار زیادی مصرف کند، می‌توانید با گزینه‌های --keep-stacktraces و/یا با استفاده از مقداری کوچک‌تر برای گزینه --num-callers، حافظه مورد نیاز را کاهش دهید.

اگر می‌خواهید از تحلیل پروفایل حافظه با --xtree-memory=full (بخش درخت‌های اجرا (Execution Trees) را ببینید) استفاده کنید، نمی‌توانید --keep-stacktraces=free یا --keep-stacktraces=none را مشخص نمایید.

--freelist-vol=<number> [default: 20000000]

هنگامی که برنامه کلاینت حافظه را با استفاده از free (در زبان C) یا delete (در زبان ++C) آزاد می‌کند، آن حافظه بلافاصله برای تخصیص مجدد در دسترس قرار نمی‌گیرد. در عوض، به عنوان بلوک غیرقابل دسترسی علامت‌گذاری شده و در یک صف از بلوک‌های آزادشده قرار داده می‌شود. هدف این است که زمان بازگشت حافظه آزادشده به چرخه استفاده تا حد امکان به تأخیر بیفتد. این امر شانس ممچک را در تشخیص دسترسی غیرمجاز به بلوک‌ها برای مدت زمانی قابل توجه پس از آزادسازی آن‌ها افزایش می‌دهد.

این گزینه حداکثر اندازه کل بلوک‌های موجود در صف را بر حسب بایت مشخص می‌کند. مقدار پیش‌فرض آن بیست میلیون بایت است. افزایش این مقدار، کل حافظه مصرفی ممچک را بالا می‌برد اما ممکن است دسترسی غیرمجاز به بلوک‌های آزادشده را کشف کند که در غیر این صورت شناسایی نمی‌شدند.

--freelist-big-blocks=<number> [default: 1000000]

هنگام در دسترس قرار دادن مجدد بلوک‌ها از صف بلوک‌های آزادشده برای تخصیص مجدد، ممچک در اولویت اول بلوک‌هایی با اندازه بزرگ‌تر یا مساوی با --freelist-big-blocks را بازچرخانی می‌کند. این ویژگی اطمینان می‌دهد که آزادسازی بلوک‌های بزرگ (به‌ویژه آزادسازی بلوک‌های بزرگ‌تر از --freelist-vol) بلافاصله منجر به بازچرخانی تمام (یا بخش عمده‌ای از) بلوک‌های کوچک در فهرست آزاد نگردد. به عبارت دیگر، این گزینه احتمال کشف اشاره‌گرهای معلق (dangling pointers) را برای بلوک‌های «کوچک» افزایش می‌دهد، حتی زمانی که بلوک‌های بزرگ آزاد می‌شوند.

تنظیم مقدار 0 به این معنی است که تمام بلوک‌ها به ترتیب ورود و خروج (FIFO) بازچرخانی می‌شوند.

--workaround-gcc296-bugs=<yes|no> [default: no]

در صورت فعال بودن، فرض می‌کند خواندن‌ها و نوشتن‌ها در فاصله‌ای کوتاه زیر اشاره‌گر استک (stack pointer) ناشی از اشکالات در GCC 2.96 هستند و آن‌ها را گزارش نمی‌کند. این «فاصله کوتاه» به طور پیش‌فرض ۲۵۶ بایت است. توجه داشته باشید که GCC 2.96 کامپایلر پیش‌فرض در برخی از توزیع‌های قدیمی لینوکس (RedHat 7.X) است و بنابراین ممکن است نیاز به استفاده از این گزینه داشته باشید. در صورتی که مجبور نیستید از آن استفاده نکنید، زیرا می‌تواند باعث نادیده گرفته شدن خطاهای واقعی گردد. یک راهکار بهتر، استفاده از نسخه‌ای جدیدتر از GCC است که این اشکال در آن برطرف شده باشد.

همچنین ممکن است هنگام کار با GCC 3.X یا 4.X در لینوکس ۳۲ بیتی PowerPC نیاز به استفاده از این گزینه داشته باشید. این به آن دلیل است که GCC کدی تولید می‌کند که گهگاه به زیر اشاره‌گر استک دسترسی پیدا می‌کند، به‌ویژه در تبدیلات ممیز شناور به/از عدد صحیح. این رفتار ناقض مشخصات ELF در PowerPC ۳۲ بیتی است، چرا که در این مشخصات هیچ پیش‌بینی برای مجاز بودن دسترسی به مکان‌های زیر اشاره‌گر استک صورت نگرفته است.

این گزینه از نسخه ۳.۱۲ منسوخ شده است و ممکن است در نسخه‌های آتی حذف گردد. در عوض باید از گزینه --ignore-range-below-sp برای تعیین بازه دقیق آفست‌های زیر اشاره‌گر استک که باید نادیده گرفته شوند استفاده نمایید. یک معادل مناسب عبارت است از --ignore-range-below-sp=1024-1.

--ignore-range-below-sp=<number>-<number>

این گزینه یک جایگزین عمومی‌تر برای گزینه منسوخ‌شده --workaround-gcc296-bugs است. در صورت تعیین، باعث می‌شود ممچک خطاهای ناشی از دسترسی غیرمجاز در آفست‌های مشخص‌شده زیر اشاره‌گر استک را گزارش نکند. این دو آفست باید اعداد ده‌دهی مثبت باشند و -- تا حدی برخلاف انتظار اولیه -- اولی باید بزرگ‌تر باشد تا بیانگر یک بازه آدرس بدون سرریز (non-wraparound) برای نادیده گرفتن باشد. برای مثال، به منظور نادیده گرفتن دسترسی‌های ۴ بایتی در فاصله ۸۱۹۲ بایت زیر اشاره‌گر استک، از --ignore-range-below-sp=8192-8189 استفاده کنید. تنها یک بازه را می‌توان مشخص کرد.

--show-mismatched-frees=<yes|no> [default: yes]

در صورت فعال بودن، ممچک بررسی می‌کند که بلوک‌های هیپ با استفاده از تابعی که با تابع تخصیص‌دهنده همخوانی دارد آزاد شوند. یعنی انتظار دارد که از free برای آزادسازی بلوک‌های تخصیص‌یافته توسط malloc، از delete برای بلوک‌های تخصیص‌یافته توسط new، و از delete[] برای بلوک‌های تخصیص‌یافته توسط new[] استفاده شود. اگر عدم تطابقی شناسایی شود، یک خطا گزارش خواهد شد. این امر عموماً مهم است چرا که در برخی محیط‌ها، آزادسازی با تابعی ناهمخوان می‌تواند به کرش کردن برنامه بینجامد.

با این وجود، سناریویی وجود دارد که در آن نمی‌توان از چنین عدم تطابق‌هایی جلوگیری کرد. آن سناریو زمانی است که کاربر پیاده‌سازی‌هایی از new/new[] ارائه می‌دهد که malloc را فراخوانی می‌کنند و پیاده‌سازی‌هایی از delete/delete[] که free را فراخوانی می‌نمایند، و این توابع به صورت نامتقارن درون‌خطی (inlined) می‌شوند. به عنوان مثال، تصور کنید که delete[] درون‌خطی شود ولی new[] درون‌خطی نشود. نتیجه این است که ممچک تمامی فراخوانی‌های delete[] را به عنوان فراخوانی مستقیم به free «می‌بیند»، حتی زمانی که کد مبدأ برنامه فاقد هرگونه فراخوانی ناهمخوان باشد.

این امر منجر به تعداد زیادی گزارش خطای گیج‌کننده و نامربوط می‌گردد. گزینه --show-mismatched-frees=no این بررسی‌ها را غیرفعال می‌کند. با این وجود، به طور کلی غیرفعال کردن آن‌ها توصیه نمی‌شود، زیرا در این صورت ممکن است خطاهای واقعی را از دست بدهید.

--show-realloc-size-zero=<yes|no> [default: yes]

در صورت فعال بودن، ممچک استفاده از تابع realloc با اندازه صفر را بررسی می‌کند. این کاربرد از realloc ناامن است زیرا قابل حمل نیست. در برخی سیستم‌ها رفتاری شبیه به free خواهد داشت. در سیستم‌های دیگر یا هیچ اثری نخواهد داشت و یا رفتاری مشابه یک فراخوانی به free به دنبال آن یک فراخوانی به malloc با اندازه صفر از خود نشان می‌دهد.

--ignore-ranges=0xPP-0xQQ[,0xRR-0xSS]

هر بازه‌ای که در این گزینه فهرست شود (و می‌توان چندین بازه را با کاما مشخص نمود) توسط بررسی آدرس‌پذیری ممچک نادیده گرفته خواهد شد.

--malloc-fill=<hexnumber>

بلوک‌های تخصیص‌یافته توسط malloc، new و غیره، اما نه توسط calloc را با بایت مشخص‌شده در مبنای شانزده (hexadecimal) پر می‌کند. این می‌تواند هنگام تلاش برای کشف مشکلات مبهم خرابی حافظه مفید باشد. ناحیه تخصیص‌یافته همچنان از نظر ممچک به عنوان متغیرهای تعریف‌نشده تلقی می‌شود -- این گزینه تنها بر محتوای آن تأثیر می‌گذارد. توجه داشته باشید که --malloc-fill روی یک بلوک حافظه در صورتی که به عنوان آرگومان برای درخواست‌های کلاینت استخر حافظه (memory pool) مانند VALGRIND_MEMPOOL_ALLOC یا VALGRIND_MALLOCLIKE_BLOCK استفاده شود، تأثیری نمی‌گذارد.

--free-fill=<hexnumber>

بلوک‌های آزادشده توسط free، delete و غیره را با مقدار بایت مشخص‌شده در مبنای شانزده (hexadecimal) پر می‌کند. این می‌تواند هنگام تلاش برای کشف مشکلات مبهم خرابی حافظه مفید باشد. ناحیه آزادشده همچنان از نظر ممچک به عنوان دسترسی غیرمجاز تلقی می‌شود -- این گزینه تنها بر محتوای آن تأثیر می‌گذارد. توجه داشته باشید که --free-fill روی یک بلوک حافظه در صورتی که به عنوان آرگومان برای درخواست‌های کلاینت استخر حافظه (memory pool) مانند VALGRIND_MEMPOOL_FREE یا VALGRIND_FREELIKE_BLOCK استفاده شود، تأثیری نمی‌گذارد.

--cachegrind-out-file=<file>

فایل خروجی Cachegrind را در file می‌نویسد، به‌جای فایل خروجی پیش‌فرض یعنی cachegrind.out.<pid>. از مشخص‌کننده‌های قالب‌بندی %p و %q می‌توان برای گنجاندن شناسه فرآیند و/یا محتوای یک متغیر محیطی در نام فایل استفاده کرد، همان‌گونه که در مورد گزینه هسته --log-file صادق است.

--cache-sim=no|yes [no]

جمع‌آوری تعداد دسترسی‌ها و خطاهای حافظه پنهان (کش) را فعال یا غیرفعال می‌کند.

--branch-sim=no|yes [no]

جمع‌آوری تعداد دستورالعمل‌های انشعاب و خطاهای پیش‌بینی انشعاب را فعال یا غیرفعال می‌کند.

--instr-at-start=no|yes [yes]

ابزار دقیق‌سازی را در آغاز اجرا فعال یا غیرفعال می‌کند. از این گزینه همراه با CACHEGRIND_START_INSTRUMENTATION و CACHEGRIND_STOP_INSTRUMENTATION استفاده کنید تا تنها بخشی از اجرای برنامه کلاینت اندازه‌گیری شود.

--I1=<size>,<associativity>,<line size>

اندازه، درجه انجمنی و اندازه خط حافظه پنهان دستورالعمل سطح ۱ را مشخص می‌کند. تنها همراه با --cache-sim=yes کاربرد دارد.

--D1=<size>,<associativity>,<line size>

اندازه، درجه انجمنی و اندازه خط حافظه پنهان داده سطح ۱ را مشخص می‌کند. تنها همراه با --cache-sim=yes کاربرد دارد.

--LL=<size>,<associativity>,<line size>

اندازه، درجه انجمنی و اندازه خط حافظه پنهان سطح نهایی را مشخص می‌کند. تنها همراه با --cache-sim=yes کاربرد دارد.

--callgrind-out-file=<file>

داده‌های پروفایل را در file می‌نویسد، به‌جای فایل خروجی پیش‌فرض یعنی callgrind.out.<pid>. مشخص‌کننده‌های قالب‌بندی %p و %q می‌توانند برای گنجاندن شناسه فرآیند و/یا محتوای یک متغیر محیطی در نام به کار روند، همان‌گونه که برای گزینه هسته --log-file صادق است. هنگامی که چندین تخلیه اطلاعات (دامپ) انجام می‌شود، نام فایل بیشتر تغییر می‌یابد؛ به توضیحات زیر مراجعه کنید.

--dump-line=<no|yes> [default: yes]

مشخص می‌کند که شمارش رویدادها باید در سطح دانه‌بندی خط سورس انجام شود. این کار امکان حاشیه‌نویسی کد منبع را برای برنامه‌هایی که با اطلاعات اشکال‌زدایی (-g) کامپایل شده‌اند فراهم می‌سازد.

--dump-instr=<no|yes> [default: no]

مشخص می‌کند که شمارش رویدادها باید در سطح دانه‌بندی هر دستورالعمل انجام شود. این کار امکان حاشیه‌نویسی کد اسمبلی را فراهم می‌سازد. در حال حاضر نتایج تنها توسط KCachegrind قابل نمایش است.

--compress-strings=<no|yes> [default: yes]

این گزینه بر قالب خروجی داده‌های پروفایل تأثیر می‌گذارد. مشخص می‌کند که آیا رشته‌ها (نام‌های فایل و تابع) باید با شناسه عددی مشخص شوند یا خیر. این کار حجم فایل را کاهش می‌دهد، اما خواندن آن را برای انسان دشوارتر می‌سازد (که در هر صورت خواندن دستی آن توصیه نمی‌شود).

--compress-pos=<no|yes> [default: yes]

این گزینه بر قالب خروجی داده‌های پروفایل تأثیر می‌گذارد. مشخص می‌کند که آیا موقعیت‌های عددی همواره به عنوان مقادیر مطلق مشخص شوند یا اجازه داشته باشند نسبت به اعداد قبلی به صورت نسبی باشند. این کار حجم فایل را کاهش می‌دهد.

--combine-dumps=<no|yes> [default: no]

در صورت فعال بودن، هنگامی که قرار است چندین بخش از داده‌های پروفایل تولید شوند، این بخش‌ها به همان فایل خروجی ضمیمه می‌گردند. توصیه نمی‌شود.

--dump-every-bb=<count> [default: 0, never]

تخلیه داده‌های پروفایل به ازای هر count بلوک پایه (basic block). اینکه آیا تخلیه داده‌ها لازم است یا خیر، تنها هنگام اجرای زمان‌بند داخلی والگریند بررسی می‌شود. بنابراین، کمترین مقدار مفید در حدود ۱۰۰۰۰۰ است. مقدار شمارنده یک عدد ۶۴ بیتی است تا دوره‌های تخلیه طولانی ممکن شود.

--dump-before=<function>

تخلیه داده‌ها هنگام ورود به function.

--zero-before=<function>

صفر کردن تمام هزینه‌ها هنگام ورود به function.

--dump-after=<function>

تخلیه داده‌ها هنگام خروج از function.

--instr-atstart=<yes|no> [default: yes]

مشخص می‌کند که آیا مایلید کالگریند شبیه‌سازی و تحلیل کارایی را از ابتدای برنامه آغاز کند یا خیر. هنگامی که روی no تنظیم شود، کالگریند قادر به جمع‌آوری هیچ اطلاعاتی، از جمله فراخوانی‌ها، نخواهد بود، اما حداکثر افتی در حدود ۴ برابر در سرعت خواهد داشت که کمترین بار اضافی (overhead) والگریند است. ابزار دقیق‌سازی را می‌توان به صورت تعاملی از طریق دستور callgrind_control -i on فعال کرد.

توجه داشته باشید که گراف فراخوانی حاصل به احتمال زیاد شامل main نخواهد بود، اما شامل تمامی توابعی است که پس از فعال شدن ابزار دقیق‌سازی اجرا شده‌اند. ابزار دقیق‌سازی را می‌توان همچنین به‌صورت برنامه‌نویسی‌شده فعال یا غیرفعال کرد. برای اطلاع از ماکرویی که باید در کد منبع خود به کار ببرید، فایل سرآیند کالگریند callgrind.h را مشاهده کنید.

برای شبیه‌سازی حافظه پنهان، در صورت فعال کردن ابزار دقیق‌سازی در مراحل بعدی اجرای برنامه، دقت نتایج کمتر خواهد بود، زیرا شبیه‌ساز در آن لحظه با یک حافظه پنهان خالی آغاز به کار می‌کند. برای غلبه بر این خطا، جمع‌آوری رویدادها را بعداً فعال نمایید.

--collect-atstart=<yes|no> [default: yes]

مشخص می‌کند که آیا جمع‌آوری رویدادها در آغاز اجرای پروفایل فعال باشد یا خیر.

برای بررسی تنها بخش‌هایی از برنامه خود، دو امکان دارید:

1.شمارنده‌های رویداد را قبل از ورود به بخش مورد نظر از برنامه صفر کنید، و پس از خروج از آن بخش برنامه، شمارنده‌های رویداد را در یک فایل تخلیه نمایید.
2.وضعیت جمع‌آوری را بنا به نیاز روشن یا خاموش کنید تا تنها شمارنده‌های رویدادی را ببینید که هنگام حضور در بخش مورد نظر از برنامه رخ می‌دهند.

در صورتی که بخش مورد نظر برنامه بارها فراخوانی شود، می‌توان از گزینه دوم استفاده کرد. گزینه ۱، یعنی ایجاد تعداد زیادی فایل تخلیه (دامپ)، در اینجا کاربردی نیست.

وضعیت جمع‌آوری را می‌توان در هنگام ورود و خروج یک تابع مشخص با گزینه --toggle-collect تغییر وضعیت داد (ضامن زد). اگر از این گزینه استفاده کنید، وضعیت جمع‌آوری در ابتدا باید غیرفعال باشد. توجه داشته باشید که تعیین گزینه --toggle-collect به طور ضمنی --collect-state=no را تنظیم می‌کند.

همچنین می‌توان وضعیت جمع‌آوری را با درج درخواست کلاینت CALLGRIND_TOGGLE_COLLECT ; در موقعیت‌های مورد نیاز از کد تغییر وضعیت داد.

--toggle-collect=<function>

تغییر وضعیت جمع‌آوری در هنگام ورود یا خروج از function.

--collect-jumps=<no|yes> [default: no]

مشخص می‌کند که آیا اطلاعات پرش‌های (شرطی) باید جمع‌آوری شود یا خیر. همانند بالا، در حال حاضر callgrind_annotate قادر به نمایش این داده‌ها به شما نیست. برای مشاهده فلش‌های پرش در کد حاشیه‌نویسی‌شده باید از KCachegrind استفاده کنید.

--collect-systime=<no|yes|msec|usec|nsec> [default: no]

مشخص می‌کند که آیا اطلاعات زمان فراخوانی‌های سیستمی باید جمع‌آوری شود یا خیر.

مقدار no نشان‌دهنده عدم ثبت هرگونه اطلاعات فراخوانی سیستمی است.

سایر مقادیر نشان‌دهنده ثبت تعداد فراخوانی‌های سیستمی انجام‌شده (رویداد sysCount) و زمان سپری‌شده (رویداد sysTime) در فراخوانی‌های سیستمی است. مقدار --collect-systime واحد استفاده‌شده برای sysTime را مشخص می‌کند: میلی‌ثانیه، میکروثانیه یا نانوثانیه. با مقدار nsec، کالگریند زمان پردازنده (CPU) مصرف‌شده در طول فراخوانی‌های سیستمی (sysCpuTime) را نیز ثبت می‌کند.

مقدار yes مترادف msec است. مقدار nsec در سامانه داروین (Darwin) پشتیبانی نمی‌شود.

--collect-bus=<no|yes> [default: no]

مشخص می‌کند که آیا تعداد رویدادهای گذرگاه سراسری اجراشده باید جمع‌آوری شود یا خیر. نوع رویداد "Ge" برای این رویدادها استفاده می‌شود.

--cache-sim=<yes|no> [default: no]

مشخص می‌کند که آیا مایل به انجام شبیه‌سازی کامل حافظه پنهان (کش) هستید یا خیر. به‌طور پیش‌فرض، تنها دسترسی‌های خواندن دستورالعمل شمارش می‌شوند ("Ir"). با شبیه‌سازی کش، شمارنده‌های رویداد بیشتری فعال می‌شوند: خطاهای حافظه پنهان در خواندن دستورالعمل ("I1mr"/"ILmr")، دسترسی‌های خواندن داده ("Dr") و خطاهای حافظه پنهان مرتبط با آن ("D1mr"/"DLmr")، دسترسی‌های نوشتن داده ("Dw") و خطاهای حافظه پنهان مرتبط با آن ("D1mw"/"DLmw"). برای اطلاعات بیشتر، بخش Cachegrind: a cache and branch-prediction profiler را مشاهده کنید.

--branch-sim=<yes|no> [default: no]

مشخص می‌کند که آیا مایل به انجام شبیه‌سازی پیش‌بینی انشعاب هستید یا خیر. شمارنده‌های رویداد بیشتری فعال می‌شوند: تعداد انشعاب‌های شرطی اجراشده و خطاهای پیش‌بینی مرتبط با آن‌ها ("Bc"/"Bcm")، پرش‌های غیرمستقیم اجراشده و خطاهای مرتبط با پیش‌بینی‌کننده آدرس پرش ("Bi"/"Bim").

--free-is-write=no|yes [default: no]

در صورت فعال بودن (که پیش‌فرض نیست)، هلگریند با آزادسازی حافظه هیپ طوری رفتار می‌کند که گویی بلافاصله پیش از آزادسازی روی حافظه نوشته شده است. این کار شرایط رقابتی (race conditions) را در مواردی آشکار می‌سازد که یک ریسه به حافظه ارجاع داده و ریسه دیگری آن را آزاد می‌کند، اما هیچ رویداد همگام‌سازی قابل مشاهده‌ای وجود ندارد که تضمین کند ارجاع قبل از آزادسازی صورت گرفته است.

این قابلیت در والگریند ۳.۷.۰ جدید است و آزمایشی تلقی می‌شود. این ویژگی به طور پیش‌فرض فعال نیست زیرا تعامل آن با تخصیص‌دهنده‌های حافظه سفارشی در حال حاضر به خوبی شناخته نشده است. از بازخورد کاربران استقبال می‌شود.

--track-lockorders=no|yes [default: yes]

در صورت فعال بودن (پیش‌فرض)، هلگریند بررسی سازگاری ترتیب قفل‌ها را انجام می‌دهد. در برخی برنامه‌های دارای اشکال، گزارش تعداد زیاد خطاهای ترتیب قفل می‌تواند آزاردهنده باشد، به‌ویژه اگر فقط به خطاهای شرایط رقابتی علاقه‌مند باشید. بنابراین ممکن است غیرفعال کردن بررسی ترتیب قفل برای شما مفید باشد.

--history-level=none|approx|full [default: full]

گزینه --history-level=full (پیش‌فرض) سبب می‌شود هلگریند اطلاعات کافی درباره دسترسی‌های «قدیمی» جمع‌آوری کند تا بتواند دو ردپای پشته (stack trace) را در گزارش شرایط رقابتی تولید نماید -- هم ردپای پشته برای دسترسی جاری و هم ردپا برای دسترسی قدیمی‌تر و متناقض. برای محدود کردن مصرف حافظه، ردپای پشته دسترسی‌های «قدیمی» حداکثر به --history-backtrace-size ورودی (پیش‌فرض ۸) یا به مقدار --num-callers اگر این مقدار کوچکتر باشد، محدود می‌شود.

جمع‌آوری چنین اطلاعاتی هم از نظر سرعت و هم از نظر مصرف حافظه پرهزینه است، به‌ویژه برای برنامه‌هایی که رویدادهای همگام‌سازی بین‌ریسه‌ای فراوانی انجام می‌دهند (قفل‌ها، باز کردن قفل‌ها و غیره). بدون چنین اطلاعاتی، پیگیری و یافتن علل ریشه‌ای شرایط رقابتی دشوارتر است. با این وجود، ممکن است در شرایطی که تنها می‌خواهید وجود یا عدم وجود شرایط رقابتی را بررسی کنید، نیازی به آن نداشته باشید؛ برای مثال هنگام انجام آزمون رگرسیون روی برنامه‌ای که قبلاً عاری از شرایط رقابتی بوده است.

گزینه --history-level=none نقطه افراطی مقابل است. این گزینه سبب می‌شود هلگریند هیچ اطلاعاتی درباره دسترسی‌های قبلی جمع‌آوری نکند. این حالت می‌تواند به طور چشمگیری سریع‌تر از --history-level=full باشد.

گزینه --history-level=approx سازشی میان این دو نقطه افراطی فراهم می‌کند. این گزینه سبب می‌شود هلگریند یک ردپای کامل برای دسترسی بعدی و اطلاعاتی تقریبی درباره دسترسی قبلی نشان دهد. این اطلاعات تقریبی شامل دو پشته است، و تضمین می‌شود که دسترسی قبلی در جایی بین نقاطی از برنامه که توسط این دو پشته مشخص شده‌اند رخ داده است. این حالت به اندازه نمایش پشته دقیق برای دسترسی قبلی (آن‌گونه که --history-level=full انجام می‌دهد) سودمند نیست، اما بهتر از هیچ است و تقریباً به همان سرعت --history-level=none می‌باشد.

--history-backtrace-size=<number> [default: 8]

هنگامی که --history-level=full انتخاب شده باشد، --history-backtrace-size=number نشان می‌دهد که چه تعداد ورودی در ردپای پشته دسترسی‌های «قدیمی» ثبت شود.

--delta-stacktrace=no|yes [default: yes on linux amd64/x86]

این فلگ تنها در --history-level=full تأثیرگذار است.

گزینه --delta-stacktrace روشی را که هلگریند ردپای پشته را برای گزینه --history-level=full ثبت می‌کند پیکربندی می‌نماید. چنین ردپای پشته‌ای معمولاً هر بار که بخش جدیدی از حافظه در یک بلوک پایه از دستورالعمل‌ها خوانده یا نوشته می‌شود، مورد نیاز است.

مقدار --delta-stacktrace=no باعث می‌شود هلگریند هر بار که به ردپای پشته نیاز است، یک ردپای پشته تاریخچه کامل را از روی اطلاعات بازپیچی (unwind) محاسبه کند.

مقدار --delta-stacktrace=yes به هلگریند اعلام می‌کند که تا زمانی که هیچ دستورالعمل فراخوانی، دستورالعمل بازگشت یا هر دستورالعمل دیگری که پشته فراخوانی را از زمان ثبت آخرین ردپای پشته تغییر دهد وجود نداشته باشد، ردپای پشته جدید را از روی ردپای قبلی مشتق کند. اگر چنین دستورالعملی اجرا نشده باشد، ردپای جدید پشته می‌تواند تنها با تغییر فریم بالایی به شمارنده فعلی برنامه (program counter) از روی ردپای قبلی به دست آید. این گزینه هنگام استفاده از --history-level=full می‌تواند سرعت هلگریند را تا ۲۵٪ افزایش دهد.

هنگام استفاده از --delta-stacktrace=yes باید جنبه‌های زیر را در نظر گرفت:

•در برخی موارد (برای مثال در مقدمه یک تابع یا prologue)، بازپیچ پشته والگریند ممکن است به دلیل برخی محدودیت‌ها و/یا به دلیل اطلاعات بازپیچی نادرست، نتواند پشته را به درستی بازپیچی کند. هنگام استفاده از --delta-stacktrace=yes، ردپای پشته نادرستِ ثبت‌شده در مقدمه تابع تا فراخوانی یا بازگشت بعدی حفظ خواهد شد.
•از سوی دیگر، --delta-stacktrace=yes گاهی به دریافت یک ردپای پشته صحیح کمک می‌کند، برای مثال زمانی که اطلاعات بازپیچی امکان تولید ردپای پشته صحیح را در ابتدای دنباله فراهم می‌سازد، اما در ادامه دنباله دستورالعمل‌ها چنین امکانی وجود ندارد.
•تشخیص اینکه کدام دستورالعمل‌ها پشته فراخوانی را تغییر می‌دهند تا حدی بر اساس روش‌های اکتشافی (هیوریستیک) وابسته به پلتفرم است که باید به‌طور خاص برای آن پلتفرم تنظیم و اعتبارسنجی شوند. همچنین، بازپیچی در مقدمه یک تابع باید به قدر کافی مناسب باشد تا اجازه استفاده از --delta-stacktrace=yes را بدهد. در حال حاضر، گزینه --delta-stacktrace=yes تنها بر روی لینوکس x86 ۳۲ بیتی و لینوکس amd64 ۶۴ بیتی به طور معقولی اعتبارسنجی شده است. برای جزئیات بیشتر درباره نحوه اعتبارسنجی --delta-stacktrace=yes، گزینه اشکال‌زدایی --hg-sanity-flags و تابع check_cached_rcec_ok را در libhb_core.c ببینید.

--conflict-cache-size=N [default: 1000000]

این فلگ تنها در --history-level=full تأثیر دارد.

اطلاعات مربوط به دسترسی‌های متناقض «قدیمی» در یک حافظه پنهان با اندازه محدود و با مدیریت به سبک LRU ذخیره می‌شود. این کار ضروری است زیرا ذخیره یک ردپای پشته برای تک‌تک دسترسی‌های حافظه انجام‌شده توسط برنامه امکان‌پذیر و عملی نیست. اطلاعات پیشین درباره مکان‌هایی که اخیراً مورد دسترسی قرار نگرفته‌اند به‌طور دوره‌ای دور ریخته می‌شوند تا فضا در حافظه پنهان آزاد شود.

این گزینه اندازه حافظه پنهان را بر حسب تعداد آدرس‌های حافظه متفاوتی که اطلاعات دسترسی‌های متناقض برای آن‌ها ذخیره می‌شود، کنترل می‌کند. اگر متوجه شدید که هلگریند خطاهای شرایط رقابتی را تنها با یک پشته به جای دو پشته مورد انتظار نشان می‌دهد، افزایش این مقدار را امتحان کنید.

حداقل مقدار ۱۰۰۰۰ و حداکثر ۳۰۰۰۰۰۰۰ (سی برابر مقدار پیش‌فرض) است. افزایش مقدار به اندازه ۱ نیاز حافظه هلگریند را بسیار تقریبی حدود ۱۰۰ بایت افزایش می‌دهد، بنابراین حداکثر مقدار به سادگی حدود سه گیگابایت یا بیشتر حافظه اضافی مصرف خواهد کرد.

--check-stack-refs=no|yes [default: yes]

به طور پیش‌فرض هلگریند تمام دسترسی‌های حافظه داده انجام‌شده توسط برنامه شما را بررسی می‌کند. این فلگ به شما امکان می‌دهد از بررسی دسترسی‌ها به پشته‌های ریسه (متغیرهای محلی) صرف‌نظر کنید. این کار می‌تواند کارایی را بهبود بخشد، اما به بهای از دست رفتن تشخیص شرایط رقابتی روی داده‌های تخصیص‌یافته روی پشته تمام می‌شود.

--ignore-thread-creation=<yes|no> [default: no]

کنترل می‌کند که آیا تمام فعالیت‌ها در هنگام ایجاد ریسه باید نادیده گرفته شوند یا خیر. به طور پیش‌فرض تنها در سولاریس فعال است. سولاریس پهنای باند کاری، همزمانی و مقیاس‌پذیری بالاتری را نسبت به سایر سیستم‌عامل‌ها ارائه می‌دهد، به قیمت فعالیت‌های قفل‌گذاری ریزدانه‌تر. این بدان معناست که به عنوان مثال هنگامی که یک ریسه تحت glibc ایجاد می‌شود، تنها یک قفل بزرگ برای تمام مراحل راه‌اندازی ریسه استفاده می‌شود. اما libc سولاریس از چندین قفل ریزدانه استفاده می‌کند و ریسه ایجادکننده فعالیت‌های خود را در سریع‌ترین زمان ممکن از سر می‌گیرد، و مثلاً مراحل راه‌اندازی پشته و TLS را به ریسه ایجادشده واگذار می‌کند. این وضعیت هلگریند را سردرگم می‌کند زیرا فرض می‌کند نوعی ترتیب کاذب بین ریسه سازنده و ریسه ایجادشده وجود دارد؛ بنابراین بسیاری از انواع شرایط رقابتی در برنامه گزارش نخواهند شد. برای جلوگیری از چنین ترتیب کاذبی، این گزینه خط فرمان به طور پیش‌فرض در سولاریس بر روی yes تنظیم شده است. بنابراین کلیه فعالیت‌ها (بارگذاری‌ها، ذخیره‌سازی‌ها، درخواست‌های کلاینت) در طول موارد زیر نادیده گرفته می‌شوند:
•فراخوانی pthread_create() در ریسه سازنده
•مرحله ایجاد ریسه (راه‌اندازی پشته و TLS) در ریسه ایجادشده

همچنین حافظه جدید تخصیص‌یافته در حین ایجاد ریسه ردگیری نمی‌شود، یعنی گزارش شرایط رقابتی در آنجا سرکوب می‌گردد. ابزار DRD نیز همین کار را به صورت ضمنی انجام می‌دهد. این امر ضروری است زیرا libc سولاریس بسیاری از اشیاء را کش می‌کند و آن‌ها را برای ریسه‌های مختلف دوباره به کار می‌برد و این موضوع هلگریند را سردرگم می‌سازد.

--check-stack-var=<yes|no> [default: no]

کنترل می‌کند که آیا DRD شرایط رقابتی داده (data races) روی متغیرهای پشته را شناسایی کند یا خیر. راستی‌آزمایی متغیرهای پشته به طور پیش‌فرض غیرفعال است زیرا اکثر برنامه‌ها متغیرهای پشته را بین ریسه‌ها به اشتراک نمی‌گذارند.

--exclusive-threshold=<n> [default: off]

اگر هر موتکس یا قفل نویسنده‌ای بیشتر از زمان مشخص‌شده به میلی‌ثانیه نگه داشته شود، یک پیام خطا چاپ می‌کند. این گزینه امکان تشخیص تداخل قفل (lock contention) را فراهم می‌سازد.

--join-list-vol=<n> [default: 10]

شرایط رقابتی داده‌ای که بین یک عبارت در انتهای یک ریسه و ریسه‌ای دیگر رخ می‌دهد، اگر اطلاعات دسترسی به حافظه بلافاصله پس از پیوستن (join) یک ریسه دور ریخته شود، ممکن است نادیده گرفته شود. این گزینه امکان تعیین این را می‌دهد که اطلاعات دسترسی حافظه برای چه تعداد ریسه پیوسته نگه‌داری شود.

--first-race-only=<yes|no> [default: no]

تعیین می‌کند که آیا فقط اولین شرایط رقابتی داده شناسایی‌شده روی یک مکان از حافظه گزارش شود یا تمامی موارد شرایط رقابتی داده شناسایی‌شده روی آن مکان حافظه گزارش گردند.

--free-is-write=<yes|no> [default: no]

تعیین می‌کند که آیا شرایط رقابتی میان دسترسی به حافظه و آزادسازی حافظه گزارش شود یا خیر. فعال‌سازی این گزینه ممکن است سبب شود DRD کمی آهسته‌تر اجرا شود. نکات:
•هنگام استفاده از تخصیص‌دهنده‌های حافظه سفارشی که از VG_USERREQ__MALLOCLIKE_BLOCK و VG_USERREQ__FREELIKE_BLOCK استفاده می‌کنند این گزینه را فعال نکنید، زیرا موجب هشدارهای مثبت کاذب (false positives) می‌شود.
•هنگام استفاده از اشیاء دارای شمارشگر ارجاع (reference-counted) این گزینه را فعال نکنید زیرا سبب هشدارهای مثبت کاذب خواهد شد، حتی زمانی که آن کد به درستی با ANNOTATE_HAPPENS_BEFORE و ANNOTATE_HAPPENS_AFTER حاشیه‌نویسی شده باشد. برای مثال خروجی دستور زیر را مشاهده کنید: valgrind --tool=drd --free-is-write=yes drd/tests/annotate_smart_pointer.

--report-signal-unlocked=<yes|no> [default: yes]

تعیین می‌کند که آیا فراخوانی‌های pthread_cond_signal و pthread_cond_broadcast در صورتی که موتکس مرتبط با سیگنال از طریق pthread_cond_wait یا pthread_cond_timed_wait در زمان ارسال سیگنال قفل نشده باشد، گزارش شوند یا خیر. ارسال یک سیگنال بدون در اختیار داشتن قفل روی موتکس مربوطه یک خطای برنامه‌نویسی رایج است که می‌تواند باعث شرایط رقابتی ظریف و رفتارهای غیرقابل پیش‌بینی شود. با این وجود برخی الگوهای نامتعارف همگام‌سازی وجود دارند که در آن‌ها ارسال سیگنال بدون در اختیار داشتن قفل روی موتکس مرتبط، امن و بی‌خطر است.

--segment-merging=<yes|no> [default: yes]

ادغام قطعات (segment merging) را کنترل می‌کند. ادغام قطعات الگوریتمی برای محدود کردن میزان مصرف حافظه الگوریتم تشخیص شرایط رقابتی داده است. غیرفعال کردن ادغام قطعات ممکن است دقت به اصطلاح «قطعات دیگر» ('other segments') نمایش‌یافته در گزارش‌های شرایط رقابتی را بهبود بخشد اما می‌تواند خطای اتمام حافظه (out of memory) را نیز ایجاد کند.

--segment-merging-interval=<n> [default: 10]

ادغام قطعات را تنها پس از ایجاد تعداد مشخص‌شده قطعات جدید انجام می‌دهد. این یک گزینه پیکربندی پیشرفته است که به فرد امکان می‌دهد انتخاب کند آیا با برگزیدن یک مقدار کم مصرف حافظه DRD را به حداقل برساند یا با انتخاب مقداری کمی بالاتر اجازه دهد DRD سریع‌تر اجرا شود. مقدار بهینه برای این پارامتر به برنامه‌ای که تحلیل می‌شود بستگی دارد. مقدار پیش‌فرض برای اکثر برنامه‌ها به خوبی کار می‌کند.

--shared-threshold=<n> [default: off]

اگر یک قفل خواننده بیشتر از زمان مشخص‌شده (به میلی‌ثانیه) نگه داشته شود، یک پیام خطا چاپ می‌کند. این گزینه امکان تشخیص تداخل قفل را فراهم می‌سازد.

--show-confl-seg=<yes|no> [default: yes]

نمایش قطعات متناقض در گزارش‌های شرایط رقابتی. از آنجا که این اطلاعات می‌تواند به یافتن علت شرایط رقابتی داده کمک کند، این گزینه به طور پیش‌فرض فعال است. غیرفعال کردن این گزینه خروجی DRD را فشرده‌تر می‌کند.

--show-stack-usage=<yes|no> [default: no]

میزان استفاده از پشته را در زمان خروج ریسه چاپ می‌کند. هنگامی که یک برنامه تعداد زیادی ریسه ایجاد می‌کند، محدود کردن میزان حافظه مجازی تخصیص‌داده‌شده برای پشته‌های ریسه اهمیت پیدا می‌کند. این گزینه مشاهده مقدار حافظه پشته مصرف‌شده توسط هر ریسه از برنامه کلاینت را ممکن می‌سازد. نکته: خود ابزار DRD مقداری داده موقت را روی پشته ریسه کلاینت تخصیص می‌دهد. فضای لازم برای این داده‌های موقت باید توسط برنامه کلاینت هنگام تخصیص حافظه پشته تأمین شود، اما در میزان استفاده از پشته که توسط DRD گزارش می‌شود گنجانده نمی‌شود.

--ignore-thread-creation=<yes|no> [default: no]

کنترل می‌کند که آیا تمام فعالیت‌ها در حین ایجاد ریسه باید نادیده گرفته شوند یا خیر. به طور پیش‌فرض تنها در سولاریس فعال است. سولاریس توان عملیاتی، همزمانی و مقیاس‌پذیری بالاتری را نسبت به سایر سیستم‌عامل‌ها فراهم می‌کند، به بهای فعالیت‌های قفل‌گذاری ریزدانه‌تر. این بدان معناست که برای نمونه هنگامی که یک ریسه تحت glibc ایجاد می‌شود، فقط یک قفل بزرگ برای تمام مراحل راه‌اندازی ریسه استفاده می‌گردد. اما libc سولاریس از چندین قفل ریزدانه استفاده می‌کند و ریسه سازنده فعالیت‌های خود را در سریع‌ترین زمان ممکن از سر می‌گیرد، و مثلاً مراحل راه‌اندازی پشته و TLS را به ریسه ایجادشده واگذار می‌کند. این وضعیت DRD را سردرگم می‌کند زیرا فرض می‌کند نوعی ترتیب کاذب میان ریسه سازنده و ریسه ایجادشده برقرار است؛ و بنابراین بسیاری از انواع شرایط رقابتی در برنامه گزارش نخواهند شد. برای جلوگیری از چنین ترتیب کاذبی، این گزینه خط فرمان به طور پیش‌فرض در سولاریس بر روی yes تنظیم شده است. بنابراین کلیه فعالیت‌ها (بارگذاری‌ها، ذخیره‌سازی‌ها، درخواست‌های کلاینت) در طول موارد زیر نادیده گرفته می‌شوند:
•فراخوانی pthread_create() در ریسه سازنده
•مرحله ایجاد ریسه (راه‌اندازی پشته و TLS) در ریسه ایجادشده

--trace-addr=<address> [default: none]

ردگیری کلیه فعالیت‌های بارگذاری و ذخیره‌سازی برای آدرس مشخص‌شده. این گزینه می‌تواند بیش از یک بار مشخص شود.

--ptrace-addr=<address> [default: none]

ردگیری کلیه فعالیت‌های بارگذاری و ذخیره‌سازی برای آدرس مشخص‌شده و ادامه دادن آن حتی پس از آزاد شدن و تخصیص مجدد حافظه در آن آدرس.

--trace-alloc=<yes|no> [default: no]

ردگیری کلیه تخصیص‌ها و آزادسازی‌های حافظه. ممکن است حجم عظیمی از خروجی تولید کند.

--trace-barrier=<yes|no> [default: no]

ردگیری کلیه فعالیت‌های مانع (barrier).

--trace-cond=<yes|no> [default: no]

ردگیری کلیه فعالیت‌های متغیر شرط (condition variable).

--trace-fork-join=<yes|no> [default: no]

ردگیری کلیه رویدادهای ایجاد و خاتمه ریسه‌ها.

--trace-hb=<yes|no> [default: no]

ردگیری اجرای درخواست‌های کلاینت ANNOTATE_HAPPENS_BEFORE()، ANNOTATE_HAPPENS_AFTER() و ANNOTATE_HAPPENS_DONE().

--trace-mutex=<yes|no> [default: no]

ردگیری کلیه فعالیت‌های موتکس (mutex).

--trace-rwlock=<yes|no> [default: no]

ردگیری کلیه فعالیت‌های قفل خواننده-نویسنده (reader-writer lock).

--trace-semaphore=<yes|no> [default: no]

ردگیری کلیه فعالیت‌های سمافور (semaphore).

--heap=<yes|no> [default: yes]

مشخص می‌کند که آیا تحلیل کارایی (پروفایل‌گیری) هیپ باید انجام شود یا خیر.

--heap-admin=<size> [default: 8]

در صورت فعال بودن تحلیل کارایی هیپ، تعداد بایت‌های مدیریتی به ازای هر بلوک را برای استفاده مشخص می‌کند. این مقدار باید یک تخمین میانگین باشد، زیرا ممکن است متغیر باشد. برای مثال، تخصیص‌دهنده حافظه مورد استفاده توسط glibc در لینوکس، بسته به عوامل گوناگون، به چیزی بین ۴ تا ۱۵ بایت در هر بلوک نیاز دارد. آن تخصیص‌دهنده برای بلوک‌های آزادشده نیز به فضای مدیریتی نیاز دارد، اما ماسیف (Massif) نمی‌تواند این مقدار را به حساب آورد.

--stacks=<yes|no> [default: no]

مشخص می‌کند که آیا تحلیل کارایی پشته باید انجام شود یا خیر. این گزینه سرعت ماسیف را به شدت کاهش می‌دهد، بنابراین به طور پیش‌فرض غیرفعال است. توجه داشته باشید که ماسیف فرض می‌کند پشته اصلی در زمان راه‌اندازی اندازه‌ای برابر با صفر دارد. این فرض درست نیست، اما انجام دقیق‌تر آن به گونه‌ای دیگر دشوار است. علاوه بر این، شروع از صفر اندازه آن بخشی از پشته اصلی را که برنامه کاربر واقعاً بر آن کنترل دارد، بهتر نشان می‌دهد.

اگر حداقل ۴ آرگومان پرگویی -v ارائه دهید، ماسیف برای هر افزایش و کاهش پشته یک ردگیری تولید می‌کند. ردگیری افزایش پشته شامل آدرس IP (اشاره‌گر دستورالعمل) است که پشته را افزایش داده است. توجه داشته باشید که برای دریافت آدرس کاملاً دقیق IP، باید گزینه‌های -px-default=unwindregs-at-mem-access --px-file-backed=unwindregs-at-mem-access را مشخص کنید.

--pages-as-heap=<yes|no> [default: no]

به ماسیف اعلام می‌کند که به جای سطح بلوک‌های تخصیص‌یافته با malloc، تحلیل کارایی حافظه را در سطح صفحه انجام دهد. برای جزئیات به بخش‌های بالا مراجعه کنید.

--depth=<number> [default: 30]

حداکثر عمق درخت‌های تخصیص ثبت‌شده برای عکس‌های فوری (اسنپ‌شات‌های) دقیق. افزایش آن باعث می‌شود ماسیف تا حدی کندتر اجرا شود، حافظه بیشتری مصرف کند و فایل‌های خروجی بزرگ‌تری تولید نماید.

--alloc-fn=<name>

با توابعی که توسط این گزینه مشخص می‌شوند به گونه‌ای رفتار خواهد شد که گویی یک تابع تخصیص هیپ مانند malloc هستند. این قابلیت برای توابعی که پوشش‌دهنده (wrapper) برای malloc یا new هستند مفید است، چرا که می‌توانند درخت‌های تخصیص را با اطلاعات بی‌اهمیت پر کنند. این گزینه می‌تواند چندین بار در خط فرمان مشخص شود تا چندین تابع نام‌گذاری شوند.

توجه داشته باشید که با تابع نام‌برده تنها زمانی به این شیوه رفتار می‌شود که بالاترین مدخل در ردگیری پشته باشد، یا دقیقاً زیر تابع دیگری قرار داشته باشد که با آن به این شیوه رفتار شده است. برای مثال، اگر تابعی به نام malloc1 داشته باشید که malloc را پوشش می‌دهد، و malloc2 که malloc1 را پوشش می‌دهد، تنها تعیین کردن --alloc-fn=malloc2 هیچ اثری نخواهد داشت. شما باید --alloc-fn=malloc1 را نیز تعیین کنید. این موضوع کمی ناخوشایند است، اما دلیل آن این است که بررسی توابع تخصیص کند است، و اگر ماسیف بتواند به محض یافتن مدخلی که مطابقت ندارد جستجو در مدخل‌های ردگیری پشته را متوقف کند، زمان بسیار زیادی صرفه‌جویی می‌شود تا اینکه مجبور باشد تمام مدخل‌ها را پیمایش کند.

توجه داشته باشید که نام‌های ++C به صورت demangle شده (نام‌های اصلی پیش از درهم‌ریزی) هستند. همچنین توجه داشته باشید که نام‌های چندریختی (overloaded) در ++C باید به طور کامل نوشته شوند. ممکن است استفاده از نقل‌قول‌های تکی برای جلوگیری از تفکیک آن‌ها توسط شل لازم باشد. برای مثال:

--alloc-fn='operator new(unsigned, std::nothrow_t const&)'

آرگومان‌هایی از نوع size_t باید در بسترهای ۶۴ بیتی با unsigned long و در بسترهای ۳۲ بیتی با unsigned جایگزین شوند.

گزینه --alloc-fn با توابع درون‌خطی (inline) نیز کار خواهد کرد. نام‌های توابع درون‌خطی درهم‌ریخته (mangled) نمی‌شوند، به این معنی که فقط باید نام تابع را مشخص کنید و نیازی به ذکر فهرست آرگومان‌ها نیست.

گزینه --alloc-fn از نویسه‌های عام (wildcards) پشتیبانی نمی‌کند.

--ignore-fn=<name>

هرگونه تخصیص مستقیم هیپ (یعنی فراخوانی malloc، new و غیره، یا فراخوانی تابعی که با گزینه --alloc-fn نام‌گذاری شده است) که درون تابعی رخ دهد که با این گزینه مشخص شده است، نادیده گرفته خواهد شد. این قابلیت عمدتاً برای اهداف آزمایشی کاربرد دارد. این گزینه می‌تواند چندین بار در خط فرمان تعیین شود تا چندین تابع نام‌گذاری شوند.

هرگونه realloc بر روی یک بلوک نادیده‌گرفته‌شده نیز نادیده گرفته خواهد شد، حتی اگر فراخوانی realloc در یک تابع نادیده‌گرفته‌شده رخ ندهد. این کار از احتمال منفی شدن اندازه هیپ در صورتی که بلوک‌های نادیده‌گرفته‌شده با realloc کوچک شوند، جلوگیری می‌کند.

قوانین نوشتن نام توابع ++C همانند قوانین مربوط به --alloc-fn در بالا است.

--threshold=<m.n> [default: 1.0]

آستانه اهمیت برای تخصیص‌های هیپ، بر حسب درصدی از کل اندازه حافظه. مدخل‌های درخت تخصیص که کمتر از این مقدار باشند، با یکدیگر تجمیع خواهند شد. توجه داشته باشید که این گزینه باید همگام با گزینه‌ای با همین نام در ms_print مشخص شود.

--peak-inaccuracy=<m.n> [default: 1.0]

ماسیف لزوماً نقطه اوج واقعی تخصیص حافظه سراسری را ثبت نمی‌کند؛ به طور پیش‌فرض این ابزار تنها زمانی یک نقطه اوج را ثبت می‌کند که اندازه تخصیص حافظه سراسری حداقل ۱.۰٪ از نقطه اوج قبلی بیشتر شود. این بدان دلیل است که ممکن است در طول مسیر، نقاط اوج محلی زیادی وجود داشته باشد و ثبت یک عکس فوری با جزئیات دقیق برای هر یک از آن‌ها پرهزینه و بیهوده خواهد بود، چرا که همه آن‌ها به جز یکی بعداً دور ریخته می‌شوند. این عدم دقت می‌تواند با این گزینه تغییر کند (حتی تا ۰.۰٪)، اما با نزدیک شدن این عدد به صفر، سرعت اجرای ماسیف به شدت کاهش خواهد یافت.

--time-unit=<i|ms|B> [default: i]

واحد زمان مورد استفاده برای تحلیل کارایی. سه حالت امکان‌پذیر است: دستورالعمل‌های اجراشده (i) که برای بیشتر موارد مناسب است؛ زمان واقعی یا ساعت دیواری (ms، یعنی میلی‌ثانیه) که در برخی مواقع مفید است؛ و بایت‌های تخصیص‌یافته/آزادشده در هیپ و/یا پشته (B) که برای برنامه‌های با اجرای بسیار کوتاه و برای اهداف آزمایشی کاربرد دارد، زیرا بیشترین قابلیت بازتولید را در ماشین‌های گوناگون داراست.

--detailed-freq=<n> [default: 10]

بسامد عکس‌های فوری با جزئیات دقیق. با --detailed-freq=1، هر عکس فوری با جزئیات دقیق خواهد بود.

--max-snapshots=<n> [default: 100]

حداکثر تعداد عکس‌های فوری ثبت‌شده. اگر روی N تنظیم شود، برای تمام برنامه‌ها به جز برنامه‌های با اجرای بسیار کوتاه، تعداد نهایی عکس‌های فوری بین N/2 و N خواهد بود.

--massif-out-file=<file> [default: massif.out.%p]

نوشتن داده‌های نمایه کارایی در file به جای فایل خروجی پیش‌فرض، یعنی massif.out.<pid>. مشخص‌کننده‌های قالب %p و %q می‌توانند برای گنجاندن شناسه پردازش و/یا محتوای یک متغیر محیطی در نام استفاده شوند، همان‌طور که برای گزینه هسته --log-file صادق است.

--bb-out-file=<name> [default: bb.out.%p]

این گزینه نام فایل بردار بلوک پایه (basic block vector) را انتخاب می‌کند. مشخص‌کننده‌های قالب %p و %q می‌توانند برای گنجاندن شناسه پردازش و/یا محتوای یک متغیر محیطی در نام استفاده شوند، همان‌طور که برای گزینه هسته --log-file صادق است.

--pc-out-file=<name> [default: pc.out.%p]

این گزینه نام فایل PC را انتخاب می‌کند. این فایل آدرس‌های شمارنده برنامه (program counter) و اطلاعات نام توابع را برای بلوک‌های پایه گوناگون نگه‌داری می‌کند. این فایل می‌تواند در کنار فایل بردار بلوک پایه برای جلو بردن سریع از طریق نام توابع به جای شمارش صرف دستورالعمل‌ها به کار رود. مشخص‌کننده‌های قالب %p و %q می‌توانند برای گنجاندن شناسه پردازش و/یا محتوای یک متغیر محیطی در نام استفاده شوند، همان‌طور که برای گزینه هسته --log-file صادق است.

--interval-size=<number> [default: 100000000]

این گزینه اندازه بازه مورد استفاده را انتخاب می‌کند. مقدار پیش‌فرض ۱۰۰ میلیون دستورالعمل است که یک مقدار پرکاربرد محسوب می‌شود. اندازه‌های دیگر را نیز می‌توان استفاده کرد؛ بازه‌های کوچک‌تر می‌توانند به برنامه‌های دارای فازهای با دانه‌بندی دقیق‌تر کمک کنند. با این حال، اندازه بازه کوچک‌تر می‌تواند به دلیل اثرات راه‌اندازی اولیه (warm-up) به مشکلاتی در دقت منجر شود (هنگام جلو بردن سریع، ویژگی‌های معماری گوناگون مقداردهی اولیه نشده باقی می‌مانند، و اجرای تعدادی دستورالعمل نیاز خواهد بود تا این ویژگی‌ها به وضعیتی که یک شبیه‌سازی کامل بدون جلو بردن سریع در آن قرار می‌گرفت «گرم» شوند. اندازه‌های بازه بزرگ معمولاً این مشکل را کاهش می‌دهند.)

--instr-count-only [default: no]

این گزینه به ابزار اعلام می‌کند که تنها مجموع شمارش دستورالعمل‌ها را نمایش دهد و فایل اصلی بردار بلوک پایه را ایجاد نکند. این کار برای اشکال‌زدایی و برای جمع‌آوری اطلاعات شمارش دستورالعمل‌ها بدون تولید فایل‌های بزرگ بردار بلوک پایه مفید است.

--basic-counts=<no|yes> [default: yes]

در صورت فعال بودن، لاکی (Lackey) آمارها و اطلاعات زیر را پیرامون اجرای برنامه کلاینت چاپ می‌کند:
1.تعداد فراخوانی‌های انجام‌شده به تابعی که توسط گزینه --fnname مشخص شده است (پیش‌فرض main است). اگر نمادهای برنامه حذف شده باشند (stripped)، این شمارش همواره صفر خواهد بود.
2.تعداد انشعاب‌های شرطی مواجه‌شده و تعداد و نسبت انشعاب‌های طی‌شده.
3.تعداد سوپربلوک‌های واردشده و تکمیل‌شده توسط برنامه. توجه داشته باشید که به دلیل بهینه‌سازی‌های انجام‌شده توسط کامپایلر زمان اجرا (JIT)، این مقدار به هیچ وجه مقداری دقیق نیست.
4.تعداد دستورالعمل‌های مهمان (guest نظیر x86، amd64، ppc و غیره) و عبارت‌های IR اجراشده. مفهوم IR نمایش میانی شبه-RISC والگریند است که تمام ابزار دقیق‌سازی از طریق آن صورت می‌گیرد.
5.نسبت‌های میان برخی از این مقادیر شمارش‌شده.
6.کد خروج برنامه کلاینت.

--detailed-counts=<no|yes> [default: no]

در صورت فعال بودن، لاکی جدولی شامل شمارش بارگذاری‌ها (loads)، ذخیره‌سازی‌ها (stores) و عملیات واحد محاسبه و منطق (ALU) را که بر اساس انواع IR تفکیک شده‌اند چاپ می‌کند. انواع IR با نام IR خود مشخص می‌شوند ("I1" و "I8" و ... "I128" و "F32" و "F64" و "V128").

--trace-mem=<no|yes> [default: no]

در صورت فعال بودن، لاکی اندازه و آدرس تقریباً تمام دسترسی‌های حافظه ایجادشده توسط برنامه را چاپ می‌کند. برای جزئیات پیرامون قالب خروجی، نحوه کارکرد آن، و نادقیق بودن‌های موجود در ردگیری آدرس، توضیحات بالای فایل lackey/lk_main.c را ببینید. توجه داشته باشید که این گزینه مقادیر خروجی بسیار عظیمی تولید می‌کند.

--trace-superblocks=<no|yes> [default: no]

در صورت فعال بودن، لاکی آدرس هر سوپربلوک (یک تکه کد خطی با تک ورودی و چند خروجی) اجراشده توسط برنامه را چاپ می‌کند. این مورد در درجه اول برای توسعه‌دهندگان والگریند جالب توجه است. برای جزئیات در مورد قالب خروجی، توضیحات بالای فایل lackey/lk_main.c را ببینید. توجه داشته باشید که این گزینه مقادیر زیادی خروجی تولید می‌کند.

--fnname=<name> [default: main]

تابعی را که هنگام مشخص بودن --basic-counts=yes فراخوانی‌های آن شمارش می‌شوند، تغییر می‌دهد.

والگریند از بارگیری فایل‌های اطلاعات اشکال‌زدایی (debuginfo) از طریق debuginfod پشتیبانی می‌کند؛ یک کارساز HTTP برای توزیع اطلاعات اشکال‌زدایی ELF/DWARF. هنگامی که یک فایل debuginfo را نتوان به صورت محلی پیدا کرد، والگریند می‌تواند با استفاده از شناسه ساخت (build-id) فایل، از کارسازهای debuginfod برای دریافت آن فایل استعلام بگیرد.

به منظور استفاده از این قابلیت، باید debuginfod-find نصب شده باشد و متغیر محیطی $DEBUGINFOD_URLS حاوی نشانی‌های وب (URLهای) کارسازهای debuginfod باشد که با فاصله از یکدیگر جدا شده‌اند. والگریند از خروجی پرجزئیات debuginfod-find که معمولاً با $DEBUGINFOD_PROGRESS و $DEBUGINFOD_VERBOSE فعال می‌شود پشتیبانی نمی‌کند. این متغیرهای محیطی نادیده گرفته خواهند شد. این قابلیت تنها بر روی لینوکس پشتیبانی می‌شود.

برای کسب اطلاعات بیشتر پیرامون debuginfod، بخش Elfutils Debuginfod[1] را ببینید.

cg_annotate(1), callgrind_annotate(1), callgrind_control(1), ms_print(1), $INSTALL/share/doc/valgrind/html/index.html یا http://www.valgrind.org/docs/manual/index.html, Debugging your program using Valgrind's gdbserver and GDB[2] vgdb[3], Valgrind monitor commands[4], The Commentary[5], Scheduling and Multi-Thread Performance[6], Cachegrind: a cache and branch-prediction profiler[7]. Execution Trees[8]

برای مشاهده فهرست جامع نویسندگان، فایل AUTHORS را در توزیع والگریند ببینید.

این صفحه راهنما توسط Andres Roldan <aroldan@debian.org> و توسعه‌دهندگان والگریند نوشته شده است.

1.
Elfutils Debuginfod
2.
Debugging your program using Valgrind's gdbserver and GDB
3.
vgdb
4.
Valgrind monitor commands
5.
The Commentary
6.
Scheduling and Multi-Thread Performance
7.
Cachegrind: a cache and branch-prediction profiler
8.
Execution Trees
08/11/2026 Release 3.25.1