لینک کوتاه مطلب : https://hsgar.com/?p=6463

بیست سال والگریند | نیکلاس نترکوت

بیست سال از انتشار Valgrind 1.0 می گذرد.

وب سایت Valgrind می گوید:

Valgrind یک چارچوب ابزار دقیق برای ساخت ابزارهای تحلیل پویا است. ابزارهای Valgrind وجود دارد که می تواند به طور خودکار بسیاری از باگ های مدیریت حافظه و رشته را شناسایی کند و برنامه های شما را با جزئیات نمایه کند. همچنین می توانید از Valgrind برای ساخت ابزارهای جدید استفاده کنید.

من برای اولین بار جولیان سیوارد را در اواخر سال 2001 ملاقات کردم. من از استرالیا به کمبریج در انگلستان نقل مکان کرده بودم تا دکترای خود را با موضوع “بهینه سازی حافظه پنهان برای زبان های کاربردی” دنبال کنم. آزمایشگاه کامپیوتر کمبریج به معنای واقعی کلمه در مجاورت یک دفتر تحقیقاتی مایکروسافت است و من به زودی با افرادی که در آنجا روی کامپایلر هسکل گلاسکو کار می کردند تعامل داشتم. جولیان یکی از آنها بود.

مدت کوتاهی پس از آن، کار جولیان روی GHC به پایان رسید. در آخرین روز زندگی، او برای خداحافظی از دفتر من در آزمایشگاه کامپیوتر آمد. از او پرسیدم که اکنون چه کار می‌کند، و او گفت که قرار است مدتی را صرف پروژه‌ای به نام Valgrind کند. “والگریند چیست؟” من پرسیدم. این یکی از آن لحظاتی بود که زندگی شما را تغییر خواهد داد.

در اواسط دهه 90 جولیان نوشت ابزار فشرده سازی bzip2. مدتی را صرف کرده بود
در حال بررسی رفتار کش آن به منظور سریعتر کردن آن. در حین انجام این کار، او یک ابزار نمایه کش به نام cacheprof ایجاد کرد. کد اسمبلی را به منظور افزودن کد ابزار دقیق تجزیه و تحلیل می‌کرد، حاشیه‌نویسی خط به خطی از عدم وجود حافظه پنهان در کد منبع شما ارائه می‌کرد، و برای ساده کردن استفاده از آن، یک بسته‌بندی در اطراف gcc ارائه می‌شد. (بخش 7 اسناد cacheprof جزئیات بیشتری در مورد منشا آن دارد.)

جولیان نیز از طرفداران آن بود خالص – تصفیه، یک ابزار تجاری است که خطاهای حافظه برنامه ها را در زمان اجرا تشخیص می دهد و روی Solaris اجرا می شود. او امیدوار بود که کسی یک نسخه متن باز برای x86/Linux بسازد، اما در نهایت تصمیم گرفت خودش این کار را انجام دهد. او تجربه‌ای با یک مفسر باینری x86 به نام Heimdall داشت، اما می‌دانست که تفسیر باینری بسیار کند است و عملی نیست. شاید تدوین JIT بتواند کمک کند؟

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

همه اینها یک دستاورد چشمگیر بود، زیرا والگریند برای کار کردن باید کارهای زیرکانه و/یا زشت زیادی انجام دهد. باید هر دستوری را که توسط یک برنامه مشتری اجرا می شود بدون از دست دادن کنترل، حتی در مواجهه با syscalls، سیگنال ها و longjmp رهگیری کند. و علاوه بر آن باید مقادیر زیادی ابزار دقیق برای حفظ ابرداده در مورد هر بیت داده ای که برنامه مشتری دستکاری می کند، اضافه کند.

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

من خودم از cacheprof استفاده می کردم، اما رویکرد حاشیه نویسی اسمبلی آن شکننده بود و هیچ پوششی برای کتابخانه های سیستم فراهم نمی کرد. مدت زیادی پس از یادگیری در مورد Valgrind متوجه شدم که ابزار دقیق دودویی پویا آن می تواند پایه قوی تری برای یک ابزار پروفایل کش فراهم کند. من Cachegrind را نوشتم و در آوریل 2002 در مخزن قرار گرفت.

در جولای 2002، Valgrind 1.0 منتشر شد. را
پست SlashDot گفت:

Valgrind رویای یک برنامه نویس C/C++ است که به حقیقت پیوسته است: بررسی تخصیص حافظه بدون زحمت، دسترسی اولیه به حافظه، نشت و غیره. Purify برای لینوکس رسیده است، فقط بهتر است: برخلاف برادر تجاری (غیر لینوکسی) آن، بررسی مستقیماً روی فایل اجرایی انجام می شود. ، نیازی به پیوند مجدد نیست.

