تنظیم و مانیتور کردن breakpoints
بررسی ترمینال های ورودی و خروجی I/O
- این آموزش ادامه سیکل توسعه یافته ای است که از قبل در آموزش قبلی شروع شده بود و به بررسی مشخصات پایه C-SPY می پردازد.
- توجه داشته باشید که ، با توجه به بسته نرم افزاری IAR که در سیستم خود نصب کرده اید ، ممکن است شامل C-SPY باشد و یا نباشد ، در این آموزش فرض بر این گرفته شده است که شما از شبیه ساز C-SPY استفاده می کنید.
برنامه project1.out ، که در آموزش قبلی ایجاد شده است ، حالا آماده است تا در C-SPY اجرا شود جایی که شما می توانید متغییرها را نگاه کنید ، breakpoints را تنظیم کنید ، کد ها را در مد disassembly بررسی کنید ، مانیتورینگ ثبات ها و حافظه ، و پرینت خروجی برنامه در ترمینال پنجره I/O.
قبل از شروع برنامه ، شما باید چند گزینه را تنظیم کنید.
- انتخاب project>Options و سپس پوشه Debugger. در صفحه setup ، مطمئن شوید که شما simulator را از لیست کشویی Driver و همین طور گزینه Run to main را انتخاب کرده اید. بر روی Ok کلیک کنید.
- انتخاب Project>Download and Debug. روش دیگر، کلیک بر روی دکمه
که Download and Debug در نوار منو است. C-SPY با برنامه project1.out که بارگذاری شده است شروع به کار می کند. علاوه بر پنچره هایی که از قبل در IDE باز بوده است ، مجموعه ای از پنجره های مشخصه C-SPY حالا در دسترس هستند.
در IDE ، شما می توانید پنجره ها را در مکان های خاص قرار دهید که در اصطلاح به آن dock windows گویند و همین طور در زبانه های گروهی آن ها را جایگذاری و یا سازماندهی کنید. شما همچنین می توانید یک پنجره شناور ایجاد کنید به این معنی که آن همیشه در بالاترین قسمت دسترسی نسبت به دیگر پنچره ها قرار می گیرد. اگر شما سایز و یا مکان پنجره شناور را تغییر دهید ، دیگر پنجره های باز در حال حاضر هیچ اثری بر روی پنجره شناور نخواهد گذاشت.
در نوار وضعیت ، که در زیر پنجره اصلی نوشته IAR Embedded Workbench IDE قرار گرفته است ، شامل کمک های مفیدی درباره ی چگونگی ترتیب پنجره ها است . (که شما می توانید با توجه به قرار گیری آن ها اطلاعات مفیدی را کسب کنید) برای اطلاعات بیشتر ، IDE Project Management and Building Guide for ARM را ببینید.
مطمئن شوید پنجره های زیر و محتویات پنجره باز باشد و در صفحه نمایش قابل مشاهده باشد: پنجره workspace با پیکربندی های ساخته شده در آموزش پروژه قبلی project1 به صورت فعال ، پنجره ادیتور (ویرایش گر) با سورس فایل های Tutor.c و utilities.c و همین طور پنجره Debug log.
- برای بازرسی کد دستورات ، بر روی فایل Tutor.c در پنجره Workspace دابل(دوبار پشت سر هم) کلیک کنید.
- با فایل نمایش داده شده Tutor.c در پنجره ادیتور ، اولین گام حرکت با فرمان Debug>Step over
روش دیگر ، بر روی دکمه روی نوار ابزار که همان Step Over است کلیک کنید.
گام حرکت را تا تابع InitFib تکرار کنید همانند تصویر زیر.
- انتخاب Debug>Step Into باعث می شود که گام بعدی داخل تابع InitFib شود.
روش دیگر، بر روی دکمه روی نوار ابزار که همان Step Into است کلیک کنید.
در سطح کد، فرمان های Step Over و Step Into به شما اجازه می دهد که برنامه تان را اجرا کنید به صورت یک دستور در یک زمان . Step Into گام های حرکت را در داخل تابع و یا به صورت فراخوانی زیر روال انجام می دهد، در حالی که Step Over توابع را به صورت یک گام یک مرحله ای اجرا می کند یعنی داخل تابع را نشان نمی دهد. برای دیدن جزئیات بیشتر می توانید C-SPY Debugging Guide for ARM را مطالعه کنید.
وقتی که Step Into را اجرا کردید ، توجه داشته باشید که پنجره فعال در حال دید شما تغییر خواهد کرد به Utilities.c بخاطر آن که تابع InitFib در این فایل قرار گرفته است.
- از فرمان Step Into استفاده کنید تا جایی که به حلقه for برسید.
- از Step Over استفاده کنید تا جایی که به فایل هدر حلقه for برگردید .(منظور به همان فایل قبلی که در آن بودید برگردید.) توجه کنید که گام های حرکت که تا به این جا بررسی شد به صورت سطحی بر روی توابع عمل می کنند نه بر روی کل دستورات.
شما همچنین می توانید گام های حرکت را بر روی کل دستورات انجام دهید. با انتخاب Debug> Next statement دستورات به صورت کلی در یک زمان اجرا می شود. روش دیگر ، بر روی دکمه روی نوار ابزار که همان Next statement است کلیک کنید.
توجه داشته باشید که این فرمان چه تفاوت هایی با فرمان Step Over و Step Into دارد.
C-SPY اجازه می دهد به شما تا متغیرها و عبارات را در داخل سورس کدها تماشا کنید ، بنابراین شما می توانید متغیرهای برنامه تان را که در حال اجرا هستند به صورت مداوم پیگیری کنید. شما می توانید متغییر ها را به چندین روش نگاه کنید. برای مثال ، در آن نقطه از پنجره سورس (کدها) با اشاره گر موس (اشاره گر موس خود را بر روی متغییر نگه دارید تا مقدار آن نمایش داده شود) ، یا باز کردن یکی از پنجره های Auto و locals و Live Watch و Statics و یا Watch windows. در این آموزش ، ما به بعضی از این روش ها و یا به عبارتی دیگر متدها نگاه خواهیم کرد. برای اطلاعات بیشتر درباره ی بازرسی متغیرها راهنمای C_SPY Debugging برای ARM را ببینید.
توجه : وقتی سطح بهینه سازی None استفاده شود ، تمام متغیر های غیر استاتیک (فعال) در کل محدوده خود بصورت زنده خواهند بود و در نتیجه ، متغیرها به طور کامل اشکال زدایی می شوند. وقتی سطح بهینه سازی higher استفاده شود ، متغیر ها ممکن است به طور کامل اشکال زدایی نشود.
استفاده از پنجره Auto
- با انتخاب View>Auto پنجره Auto باز می شود.
پنجره Auto مقدار(value) فعلی عبارت های (expression) تغییر یافته را نشان خواهد داد.
- گام ها را ادامه دهید تا چگونگی تغییرات مقادیر (value) را ببینید.
تنظیم watchpoint
و بعد شما برای بازرسی متغیرها از پنجره Watch استفاده خواهید کرد.
- با انتخاب View>Watch پنجره Watch باز می شود. توجه داشته باشید که آن به صورت پیش فرض با پنجره Auto که از قبل باز است به صورت گروهی در یک زبانه دیگر قرار می گیرد.
- تنظیم Watchpoint در متغیر i که در این برنامه استفاده شده است: بر روی مربع نقطه چین که به صورت سایه دار در این پنجره مشخص شده است کلیک کنید . در فیلد ورودی که ظاهر می شود ، حرف i را تایپ کنید و سپس بر روی Enter کلیک کنید.
شما همچنین می توانید متغییر مورد نظر خود را از پنچره ادیتور به پنجره Watch بکشید.
- آرایه Fib را از تابع InitFib انتخاب کنید ، سپس آن را به سمت پنجره Watch بکشید.
در پنجره Watch مقادیر فعلی i و Fib نشان داده خواهد شد. شما می توانید با باز کردن آرایه Fib جزئیات بیشتری از آن را ببینید.
- با اجرای تعداد بیشتری از گام ها می بینید که چطور مقادیر i و Fib تغییر می کنند.
- متغیر ها را از پنجره Watch پاک کنید ، با انتخاب آن ها و فشردن Delete.
تنظیم و مانیتور کردن breakpoints
C-SPY شامل یک سیستم breakpoint قدرتمند با ویژگی های بسیار است. برای جزئیات اطلاعات بیشتر درباره ی breakpoints ، می توانید C-SPY Debugging Guide for ARM را ببینید.
راحت ترین راه معمولا تنظیم breakpoint به صورت محاوره ای است ، به سادگی با درج نقطه در موقعیت و یا در نزدیکی یک دستور و سپس با انتخاب فرمان Toggle Breakpoint .
- در این روش با استفاده از breakpoint که بر روی تابع فراخوانی شده GetFib تنظیم شده است: اول ، بر روی زبانه Utilities.c که در پنجره ادیتور است کلیک کنید و سپس بر روی دستوری که در موقعیت قرار دارد کلیک کنید تا نقط درج اعمال شود. سپس Edit>Toggle Breakpoint را انتخاب کنید.
روشی دیگر ، با کلیک کردن بر روی دکمه در نوار ابزار که همان Toggle Breakpoint است.
یک breakpoint در این تابع فراخوان ایجاد خواهد شد. تابع فراخوان هایلایت خواهد شد و در آنجا یک نقطه قرمز در حاشیه خواهد بود تا نشان دهد که در آنجا یک breakpoint وجود دارد.
برای مشاهده تمام breakpoint های تعریف شده ، با انتخاب View>Breakpoints پنجره breakpoints باز می شود که تمام نقاط انتخابی در این پنجره قابل مشاهده است. شما می توانید اطلاعاتی درباره ی اجرا breakpoint را در پنجره Debug Log پیدا کنید.
اجرا تا نقطه breakpoint
- برای اجرا برنامه تان تا رسیدن به نقطه breakpoint ، با انتخاب Debug>Go.
روشی دیگر ، با کلیک کردن بر روی دکمه در نوار ابزار که همان Go است.
برنامه تا breakpoint که شما ایجاد کرده اید اجرا خواهد شد. پنجره Watch مقدار عبارت Fib را نشان خواهد داد و پنجره Debug Log شامل اطلاعاتی درباره Breakpoint خواهد بود.
- انتخاب breakpoint ، راست کلیک و انتخاب Toggle Breakpoint (code از محتویات منو ظاهر شده ، و یا انتخاب Toggle Breakpoint از منوی Edit باعث پاک شدن breakpoint می شود.
اشکال زدایی در مد disassembly
اشکال زدایی با C-SPY معمولا سریعتر و سرراست تر است در مد سورس کدهای C++/C . به هر حال ، اگر شما بخواهید کنترل بیشتری بر روال سطح پایین تر داشته باشید ، شما می توانید در مد disassembly که هر گام مربوط می شود به یک ساختار اسمبلی اشکال زدایی کنید. C-SPY اجازه می دهد به شما تا به آسانی بین هر دو مد سوئیچ کنید.
- اول برنامه تان را با کلیک کردن بر روی دکمه
در نوار ابزار ریست کنید.
- با انتخاب View>Disassembly پنجره Disassembly باز می شود، اگر آن از قبل باز نبوده باشد. شما کد های اسمبلی مربوط به دستورات c در حال اجرا را خواهید دید.
برای دیدن اطلاعات کد coverage ، در پنجره Disaddembly راست کلیک کنید و Code Coverage>Enable و سپس Code Coverage>Show را از محتویات منوی ظاهر شده انتخاب کنید.
فرمان گام های حرکت را در پنجره ی Disassembly انجام دهید و توجه داشته باشید که اطلاعات کد coverage به وسیله ستاره سبز نشان داده می شود.
پنجره Memory به شما اجازه می دهد که ناحیه های از حافظه را که انتخاب کردید مانیتورینگ کنید. در مثال زیر ، حافظه مربوط به آرایه Fib مانیتور خواهد شد.
- با انتخاب view>Memory پنجره Memory باز می شود.
- پنجره Utilities.c را فعال و Fib را انتخاب کنید. سپس آن را از پنجره کد C به پنجره Memory بکشید.
محتویات پنجره در پنجره Memory مربوط است به همان Fib که انتخاب کرده اید.
- برای نمایش محتویات حافظه به صورت 16 بیتی ، با انتخاب فرمان x2 Units از منو کشویی به شکل پیکان که بر روی نوارابزار پنچره حافظه قرار دارد می توان استفاده کرد.
اگر کل واحد حافظه در تابع InitFib در برنامه C هنوز مقدار دهی اولیه نشده است ، گام های حرکت را ادامه دهید و توجه داشته باشید که چگونه محتویات حافظه به روز رسانی می شود.
برای تغییر محتویات حافظه، مقادیر جدید را در پنجره حافظه ویرایش کنید. کافی است با استفاده از اشاره گر موس بر روی محتویات حافظه که شما می خواهید ویرایش کنید کلیک کنید و سپس مقدار مورد نظر خود را تایپ کنید.
پنجره حافظه را ببندید.
بررسی ترمینال های ورودی و خروجی I/O
بعضی وقت ها ممکن است که شما مجبور باشید ساختمان برنامه تان را اشکال زدایی کنید در حالی که از stdin و stdout استفاده کرده اید بدون امکان داشتن سخت افزار مورد نظر خود. C-SPY به شما اجازه می دهد تا stdin و stdout را شبیه سازی کنید به طریق استفاده از پنجره ترمینال I/O .
توجه : پنجره ترمینال I/O فقط در C-SPY قابل دسترس است .
- با انتخاب View>Terminal I/O خروجی از عملیات I/O به نمایش در می آید.
محتویات داخل پنجره بستگی به این دارد که تا چه حد شما برنامه را اجرا کرده باشید. ولی فقط با یک بار اجرا محتویات آن طبق پنجره نمایش داده شده بالا خواهد بود.
- برای کامل کردن برنامه تان ، با انتخاب Debug>Go .
و یا با روش دیگر ، بر روی دکمه که در نوارابزار قرار دارد که همان Go است.
از آنجایی که با breakpoint های دیگری مواجه نشوید ، C-SPY به آخر برنامه می رسد و یک پیغام Program exit reached در پنجره Debug Log چاپ می شود.
کل خروجی از برنامه حالا در پنجره ترمینال I/O نشان داده ، شده است.
اگر شما می خواهید دوباره شروع کنید با برنامه در حال حاضر خود ، با انتخاب Debug>Reset ، یا این که با کلیک بر روی دکمه در نوارابزار که همان عمل Reset را انجام می دهد.
- برای خروج از C-SPY ، با انتخاب Debug>Stop Debugging. و یا با کلیک بر روی دکمه
بر روی نوارابزار. محیط اشکال زدایی بسته می شود.
C-SPY همچنین دیگر امکانات اشکال زدایی بیشتری فراهم کرده است . بعضی از این ها برای مثال macros و شبیه سازی وقفه ها است که در آموزش های زیر توصیف شده است.
برای جزئیات بیشتر درباره طریقه استفاده از C-SPY ،
C-SPY Debugging Guide for ARM را ببینید.