DOUG LLOYD: Bütün hüququ gdb. Məhz nədir? Dayanır belə gdb, GNU Debugger üçün, həqiqətən zəhmli vasitədir ki, biz edə bilərsiniz Bizim proqramları debug bizə kömək etmək üçün istifadə, və ya şeyi olduğu tapmaq bizim proqramları yanlış gedir. Gdb, qəribə güclü, lakin bu çıxış və qarşılıqlı bir az sirli ola bilər. Bu adətən bir command line alət var, və Bu sizə mesaj bir çox atmaq olar. Və bu cür ağır bilərsiniz gedən dəqiq nə analiz. Xoşbəxtlikdən, biz qəbul etdik addımlar sizin üçün bu problemi həll etmək CS50 vasitəsilə iş kimi. Siz qrafik istifadə edirsinizsə ayıklama, mənim həmkarım Dan Armandarse olduqca danışdı bir video haqqında bir az ki, burada olmalıdır İndi, sizə lazım ola bilər Bu command line istifadə etmək tools gdb ilə işləmək üçün. Siz CS50 iş edirsinizsə IDE, bunu etmək lazım deyil. Amma değilseniz CS50 IDE çalışan, bəlkə bir versiyasını istifadə edərək, CS50 Aracı ki, və ya başqa bir Linux əməliyyat gdb sistemi, bu yüklü istifadə etmək lazım ola bilər bu command line alətlər. Və ildən bilər bu ki, nə etmək lazımdır necə anlamaq üçün faydalı GDB skript satırı işləyir. Ancaq yenə də, siz değilseniz CS50 IDE istifadə edərək, siz qrafik ayıklama istifadə edə bilərsiniz ki, IDE daxil edilir. Belə şeylər ilə başlamaq üçün Gdb ayıklama başlamaq üçün xüsusi prosesi proqram, siz bütün lazım GDB təqib tipi Proqram adı ilə. Belə ki, məsələn, proqram əgər salam, siz gdb salam yazın ki. Bunu zaman, olacaq GDB mühit qoparmaq üçün. Sizin tez dəyişdirmək və əvəzinə olan adətən nə Siz hər şeyi yazın zaman command xətti ls da, Sizin tipik bütün cd-- Linux, sizin tez əmrləri , yəqin ki, bir şey dəyişəcək parantez kimi gdb parantez. Çünki, yeni gdb tez var Siz gdb mühit daxilində istəyirik. Sonra ki, ətraf mühit daxilində, iki əsas əmrləri var Siz yəqin ki, istifadə edəcəyik ki, aşağıdakı qaydada. ilk b, olan fasilə üçün qısa. Və b, adətən yazın sonra bir funksiyası adını yazın, və ya Bildiyiniz nə varsa nə line sayı ətrafında Proqram başlayır bir az qəribə davranmaq, Bir xətt yazın sıra həmçinin. Nə b, və ya fasilə yoxdur bu proqram imkan verir müəyyən bir nöqtəyə qədər çalıştırmak üçün, funksiyası, yəni adı belirttiğiniz və ya line olduğunu belirttiğiniz nömrəsi. Və o nöqtədə, onu icrası dondurmaq edəcək. Bu, çünki, həqiqətən yaxşı bir şey deyil icra dondurulub sonra, Siz çox yavaş-yavaş başlaya bilər proqram gezinmek. Siz olduğunuz əgər Adətən, çalışan Sizin proqramları, onlar olduqca qısa istəyirik. Adətən, siz dot çizgi yazın nə Proqram adı daxil edin hit və qırpmaq əvvəl, sizin Proqram artıq başa çatmışdır. Bu, həqiqətən cəhd çox vaxt deyil və yanlış gedir nə anlamaq. Bu, həqiqətən, hər şeyi yavaş etmək üçün belə aşağı b bir fasilə point qəbulu ilə, və sonra gücləndirməklə. Siz fasilə müəyyən etdik sonra bir dəfə point, proqram çalıştırabilirsiniz. Və hər hansı bir varsa command line dəlilləri, Siz burada müəyyən zaman Siz proqram adı gdb yazın. Siz bütün command line daxil r, və ya run alaraq dəlilləri, və sonra hər hansı command line dəlilləri Siz proqram daxilində lazımdır. Digər bir sıra həqiqətən var mühüm və faydalı əmrləri ÜDM-in ətraf mühit daxilində. Belə ki, yalnız tez mənə imkan bəziləri üzərində gedin. ilk, növbəti üçün qısa n edir və növbəti əvəzinə n yazın həm iş olardı. Və yalnız stenoqrafiya var. Və yəqin ki, artıq kazanılmış kimi şeyi yazın qadir olan üçün istifadə qısa ümumiyyətlə yaxşıdır. Və nə bunu edəcək lazımdır deyil kod irəli bir blok addım. Belə ki, irəli hərəkət edəcəyik bir funksiyası zəng qədər. Və sonra yerinə ki, funksiyası daxil dalış və funksiyaları bütün keçir indeksi, yalnız funksiyası olacaq. funksiyası adlanacaq. Onun iş nə lazımdırsa edəcəyik. Bu dəyər qayıdacaqlar adlı funksiyası. Və sonra üçün hərəkət edəcəyik ki, zəng funksiyası növbəti line. Addım istəyirsinizsə funksiyası daxilində, əvəzinə yalnız olan xüsusilə, icra Siz problem hesab edirəm ki, əgər ki, funksiyası daxilində yalan bilər, Siz, əlbəttə, bir fasilə təyin edə bilər daxilində funksiyası qeyd. Əgər siz artıq yayınlıyorsanız və ya, siz kod irəli bir xətt addım s istifadə edin. Belə ki, bu addım olacaq və funksiyaları daxil dive, əvəzinə yalnız icra var və funksiyası davam Siz ayıklama üçün istəyirik ki. Əgər bilmək istəyirsinizsə dəyişən dəyəri, Siz p, və ya çap edə bilərsiniz, və sonra dəyişən adı. Və sizə çap edəcək GDB ətraf mühit daxilində, dəyişən adı ki, Səninlə me-- dəyişən dəyəri bəhanə adlı etdik ki. Hər dəyərləri bilmək istəyirsinizsə burada yerli dəyişən əlçatan Hal-hazırda olan sizin proqram, siz info yerli edəbilərsiniz. Bu çox sürətli var sonra p yazaraq və nə olursa olsun, bütün həyata listing Siz mövcud bilirik dəyişənlər. Siz info yerli yazın və bu edə bilərsiniz sizin üçün hər şeyi çap edəcək. Sonrakı qədər olan bt edir Back Trace üçün qısa. İndi, ümumiyyətlə, xüsusilə erkən CS50, Siz, həqiqətən, münasibətilə olmayacaq BT, və ya geri iz istifadə etmək, funksiyaları olan deyilik, çünki digər funksiyaları zəng. Siz əsas zəng bir ola bilər funksiyası, lakin yəqin ki, var. Siz digər funksiyası yoxdur başqa bir funksiyası, zəng edən başqa bir funksiyası çağırır, və s. Lakin proqramları daha çox almaq kimi kompleks, xüsusilə iş başlamaq zaman recursion ilə geri iz imkan üçün həqiqətən faydalı şəkildə ola bilər cür üçün bəzi kontekstində almaq Mən proqramı edirəm. Belə ki, sizin kodu yazdıq demək və Siz əsas bir funksiyası çağırır bilirik ki, bir funksiyası çağırır f, funksiyası h çağırır g. Beləliklə, biz bir neçə qat var quş balası burada olur. Siz daxilində əgər Sizin gdb ətraf mühit, və sizin daxili bilirik saat, ancaq unutmaq Siz harada siz var nə haqqında Siz BT, və ya geri iz yazın are--, və bu, h, q həyata əsas f çap edəcək bəzi digər məlumatlar yanaşı olan bir ipucu verir ki, OK əsas adlı f adlı g f, g, h adlı və harada Mən Hal-hazırda mənim proqramı edirəm. Belə ki, həqiqətən faydalı ola bilər xüsusilə gdb sirli-biznes kimi , bir az böyük olur hər şeyi tam olaraq harada tapmaq. Nəhayət, proqram görülən zaman, Bitirdiğinizde və ya ayıklama və üz addım istəyirəm gdb mühitdən, bu çıxmaq necə bilmək kömək edir. Siz q yazın və ya çıxmaq üçün, tərk edə bilər. İndi, bu gün Videonu əvvəl Mən arabası proqram hazırladı Mən tərtib adlı buggy1, buggy1.c kimi tanınan faylı. Siz bu gözləyə bilər kimi Proqram fakt arabası var. Bir şey yanlış gedir Mən cəhd və çalıştırın. İndi təəssüf ki, səhvən Mənim buggy1.c fayl silindi belə qaydada mənə anlamaq üçün nə bu proqram ilə yanlış gedir Mən istifadə etmək üçün gedirəm GDB cür kor-koranə, çalışır Bu proqram gezinmek üçün yanlış gedir nə anlamaq. Amma vasitələrdən istifadə biz artıq haqqında öyrəndim biz olduqca çox anlamaq olar bu dəqiq nə. Belə ki, üzərində rəhbərlik edək CS50 IDE və bir göz var. OK, belə ki, biz buradayıq my CS50 IDE ətraf mühit, və mən bir az zoom lazımdır belə ki, bir az daha çox ola bilər. Mənim terminal pəncərə, mən siyahısını əgər Mənim cari direktoru məzmunu ls, biz ki, mən görürsünüz mənbə faylları bir neçə var Burada, o cümlədən əvvəllər buggy1 müzakirə olunub. Nə dəqiq zaman gedir Mən cəhd və buggy1 axır. Yaxşı tapmaq imkan verir. Mən dot çizgi növü arabası, mən Enter düyməsini basın. Seqmentasiya çatışmazlıqlar. Bu yaxşı deyil. Siz geri varsa, seqmentasiya günah adətən biz yaddaş daxil zaman baş verir biz toxunmaq icazə deyilik ki. Biz elə əldə etdik hüdudlarından kənarda nə proqramı, compiler bizə verdi. Və belə artıq bir ipucu Toolbox saxlamaq üçün biz ayıklama prosesi başlayacaq kimi. Something burada bir az yanlış keçmişdir. Bütün hüquqlar, belə edək start GDB ətraf mühitə qədər biz anlamaq bilər görmek dəqiq problemdir. Mən ekran sil gedirəm və mən gdb yazın gedirəm yenə gdb mühit daxil etmək, və proqram adı Mən buggy1 debug etmək istəyirəm ki,. Biz oxu, bir az mesaj almaq buggy1 simvolları, görülən. O deməkdir ki, bütün bu çıxardı deyil birlikdə bütün kodu, və indi instantly edilmişdir Gdb, və getmək üçün hazır. İndi mən nə istəyirəm? Siz nə xatırlayıram yoxdur ilk addım adətən Mən bu mühitdə daxilində deyiləm sonra? Ümid edirəm ki, müəyyən etdi fasilə point, çünki əslində mən bunu istəyirəm nə. İndi yoxdur bu mənbə kodu Önümdə olan yəqin ki, tipik istifadə halda, yolu ilə. Siz yəqin ki, olacaq. Belə ki, yaxşı. Amma fərz deyil, nə etmək Bildiyiniz bir funksiyası hər bir C proqram mövcuddur? Nə böyük və ya necə mürəkkəb Bu, bu funksiya mütləq mövcuddur. Main, sağ? Belə ki, bütün başqa, biz bilər uğursuz əsas bir fasilə nöqtəsini qurmaq. Və yenə, mən yalnız yazın bilər əvəzinə b, əsas pozub. Və siz maraqlı olduğunuz halda, əgər Heç bir uzun komanda həyata yazın və sonra ki, həyata yanlış şey tipli, və xilas olmaq istəyirik bütün Mən yalnız kimi, Siz olan, Control U bilər hər şeyi silmək və sizə geri gətirmək kursor xətləri əvvəlinə. Yalnız basıb saxlayın çox daha sürətli bir çox silmək və ya bir dəstə dəfə vuraraq üzərində. Belə ki, biz əsas bir fasilə nöqtəsini qurmaq lazımdır. Və Gördüyünüz kimi, biz var deyir fayl buggy1.c bir fasilə nöqtəsini qurmaq, və yəqin ilk line Əsas kodu xətti yeddi. Yenə yoxdur Burada mənbə fayl, ancaq ki, güman lazımdır Mənə həqiqəti söyləyirəm. Və sonra, mən yalnız çalışıram və r, proqram run. Proqram başlayaraq. Bütün hüquqlar, belə ki, bu mesajı bir az sirli edir. Lakin əsasən nə Burada baş verən yalnız var edir Mən fasilə təşkil etdik mənə izah point, break point sayı 1. Və sonra, kodu ki, xətt, Belə fayl vəya qovluq yoxdur. yeganə səbəbi ki, Hesab edirəm ki, mesaj görüyorum Mən səhvən çünki Mənim buggy.c fayl silindi. Mənim buggy1.c fayl mövcud əgər cari kataloq, orada həqiqətən ki line sağ mənə nə kodu xətt sözün deyilir. Təəssüf ki, mən bunu silindi. Biz növ getmək üçün var olacaq daha kor-koranə bu bir az vasitəsilə. OK, belə ki, görək, nə Mən burada nə etmək istəyirsiniz? Yaxşı, mən yerli nə bilmək istəyirəm dəyişənlər bəlkə mənim üçün mövcuddur. Mən proqram açılmış etdik. Nin ola bilər nə görmək edək artıq bizim üçün başlatılmış. Mən Info yerli, heç bir yerli yazın. Bütün hüquqlar ki, deyil, belə ki, Mənə informasiya ton verir. Mən cəhd və bir dəyişən çap edə bilər, amma heç bir dəyişən adlarını bilmirəm. Mən geri iz cəhd edə bilər, amma əsas daxilində deyiləm, belə ki, mən deyil bilirik İndi bir funksiyası zəng. Mənim yalnız variantları kimi belə görünür n və ya istifadə və dalış başlamaq üçün. Mən n istifadə gedirəm. Belə ki, n yazın. Gosh Aman, nə burada davam edir. Program siqnalları qəbul SIGSEGV seqmentasiya günah, və sonra məhsullarının bütün dəstə. Mən artıq overwhelmed edirəm. Bəli, həqiqətən var bir çox burada öyrənildi. Belə ki, nə bu bizə nə deyir? Nə bizə deyir, bu proqram deyil, haqqında, lakin hələ seg günah. Və xüsusilə, mən gedirəm daha burada zoom, bu barədə seg günah haqqında bir şey strcmp çağırıb. İndi biz müzakirə ola bilər geniş fəaliyyət göstərir. Biz fikrində deyilik, çünki is-- hər funksiyası haqqında danışmaq ki, C standart mövcuddur kitabxana lakin onlar sizin üçün bütün mövcud istəyirik Bir almaq, xüsusilə də əgər reference.cs50.net baxmaq. Və strcmp həqiqətən güclü daxili mövcud funksiyası string.h header bir mövzu fayl, funksiyaları həsr olunur faylı ilə iş və strings manipulyasiya. Və xüsusilə, nə strcmp yoxdur edir iki strings dəyərlər müqayisə edir. Beləliklə, mən Seqmentasiya günah haqqında Ben zəng görünür strcmp üçün. Mən n edib və əslində mən mesajı almaq proqram siqnal SIGSEGV ilə xitam seqmentasiya günah. Belə ki, indi Mən, həqiqətən, seg faulted var, və proqram olduqca var çox səmərəli imtina. Bu proqramın sonu. Bu pozuldu, bu qəzaya uğrayıb. Belə ki, bir çox deyil idi, lakin mən həqiqətən kifayət qədər bir az öyrənmək idi bu kiçik təcrübə. Mən nə öyrəndim? Bəli, mənim proqram qəzaları dərhal olduqca çox. Mənim proqram qəzaları bir strcmp zəng, amma hər hansı yerli dəyişənlər yoxdur mənim Yeməyini zamanda proqram. Belə ki, nə string, və ya strings, Mən bəlkə müqayisə ola bilər. Mən heç bir yerli yoxsa dəyişənlər, güc bəlkə bir mən var yaxşıdır ki, təxmin doğru ola bilər qlobal dəyişən. Amma, ümumiyyətlə, görünür Mən müqayisə edirəm mövcud deyil ki, bir şey. Belə ki, araşdırmaq imkan bir az daha ki. Beləliklə, mən ekran sil gedirəm. Mən həyata çıxmaq üçün gedirəm Ikinci gdb mühit. Mən OK, düşüncə deyiləm, var mənim proqram heç bir yerli dəyişənlərin. Mən keçmək güman edirəm bəlkə görəsən bir command line arqument kimi simli. Belə ki, yalnız bu test imkan verir. Mən əvvəl bu həyata yoxdur. Mən bu proqram run bəlkə əgər in nəzər salaq bir command line arqumenti ilə işləyir. Huh, heç seqmentasiyası günah. Bu, sadəcə mən bunu həyata fiqurlu ki, mənə. Belə ki, bəlkə ki, fix burada. Mən geri getmək və əgər həqiqətən baxmaq buggy1.c faktiki mənbə kodu, edirəm nə olsa kimi görünür Mən olmadan strcmp zəng edilməsi alıram əslində argv [1] mövcud olub-olmadığını yoxlanılması. Bu, həqiqətən deyil buggy1.c üçün mənbə kodu. Beləliklə, mən, həqiqətən, ehtiyac nə mənim proqram düzeltmek üçün burada nə, fərz Mən , mənə qarşısında fayl yalnız etmək üçün bir çek əlavə etmək əmin argc 2 bərabərdir. Belə ki, bu nümunə yenə, dediyim kimi sağ, bir az göstərdi edir? Siz, ümumiyyətlə, fikrində deyilik təsadüfən sizin mənbə kodu silmək və sonra cəhd var və proqram debug. Amma ümid edirəm ki, bu, verdi Bir illüstrasiya şeyi növ ki, haqqında düşünür ola bilər kimi proqram ayıklama edirik. Burada işlər dövlət nədir? Nə dəyişənlər I do Mənə əlçatan var? Dəqiq mənim proqram nə xəttində, şaqqıltılı, nə funksiyası nə zəng haqqında? Ipuçları hansı ki, mənə verir? Və dəqiq zehniyyət cür ki, Siz etdiyiniz zaman əldə edilməlidir Sizin proqramları ayıklama haqqında düşünür. Mən Doug Lloyd edirəm. Bu CS50 edir.