در این مرحله والگریند دو کار انجام داد. به طور پیش فرض به دنبال خطاهای حافظه می گردد، اما می توانید Cachegrind را با آن فراخوانی کنید --cachesim گزینه. ادغام بین دو حالت سخت بود، اما هر دو مفید بودند.

سپس متوجه شدم که یک شکاف بالقوه تمیز بین کد ابزار دقیق عمومی و کد مخصوص ابزار وجود دارد. چند ماه بعد من این تقسیم را انجام دادم که دنیای جدیدی از احتمالات را باز کرد. Memcheck متولد شد: نام ابزاری شد که بررسی اصلی حافظه را انجام داد و Valgrind نام کل سیستم شد. (با این اوصاف، حتی امروز “والگریند” و “مم چک” اساساً مترادف هستند.) و Cachegrind دیگر به عنوان یک قطعه اضافی ناخوشایند پیچ ​​و تاب نداشت.

ما این را «شکاف هسته/پوست» نامیدیم. این نام‌ها انتخاب من بودند، با الهام از «پوسته‌های» رابط کاربری سفارشی که در آن زمان می‌توانستید روی نرم‌افزار پخش‌کننده‌های MP3 قرار دهید. مدتی بعد متوجه شدیم که “پوست” نامی گنگ و گیج کننده است و به “ابزار” روی آوردیم. نام “core” گیر کرده است، اگرچه نام دایرکتوری حاوی کد اصلی را تغییر دادیم core به coregrind پس از اطلاع از اینکه برخی از سیستم‌های لینوکس به گونه‌ای پیکربندی شده‌اند که به‌طور دوره‌ای هر فایلی را که نامش را حذف می‌کنند
core، با این فرض که چنین فایل هایی هسته ای هستند!

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

ابزارهای بیشتری دنبال شد.

  • جولیان یک آشکارساز مسابقه داده به نام هلگریند نوشت.
  • یوزف وایدندورفر نسخه‌ای از Cachegrind به نام Callgrind نوشت.
  • در سال 2003، من Massif را نوشتم، یک پروفایلگر هیپ.
  • در سال 2007 بارت ون آسشه DRD را نوشت که نوع متفاوتی از آشکارساز مسابقه است.
  • جولیان در سال 2010 نوشت
    DHAT، یک پروفیل هیپ متفاوت. می‌توانست کارهای باورنکردنی انجام دهد، اما خروجی مبتنی بر متن بد بود. در سال 2019 من
    تعمیر اساسی شده است
    آن را به یک رابط کاربری بسیار زیباتر.
  • ابزارهای مختلف کمتر شناخته شده دیگری نیز نوشته شده است که برخی از آنها به عنوان پایه و اساس مورد استفاده قرار گرفتند مقالات تحقیقاتی.

