نقطه توقف

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

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

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

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

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

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

پیاده‌سازی

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

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

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

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

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

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

برخی از پیاده‌سازی‌های زبان‌های برنامه‌نویسی توابع اشکال زدایی خود را در معرض نمایش برنامه‌های دیگر قرار می‌دهند. به عنوان مثال، برخی از نسخه‌های FORTRAN دارای عبارت AT هستند، که در ابتدا قرار بود به عنوان یک نقطه توقف دستور عمل کند. پایتون یک اشکالزدارا پیاده‌سازی می‌کند که از یک برنامه پایتون می‌توان به آن دسترسی پیدا کرد. این امکانات می‌توانند شبیه یک عبارت COMEFROM عمل کرده و مورد سوءاستفاده قرار بگیرند.

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

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

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

نقاط توقف تعاملی ظهور کنسول‌های تله پرینتر در دهه ۱۹۶۰ میلادی امکان تعاملی تر شدن قابلیت اشکال زدایی خط فرمان را فراهم کرد، و در اوایل 1970s با ورود فراگیر دستگاه‌های نمایش متصل به بزرگ رایانه‌ها، شکال زدایی کامل روی صفحه نمایش در محیط‌های چند وظیفه ای به صورت کاملاً تعاملی، به واقعیت تبدیل شد. این اتفاق همچنین اجازه اجرای گام به گام یک برنامه را می‌دهد به طوری که مانند یک پویایی برنامه عمل می‌کند و در حالی که ثبات‌های دلخواه و جابه جایی‌های حافظه همزمان نشان داده شده‌اند. در ابتدا این نوع انیمیشن در سطح کد ماشین دیس اسمبلر یا دی کامپایل شده بود، اما بعداً تا پویایی در سطح منبع HLL پیشرفت کرد.

منابع 

اشکال‌زدایی
صفحات با ترجمه بازبینی‌نشده