>> داگ لوید: تمام حق GDB.
چه در آن است دقیقا؟
بنابراین GDB، که مخفف برای دیباگر گنو،
یک ابزار واقعا عالی است که ما می توانیم استفاده به ما کمک اشکال زدایی برنامه های ما،
و یا پیدا کردن که در آن همه چیز اشتباه در برنامه های ما است.
GDB شگفت آور قدرتمند است، اما خروجی و تعامل با آن
می تواند یک کمی کمی مرموز.
این معمولا یک ابزار خط فرمان، و آن را می توانید تعداد زیادی از پیام به شما بزنند.
و می توان آن نوع از سخت به تجزیه دقیقا چه خبر است.
مراحل خوشبختانه، ما گرفته شده برای حل این مشکل برای شما
به عنوان شما را از طریق CS50 کار می کنند.
اگر شما با استفاده از گرافیکی نیست دیباگر، که همکار من دن
Armandarse کاملا صحبت کرده است کمی در مورد در یک ویدیو که
باید در اینجا باشد در حال حاضر، شما ممکن است نیاز
برای استفاده از این خط فرمان ابزار برای کار با GDB.
اگر شما در حال کار در CS50 IDE، شما لازم نیست که برای انجام این کار.
اما اگر شما نمی کار در CS50 IDE،
شاید با استفاده از مدل از CS50 لوازم خانگی،
و یا یکی دیگر از عامل لینوکس سیستم با GDB نصب شده بر روی آن،
شما ممکن است نیاز به استفاده از این ابزار خط فرمان.
>> و از آنجایی که شما ممکن است مجبور به انجام آن، آن را
فقط به درک چگونه مفید GDB کار می کند از خط فرمان.
اما باز هم، اگر شما با استفاده از IDE CS50، شما
می توانید دیباگر گرافیکی استفاده است که به IDE ساخته شده است.
بنابراین برای دریافت همه چیز را با رفتن GDB، شروع به اشکال زدایی
روند خاص برنامه، همه نیاز شما می
است نوع GDB به دنبال با نام برنامه.
بنابراین برای مثال، اگر برنامهی شما سلام، سلام شما می GDB را تایپ کنید.
>> هنگامی که شما انجام این کار، شما در حال رفتن به جلو و محیط زیست GDB.
سریع شما تغییر خواهد کرد، و به جای این که چه آن را معمولا
زمانی است که شما همه چیز را تایپ کنید در LS line-- فرمان،
cd-- همه معمولی خود را دستورات لینوکس، سریع شما
به، احتمالا، چیزی تغییر خواهد کرد مانند پرانتز GDB پرانتز.
که بی درنگ GDB جدید خود را، چرا که شما در داخل محیط GDB است.
هنگامی که در داخل که محیط زیست، این دو دستور عمده وجود دارد
که شما احتمالا خواهید استفاده به ترتیب زیر.
>> اولین B، که کوتاه برای استراحت است.
و بعد از شما B تایپ می کنید، شما به طور معمول نوع نام از یک تابع،
و یا اگر شما اتفاق می افتد به می دانم که در اطراف چه تعداد خط
برنامه خود را شروع به رفتار کمی عجیب و غریب،
شما می توانید یک خط تایپ تعداد نیز وجود دارد.
چه ب، و یا شکستن، کند است آن را اجازه می دهد تا برنامه های خود را
به اجرا تا یک نقطه خاص، یعنی، نام تابع
که شما مشخص یا خط تعداد که شما را مشخص کنید.
>> و در آن نقطه آن، اعدام یخ.
این واقعا خوب است، چرا یک بار اعدام منجمد شده است،
شما می توانید بسیار به آرامی شروع به قدم از طریق برنامه خود را.
به طور معمول، در حال اجرا اگر شما شده است برنامه های خود را، آنها بسیار کوتاه است.
معمولا، شما بریده بریده نقطه نوع هر آنچه که نام برنامه خود را، ضربه را وارد کنید،
و شما می توانید قبل چشمک زدن، خود را برنامه در حال حاضر به پایان رسید.
این واقعا زمان زیادی را امتحان کنید و کشف کردن آنچه که اشتباه است.
پس از آن واقعا قادر به کم کردن همه چیز پایین با تنظیم یک نقطه شکست با B،
و سپس در پله.
>> سپس هنگامی که شما شکستن خود را تنظیم کنید که نقطه، شما می توانید برنامه را اجرا کنید.
و اگر شما هر گونه آرگومان های خط فرمان،
شما آنها را در اینجا مشخص، نه زمانی که شما تایپ می کنید GDB نام برنامه خود را.
شما تمام خط فرمان مشخص استدلال با در نظر گرفتن R، و یا اجرا،
و پس از آن آرگومان های خط فرمان هر شما در داخل برنامه شما نیاز دارند.
تعدادی از دیگر واقعا وجود دارد دستورات مهم و مفید
در داخل محیط تولید ناخالص داخلی است.
بنابراین من اجازه فقط به سرعت به بیش از برخی از آنها.
>> به N، که کوتاه است برای آینده است، و شما می توانید نوع به جای بعدی N،
هر دو کار می کنند.
و آن را فقط به مختصر.
و همانطور که شما احتمالا در حال حاضر بدست استفاده می شود، که قادر به تایپ همه چیز
کوتاه تر است به طور کلی بهتر است.
و آنچه در آن انجام خواهد داد از آن است که شما گام به جلو یک بلوک کد است.
بنابراین آن را به جلو حرکت می تا زمانی که یک فراخوانی تابع است.
و بعد به جای غواصی به آن تابع
و رفتن را از طریق تمام که توابع کد، آن را فقط باید تابع.
>> تابع نامیده خواهد شد.
این انجام خواهد داد هر کار خود است.
آن را به یک ارزش به بازگشت تابع که آن نامیده می شود.
و سپس شما را به حرکت خط بعدی که تابع فراخوانی شده.
اگر می خواهید به مرحله در داخل از تابع،
به جای فقط داشتن آن را اجرا، به ویژه
اگر شما فکر می کنم که مشکل ممکن است در داخل آن تابع دروغ،
شما می توانید، البته، مجموعه ای از یک استراحت نقطه در داخل آن تابع.
و یا اگر شما در حال حاضر در حال اجرا، شما می توانید استفاده به گام رو به جلو یک خط کد.
>> بنابراین در این مرحله در و فرو رفتن به توابع،
به جای فقط باید اجرا و در ادامه در تابع
که شما در را برای اشکال زدایی است.
اگر شما همیشه می خواهند بدانند ارزش یک متغیر،
شما می توانید نوع P، و یا چاپ، و سپس نام متغیر.
و است که به شما نسخه قابل چاپ، در داخل محیط GDB،
نام متغیر، که you-- بهانه مقدار متغیر me--
که شما به نام ام.
اگر می خواهید به دانستن مقادیر هر متغیر محلی که در آن در دسترس از
شما در حال حاضر در خود را برنامه، شما می توانید مردم محلی اطلاعات را تایپ کنید.
آن را خیلی سریع تر از تایپ P و سپس هر چیز دیگری،
لیست همه از متغیرهای که شما می دانید وجود داشته باشد.
شما می توانید مردم محلی اطلاعات را تایپ کنید، و آن را چاپ خواهد شد همه چیز برای شما.
بعد تا BT، است که کوتاه را برای برگشت ردیابی.
در حال حاضر، به طور کلی، به خصوص در اوایل CS50،
شما نمی خواهد واقعا مناسبت داشته به استفاده از BT، و یا بازگشت ردیابی،
چون شما با داشتن توابع نیست که توابع دیگر تماس بگیرید.
>> شما ممکن است یک علامت سئوال اصلی پاسخ تابع، اما که آن را احتمالا.
شما که تابع دیگر ندارد تماس تابع دیگر، که
فراخوانی تابع دیگر، و به همین ترتیب.
اما به عنوان برنامه های خود را دریافت کنید بیشتر پیچیده، و به ویژه
زمانی که شما شروع به کار با بازگشت، ردیابی
می تواند یک راه واقعا مفید به شما اجازه نوع گرفتن برخی از زمینه را برای آن
من در برنامه های من است.
بنابراین می گویند شما کد خود را نوشته ام، و شما می دانید که اصلی یک تابع
F، که خواستار یک تابع گرم، که خواستار یک تابع ساعت.
بنابراین ما باید چند لایه تودرتو در رفتن است.
>> اگر شما در داخل هستید محیط زیست GDB خود را،
و شما می دانید در داخل خود از ساعت، اما شما فراموش
در مورد چه چیزی شما رو به جایی که شما are-- شما می توانید BT، و یا ردیابی نوع،
و آن را به خارج ساعت، G چاپ، F اصلی، در کنار برخی از اطلاعات دیگر، که
به شما می دهد یک سرنخ است که، OK اصلی به نام F، F G به نام، G به نام ساعت،
و آنجا بود که من در حال حاضر در برنامه من است.
پس از آن می تواند واقعا مفید، به خصوص به عنوان مرموز بودن از GDB
می شود کمی قریب به اتفاق، به پیدا کردن دقیقا همان جایی که همه چیز می باشد.
در نهایت، هنگامی که برنامه خود را انجام شده است، یا زمانی که شما انجام می شود اشکال زدایی آن
و شما می خواهید به مرحله دور از محیط GDB،
آن کمک می کند بدانید که چگونه به خارج شدن از آن.
شما می توانید پرسش را تایپ کنید، و یا ترک، به خارج.
در حال حاضر، قبل از پخش ویدیو امروز من یک برنامه حشره دار آماده
نام buggy1، که من وارد از یک فایل شناخته شده به عنوان buggy1.c.
همانطور که شما ممکن است انتظار، این برنامه در واقع حشره دار است.
چیزی می رود اشتباه زمانی که من سعی و اجرای آن.
در حال حاضر، متاسفانه، من سهوا حذف فایل buggy1.c من،
بنابراین به منظور برای من به شکل چه خبر اشتباه با این برنامه،
من قصد دارم به مجبور به استفاده از GDB نوع کورکورانه، تلاش
از طریق این برنامه به حرکت شکل دقیقا چه خبر اشتباه است.
اما فقط با استفاده از ابزار ما در حال حاضر در مورد به دست،
ما می توانیم شکل بسیار آن دقیقا چه می باشد.
بنابراین اجازه دهید سر را به CS50 IDE و یک نگاه.
خوب، پس ما در اینجا در حال من CS50 محیط IDE،
و من در کمی زوم بنابراین شما می توانید کمی بیشتر.
در پنجره ترمینال من، اگر لیست من محتویات مدیر فعلی من
با دستور ls، ما که من می بینم یک زن و شوهر از فایل های منبع
در اینجا، از جمله قبلا buggy1 بحث شده است.
دقیقا چه می رود در زمانی من سعی می کنم و اجرا buggy1.
خوب اجازه دهید پیدا کردن.
من از نوع بریده بریده نقطه، حشره دار، و من ضربه وارد کنید.
>> گسل تقسیم بندی.
این خوب نیست.
اگر شما به یاد، گسل تقسیم بندی معمولا
رخ می دهد هنگامی که ما دسترسی به حافظه که ما مجاز به لمس کند.
ما به نحوی رسیدهاید خارج از محدوده
از چه برنامه، کامپایلر، به ما داده است.
و بنابراین در حال حاضر که یک سرنخ به در جعبه ابزار حفظ
همانطور که ما فرآیند اشکال زدایی آغاز خواهد شد.
چیزی رفته است یک اشتباه کوچک در اینجا.
>> خوب، پس بیایید شروع تا محیط زیست GDB
ببینید و اگر ما می توانید از شکل آنچه که دقیقا مشکل است.
من قصد دارم به روشن شدن صفحه نمایش من، و من قصد دارم به نوع GDB
دوباره، برای ورود به محیط GDB، و نام برنامه
که من می خواهم برای اشکالزدایی، buggy1.
ما یک پیام کوچک، خواندن علامت از buggy1، انجام می شود.
همه این بدان معناست که آن را کشیده است با هم همه از کد،
و در حال حاضر آن بوده است به لود GDB، و آن را آماده رفتن است.
>> در حال حاضر، چه من می خواهم کاری انجام دهید؟
آیا شما به یاد چه گام اول به طور معمول است
پس من در داخل این محیط هستم؟
امیدوارم، به شما در تنظیم گفت: نقطه شکست، به دلیل
در واقعیت این است که آنچه که من می خواهم به انجام.
در حال حاضر، من ندارد کد منبع برای این
در مقابل من، که احتمالا نه معمولی مورد استفاده، به هر حال.
شما احتمالا.
به طوری که خوب.
اما فرض کنید شما نمی، چه یک تابع است که شما می دانید
در هر برنامه واحد C وجود دارد؟
مهم نیست که چقدر بزرگ یا چگونه پیچیده آن است، این تابع قطعا وجود دارد.
اصلی، درست است؟
>> بنابراین عدم از همه چیز، ما می توانیم مجموعه ای از یک نقطه شکست در اصلی.
و دوباره، من فقط می تواند نوع شکستن اصلی، به جای ب.
و اگر شما کنجکاو هستید، اگر شما تا به حال تایپ کردن یک فرمان طولانی
و پس از آن متوجه است که شما تایپ چیزی اشتباه،
و شما می خواهید برای خلاص شدن از همه به عنوان من فقط،
شما می توانید کنترل U را، که حذف همه چیز و شما را
به ابتدای خط مکان نما.
خیلی سریع تر از فقط پایین نگه داشتن حذف، یا هدف قرار دادن آن را به یک بار دسته
بالغ بر.
>> بنابراین ما یک نقطه شکست در اصلی تنظیم شده است.
و به عنوان شما می توانید ببینید، آن را می گوید ما باید مجموعه ای از یک نقطه شکست در فایل buggy1.c،
و ظاهرا در خط اول کد اصلی خط هفت است.
باز هم، ما لازم نیست فایل منبع در اینجا،
اما من فرض کنیم که آن را به من گفتن حقیقت است.
و پس از آن، من فقط در تلاش و اجرای برنامه، R.
شروع برنامه است.
خوب، پس این ارسال است کمی مرموز.
اما اساسا چه اتفاق می افتد در اینجا این است آن را فقط
به من گفتن من شکستن من ضربه نقطه، شماره 1 نقطه شکست.
>> و سپس، که خط از کد، بدون چنین فایل یا دایرکتوری.
تنها دلیلی که من شاهد است که پیام
است، زیرا من سهوا فایل buggy.c من حذف شده است.
اگر فایل buggy1.c من وجود داشتند در دایرکتوری جاری،
که حق خط در واقع وجود دارد به من بگویید چه خط از کد
به معنای واقعی کلمه می خواند.
متاسفانه من آن حذف شده است.
ما در حال رفتن به به نوع حرکت از این موضوع کمی کورکورانه است.
>> خوب، پس بیایید ببینید، چه من می خواهم در اینجا به انجام؟
خوب، من می خواهم به دانستن آنچه محلی متغیرهای شاید در دسترس من است.
من برنامه آغاز شده ام.
بیایید ببینید که چه ممکن است در حال حاضر برای ما مقداردهی اولیه.
من اطلاعات مردم محلی، هیچ مردم محلی را تایپ کنید.
همه حق است، به طوری که نمی کند من یک تن از اطلاعات می دهد.
من می توانم سعی و چاپ کردن یک متغیر، اما من هیچ نام متغیر نمی دانم.
من می توانم یک ردیابی را امتحان کنید، اما من داخل اصلی هستم،
بنابراین من می دانم که من را ساخته اند نه یکی دیگر از فراخوانی تابع در حال حاضر.
>> بنابراین به نظر می رسد تنها گزینه من به استفاده از N و یا پس و شروع به شیرجه رفتن در.
من قصد دارم به استفاده از n.
بنابراین من نوع N.
اوه خدای من، آنچه در جریان است در اینجا.
برنامه سیگنال های دریافتی، SIGSEGV گسل تقسیم بندی،
و سپس یک دسته از مسائل.
من در حال حاضر غرق هستم.
خب، در واقع وجود دارد زیادی به اینجا به دست می شود.
پس چه چیزی این به ما بگویید؟
چه آن را به ما می گوید است، این برنامه به، اما در عین حال، گسل SEG.
و به ویژه، من قصد دارم به زوم در و حتی بیشتر در اینجا،
آن را در مورد به گسل SEG مورد چیزی به نام strcmp.
>> در حال حاضر، ما ممکن است مورد بحث قرار نمی این تابع گسترده.
اما is-- چرا که ما در حال رفتن به بحث در مورد هر تابع که
در استاندارد C وجود دارد library-- اما همه آنها به شما در دسترس است،
به خصوص اگر شما یک در reference.cs50.net است.
و strcmp است واقعا قدرتمند تابع در داخل وجود دارد که
از هدر string.h فایل است که یک ضربه
فایل است که به توابع اختصاص داده شده که کار با رشته و دستکاری.
>> و به طور خاص، چه می کند این است strcmp ارزشهای دو رشته مقایسه می کند.
بنابراین من در مورد به تقسیم بندی گسل هستم در یک تماس به strcmp به نظر می رسد.
من ضربه N، و در واقع این پیام دریافت می کنم، برنامه خاتمه با SIGSEGV سیگنال
گسل تقسیم بندی. بنابراین در حال حاضر من در واقع SEG انتقاد،
و برنامه های من است بسیار بسیار موثر تا داده شده است.
این پایان برنامه است.
این خراب شد، آن سقوط کرد.
پس از آن بود که بسیاری نه، اما من در واقع یادگیری بسیار کمی
از این تجربه است.
آنچه که من آموخته اند؟
خب، من سقوط برنامه بسیار بلافاصله.
برنامه من قفل بر روی یک تماس به strcmp، اما من
هیچ متغیرهای محلی در من نیست برنامه در آن زمان که آن را قفل.
پس چه رشته، یا رشته ها، می تواند من احتمالا مقایسه می شود.
اگر من هر گونه محلی ندارد متغیرها، شما ممکن است
حدس زد که من have-- وجود دارد شاید یک متغیر جهانی، که می تواند درست باشد.
>> اما به طور کلی، به نظر می رسد مثل من مقایسه
به چیزی که وجود ندارد.
بنابراین اجازه دهید بررسی که کمی بیشتر است.
بنابراین من قصد دارم برای روشن شدن صفحه من.
من قصد دارم به ترک خارج از محیط زیست GDB برای یک ثانیه.
و من فکر، OK، بنابراین وجود دارد هیچ متغیرهای محلی در برنامه من است.
من تعجب می کنم شاید اگر من قرار است به تصویب در یک رشته به عنوان یک آرگومان خط فرمان.
بنابراین اجازه دهید فقط این آزمون است.
من قبل از این انجام نشده است.
>> بیایید ببینیم که اگر شاید اگر من این برنامه را اجرا با یک آرگومان خط فرمان کار می کند.
متعجب، هیچ گسل تقسیم بندی وجود دارد.
این فقط به من گفت که من آن را نمیفهمد.
شاید که ثابت در اینجا است.
و در واقع، اگر برگردم و نگاه کد منبع واقعی برای buggy1.c،
به نظر می رسد به عنوان اینکه آنچه من انجام است من ساخت یک تماس به strcmp بدون
چک کردن اینکه آیا در واقع ی argv [1] وجود دارد.
این است که در واقع کد منبع برای buggy1.c.
کاری که من واقعا نیاز به در اینجا به رفع برنامه من،
فرض من فایل در مقابل من است،
به فقط اضافه کردن یک چک کنید تا مطمئن مطمئن شوید که تعداد آنها برابر با 2 است.
بنابراین این مثال، دوباره، مثل من گفت، کمی ساختگی، درست است؟
شما در حال به طور کلی به رفتن کد منبع خود را به طور تصادفی حذف
و پس از آن باید سعی کنید و اشکال زدایی برنامه است.
اما امیدوارم، آن را به شما یک تصویر
از انواع چیزهایی که شما می توانید از فکر کردن در مورد
عنوان شما در حال اشکال زدایی برنامه خود را.
>> امور در اینجا چیست؟
من چه متغیرهای انجام به من در دسترس است؟
که در آن دقیقا برنامه من است توفنده، در چه خط،
در چه پاسخ به آنچه که تابع؟
چه نوع از سرنخ که به من بدهید؟
و این دقیقا همان نوع طرز فکر که شما
باید از وارد شدن به زمانی که شما فکر کردن در مورد اشکال زدایی برنامه های خود را.
>> من داگ لوید هستم.
این CS50 است.