پس از تقسیم هسته/ابزار، موضوع دکترای خود را از برنامه نویسی کاربردی تغییر دادم. من پایان نامه خود را با عنوان تجزیه و تحلیل باینری پویا و ابزار دقیق، در اواخر سال 2004 به پایان رساندم. خواندن آن را امروز توصیه نمی کنم، به جز شاید فصل 3 که توصیف مناسبی از نحوه کار Cachegrind است. با این حال، برای من کافی بود که فارغ التحصیل شوم و برای همیشه به مردم بگویم که به معنای واقعی کلمه، “من دکترای والگریند دارم”. (این یک دکترای سه ساله بریتانیا بود، به جای یک دکترای بی رحمانه شش ساله یا بیشتر در ایالات متحده.

در سال 2005 مقاله ای در USENIX با عنوان استفاده از Valgrind برای تشخیص خطاهای مقدار تعریف نشده با دقت بیت منتشر کردیم. ما فقط دو روز قبل از پایان مهلت مقاله از کنفرانس مطلع شدیم، زمانی که یک سازمان دهنده کارگاه آموزشی FREENIX پیشنهاد داد که یک چکیده مقاله در مورد Valgrind را به FREENIX ارسال کنیم. ما پیشنهاد ارسال مقاله به USENIX را به جای آن دادیم و به ما گفته شد که “امکان ندارد مقاله USENIX در دو روز انجام شود”. چهل و هشت ساعت بعد ما این کار را کردیم و قبول شد، هورا!

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

در سال 2007 دو مقاله منتشر کردیم. اولین مقاله در PLDI با عنوان Valgrind: A Framework for Heavyweight Dynamic Binary Instrumentation بود. این یکی خیلی بیشتر از دو روز طول کشید. این هنوز هم بهترین نمای کلی از داخلی Valgrind و بیشترین استناد در مورد Valgrind است. ده سال بعد، برنده شد تاثیرگذارترین مقاله سلاح جایزه من مطمئناً انتظار چنین چیزی را نداشتم

جایزه

مقاله دوم در VEE با عنوان چگونه هر بایت حافظه ای که توسط یک برنامه استفاده می شود را سایه انداخت. نمای کلی خوبی از نحوه ردیابی وضعیت اضافی هر مقدار در حافظه توسط Memcheck ارائه می دهد.

جوایز دیگری نیز وجود داشت.

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

دیدن اینکه Valgrind هنوز هم امروزه مورد استفاده گسترده است، هم لذت بخش و هم سورئال است. هدف اولیه جولیان این بود که وقتی نوبت به صحت برنامه‌های C و C++ می‌رسد، میله را بالا ببرد. این به وضوح یک موفقیت بزرگ بوده است. Memcheck اشکالات بی‌شماری را در برنامه‌های بی‌شماری پیدا کرده است و بخش استانداردی از تنظیمات تست برای بسیاری از آنها است.

هرچند مدتی طول کشید تا نفوذ کرد. در سال 2005 من یک پست دکترا را انجام دادم که در آن روی پروژه ای کار کردم که شامل طراحی سخت افزار جدید بود. چندین برنامه C وجود داشت که سخت افزار طراحی شده را شبیه سازی می کرد. دانش‌آموزان برنامه‌ها را یک شبه اجرا می‌کردند تا مقدار کمی از زمان ماشین را شبیه‌سازی کنند. گاهی اوقات وقتی صبح برمی‌گشتند، شبیه‌سازی‌ها خراب می‌شد، که اتلاف وقت بزرگی بود. من به آنها پیشنهاد کردم Memcheck را امتحان کنند، که چند مشکل پیدا کرد که آنها رفع کردند و برنامه ها از کار افتادند. اما پاسخ این نبود که “مشکل را برطرف کند!” به اندازه یک “خو، به نظر می رسد که این مشکل برطرف شده است”.

خوشبختانه، با گذشت زمان، ارزش Memcheck عمیق تر شده است. من تقریباً مطمئن هستم که ASan مستقیماً از Memcheck الهام گرفته شده است. ASan از ابزار دقیق استاتیک استفاده می کند، به این معنی که سریعتر از Memcheck است اما پوشش ناقصی دارد، به عنوان مثال برای کدهای تولید شده در زمان اجرا و کتابخانه های سیستم. به همین دلیل همان کاری را انجام می دهد که Memcheck انجام می دهد به جز بررسی تعریف شده، زیرا آن بخش برای کارکرد قابل اعتماد به 100٪ پوشش ابزار دقیق نیاز دارد.

وقتی صحبت از کیفیت نرم‌افزار شد، فکر می‌کنم مناسب است که اکنون تمام وقت روی Rust کار کنم، زبان برنامه‌نویسی سیستمی که در زمان ایجاد Valgrind وجود نداشت، اما اساساً از تمام مشکلاتی که Memcheck تشخیص می‌دهد جلوگیری می‌کند. در نتیجه، من استفاده زیادی از Memcheck ندارم، اما همچنان از Cachegrind، Callgrind و DHAT همیشه استفاده می کنم. من از اینکه امروز هنوز از Cachegrind استفاده می کنم شگفت زده هستم، با توجه به اینکه در بیست سال اخیر تقریباً تغییر نکرده است. (البته من فقط از آن برای شمارش دستورالعمل استفاده می کنم. به هیچ وجه به نتایج icache/dcache اعتماد ندارم، زیرا آنها از شبیه سازی بهترین حدس از AMD Athlon در حدود سال 2002 می آیند.) و DHAT منبع شادی مداوم است: من هرگز از هیچ پروفایل دیگری به خوبی برای گفتن دقیق آنچه می خواهم بدانم استفاده نکرده ام.

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

برای پایان، اولین مدخل در Valgrind را نقل می کنم
سوالات متداولکه خیلی وقت پیش نوشتم:

1.1. چگونه “Valgrind” را تلفظ می کنید؟

“Val” مانند کلمه “ارزش”. “سایر” با یک “i” کوتاه تلفظ می شود – یعنی. «خندان» (با «قلع‌شده» قافیه می‌شود) نه «خندان» (قافیه با «پیدا کردن»).

احساس بدی نداشته باشید: تقریباً همه در ابتدا اشتباه می کنند.

تولدت مبارک، والگریند!

لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.