>> Doug LLOYD: Pekala GDB.
Tam olarak nedir?
Standları Yani GDB, GNU Debugger,
gerçekten harika bir araçtır biz yapabilirsiniz olduğunu Bizim programları ayıklamak bize yardımcı olmak için kullanabileceğiniz,
veya şeyler nerede olduğunu öğrenmek Bizim programlarda yanlış gidiyor.
GDB, inanılmaz güçlü ama bu çıkış ve etkileşim
biraz şifreli olabilir.
Genellikle bir komut satırı aracı, ve Senin de iletilerin bir sürü atabilir.
Ve bu tür zor olabilir oluyor tam olarak ne ayrıştırmak.
Neyse ki, biz geçtiniz adımlar sizin için bu sorunu çözmek için
Eğer CS50 ile çalışırken.
Eğer grafiksel kullanmıyorsanız debugger, hangi meslektaşım Dan
Armandarse oldukça konuştu Bir video hakkında biraz o
burada olmalı Şu anda, ihtiyacınız olabilecek
Bu komut satırını kullanmak için araçlar GDB ile çalışmak.
Eğer CS50 çalışan ediyorsanız IDE, bunu yapmak gerekmez.
Ama sen değilsen CS50 IDE çalışan,
belki bir sürümünü kullanıyorsanız CS50 Aletler,
ya da başka bir Linux işletim GDB ile sistem üzerinde yüklü
Eğer kullanmanız gerekebilir Bu komut satırı araçları.
>> Ve bu yana olabilir bu, bunu yapmak zorunda
Sadece anlamak için yararlı GDB komut satırından çalışır.
Fakat yine de, sen eğer CS50 IDE kullanırken,
grafik hata ayıklayıcı kullanabilirsiniz Bu IDE içine inşa edilmiştir.
Yani işler ile yola çıkmaya GDB, hata ayıklama başlatmak için
Belirli bir işlem Program, tüm yapmanız gereken
GDB takip tip olduğunu Program adına göre.
Yani, örneğin, program ise merhaba, GDB Merhaba yazarsınız.
>> Bunu yaptığınızda, gidiyoruz GDB ortamı yukarı çekin.
Sizin istemi değiştirmek ve olacak yerine olmanın genellikle neyi onu
Eğer bir şeyler yazarken olduğunu Komut LINE ls at,
tipik Tüm cd-- Linux, senin istemi komutları
Muhtemelen, bir şey değişecek Parantez gibi GDB parantez.
Bunun nedeni, yeni GDB istemi var Eğer GDB ortamı içinde konum.
Bir kez bu ortam içinde, İki büyük komutları var
Muhtemelen kullanmak edeceğiz aşağıdaki sırayla.
>> İlk b olan mola için kısa.
Ve b, genellikle yazdıktan sonra Bir fonksiyonun adını yazın,
ya da bilmek ne varsa Ne satır numarası etrafında
Programınız başlıyor Biraz tuhaf davranmaya,
Bir çizgi yazabilirsiniz sayıda da.
Ne b veya mola yapar bu sizin programı veriyor
Belli bir noktaya kadar çalıştırmak için, fonksiyonun, yani, adı
Belirttiğiniz veya çizgi olduğunu Belirlediğiniz numara.
>> Ve bu noktada, o yürütme donacak.
Bunun nedeni, gerçekten iyi bir şeydir yürütme dondurulmuş edildikten sonra,
Çok yavaş başlayabilirsiniz programınız adım adım.
Eğer oldum Genellikle, çalışan programlarınız, onlar oldukça kısa olduğunu.
Genellikle, nokta çizgi tipi ne olursa olsun Programınızın adı girin vurmak
ve yanıp önce, senin Program zaten bitti.
Gerçekten denemek için zaman çok değil ve yanlış neler olduğunu anlamaya.
Gerçekten bir şeyler yavaş edebilmek için So Aşağı b ile bir kırılma noktasını belirleyerek,
ve ardından adım.
>> Eğer mola koyduk sonra bir kez point, programı çalıştırabilirsiniz.
Ve eğer varsa komut satırı argümanları,
Eğer onları burada belirtmedi zaman Eğer program adı GDB yazın.
Tüm komut satırı belirtmek r veya çalıştırmak alarak argümanlar,
ve sonra ne olursa olsun komut satırı argümanları Eğer programın içine gerekir.
Diğer bir dizi gerçekten vardır önemli ve yararlı komutlar
GSYH ortamının içinde.
Dolayısıyla, sadece hızlı bir şekilde bana izin bazıları üzerine gitmek.
>> İlk sonraki kısaltmasıdır n'dir, ve sonraki yerine n yazabilirsiniz
Her iki çalışmaya devam eder.
Ve bu sadece steno var.
Ve muhtemelen kazanılmış ettik gibi şeyleri yazmanız edememek, kullanılan
kısa genellikle daha iyidir.
Ve ne yapacak o olacak olan kod öne bir blok adım.
Bu yüzden ileriye taşımak olacak bir işlev çağrısı kadar.
Sonra yerine Bu işlevin içine dalış
ve bu fonksiyonların hepsi geçiyor kod, sadece işleve sahip olacaktır.
>> Işlevi çağrılır.
Onun eseridir ne gerekiyorsa yapacağız.
Bir değer dönecektir denilen işlevi.
Sonra üzerine hareket edeceğiz Bu arama fonksiyonu bir sonraki satırı.
Eğer adım istiyorsanız işlev içinde,
yerine sahip özellikle, yürütmek
Sorun olduğunu düşünüyorsanız Bu işlevin içinde yalan olabilir,
Eğer, tabii ki, bir mola ayarlayabilirsiniz içinde bu işlevin etmektedir.
Zaten çalıştırıyorsanız veya yapabilirsiniz kod ileriye doğru bir çizgi adıma s kullanın.
>> Yani bu adım olacaktır ve işlevleri içine dalış,
yerine sadece yürütme var ve fonksiyon olarak devam
Eğer hata ayıklama için olduğunuzu.
Hiç bilmek istiyorsanız Bir değişkenin değerini,
Eğer p, ya da Yazdır yazabilirsiniz, ve daha sonra değişken adı.
Ve bu, sizin için dışarı basacaktır GDB ortamı içinde,
değişkenin adı, bu sen-- bana-- değişkenin değerini bahane
adında ettik.
Her değerlerini bilmek istiyorsanız Nereden yerel değişken erişilebilir
Şu anda olan senin Program, size bilgi yerliler yazabilirsiniz.
Bu çok daha hızlıdır Daha sonra s yazarak ve ne olursa olsun,
tüm dışarı listeleme hayatta olduğunuzu değişkenler.
Sen bilgi yerliler yazın ve yapabilirsiniz sizin için her şeyi dışarı basacaktır.
Sıradaki olan bt olduğunu Geri Trace için kısa.
Şimdi, genel olarak, özellikle erken CS50 olarak,
Eğer gerçekten fırsat olmaz bt veya geri Trace kullanmak için,
Eğer fonksiyonlara sahip değil çünkü diğer işlevleri çağırmak.
>> Ana çağrı a sahip olabilir fonksiyonu, ancak bu muhtemelen öyle.
Bunu diğer işlevi yok Başka bir işlevi çağırarak hangi
Başka bir işlevini çağırır, vb.
Ama programları daha olsun Karmaşık ve özellikle
Çalışırken başladığınızda yineleme ile, arka iz
izin için gerçekten yararlı bir yol olabilir tür için bazı içerik almak
Benim programda duyuyorum.
Yani kod yazdık demek, ve ana bir işlevini çağırır biliyorum
Bir işlevi çağıran f, Bir işlev h çağırır g.
Bu yüzden birkaç katman var iç içe oluyor burada.
>> Eğer içinde iseniz senin GDB çevre,
ve size içini biliyorum h, ama sen unutmak
Size nerede size ne var hakkında Eğer bt veya arka iz yazabilirsiniz mudur,
ve o, h, g dışarı ana f basacaktır Bazı diğer bilgileri, yanında hangi
Size bir ipucu verir, OK ana adı f, olarak adlandırılır g f, g, h olarak adlandırılan
ve bu nerede ben Şu anda benim programda duyuyorum.
Bu yüzden, gerçekten yararlı olabilir Özellikle GDB şifreli-ness olarak
için, biraz ezici olur şeyler tam olarak nerede olduğunu öğrenmek.
Son olarak, programınız bitince, İşiniz bittiğinde veya hata ayıklama
ve uzaklaşmak istiyorum GDB ortamından,
bunun dışında nasıl bilmek yardımcı olur.
Sen q yazın veya çıkmak için Quit olabilir.
Şimdi, bugünün videosu önce Ben bir adamcağız programı hazırladı
Ben derlenmiş denilen buggy1, buggy1.c olarak bilinen bir dosyadan.
Eğer, bu Tahmin edebileceğiniz gibi Program aslında arabası olduğunu.
Bir şeyler yanlış giderse ben denemek ve çalıştırın.
Şimdi, ne yazık ki, ben yanlışlıkla Benim buggy1.c dosyası silinir
böylece sırayla beni anlamaya için Ne bu program ile yanlış gidiyor
Ben kullanmak zorunda gidiyorum GDB tür körü körüne, çalışıyor
Bu program sayesinde gezinmek için yanlış gidiyor tam olarak ne olduğunu anlamaya.
Ama araçlarını kullanarak biz zaten, hakkında öğrendim
biz hemen hemen bir rakam olabilir tam olarak ne dışarı.
Yani sından izin CS50 IDE ve bir göz var.
Tamam, bu yüzden biz buradayız benim CS50 IDE ortamı,
ve ben biraz yakınlaştırmak olacak bu yüzden biraz daha görebilirsiniz.
Benim terminal penceresinde, ben liste varsa Benim şimdiki yönetmen içeriği
ls, biz o ben görürsünüz kaynak dosyalarının bir çift var
Burada, aşağıdakileri içeren Daha önce buggy1 tartışıldı.
Ne tam olarak ne zaman gider Ben denemek ve buggy1 çalıştırın.
Peki dışarıda bulalım.
Ben, nokta çizgi tipi buggy ve ben Enter tuşuna basın.
>> Segmentasyon hataları.
Bu iyi değil.
Eğer hatırlayacak olursak, bir Segment arıza tipik
Biz belleğe erişim oluşur Biz dokunmak için izin değiliz.
Biz bir şekilde ulaştık sınırları dışında
ne programı, derleyici, bize verdi.
Ve böylece zaten var bir ipucu araç kutusundaki tutmak için
Biz ayıklama işlemine başlarken.
Burada bir şey biraz yanlış gitti.
>> Pekâlâ, izin başlangıç GDB ortamında kadar
biz anlamaya eğer görmek tam olarak ne bir sorundur.
Ben, benim ekranı temizlemek için gidiyorum ve ben GDB yazın gidiyorum
Yine, GDB ortamına girmek için, ve programın adı
Ben, buggy1 hata ayıklamak istediğiniz.
Biz okuma, biraz olsun mesajı buggy1 sembollerini yapılır.
Demek ki tüm bu olup çekti Birlikte tüm kod,
ve şimdi yüklenen oldu GDB ve gitmek için hazır.
>> Şimdi ne yapmak istiyorsun?
Ne hatırlıyor musun İlk adım, tipik olarak
Ben bu ortamın içinde olduğumu sonra?
Umarım, set sözü Bir kırılma noktası, çünkü
Aslında ben yapmak istediğim budur.
Şimdi, ben yok Bunun için kaynak kodu
Önümde, hangi muhtemelen değil tipik kullanım durumunda, bu arada.
Muhtemelen olacaktır.
Yani bu iyi.
Ama varsayarak değil, ne yapmak Bildiğiniz bir fonksiyon
her C programı var?
Ne kadar büyük ya da ne kadar karmaşık o, bu işlev kesinlikle var.
Main, değil mi?
>> Yani her şeyden biz yapabilirsiniz başarısız Ana bir kesme noktası ayarlamak.
Ve yine, ben sadece yazabilirsiniz yerine b ana bölünürler.
Ve sen, meraklı iseniz eğer Hiç uzun bir komutu yazın
ve o zaman fark yanlış bir şey yazdınız,
ve kurtulmak istiyorum Tüm ben yaptım,
hangi irade, Denetim U alabilir her şeyi silmek ve seni geri getirmek
İmleç hatlarının başına.
Sadece basılı daha hızlı bir sürü silme veya bunu bir demet kez isabet
bitti.
>> Yani biz ana bir kesme noktası ayarlamak gerekir.
Ve gördüğünüz gibi, biz ettik diyor Dosya buggy1.c bir kesme noktası ayarlamak,
ve görünüşe göre ilk satırı Ana kod satırı yedidir.
Yine, biz yok Burada kaynak dosya,
ama olduğunu varsayıyoruz Bana doğruyu söylüyor.
Ve sonra, ben sadece çalışıyorum ve r, programı çalıştırın.
Programının başlatılması.
Pekala, bu mesajı Biraz şifreli olduğunu.
Ama temelde ne Buradaki bu sadece bir
Ben mola isabet ettik bana nokta, kırılma noktası 1 numara.
>> Ve sonra, o kod satırı, Böyle bir dosya ya da dizin yok.
Tek nedeni o Ben bu mesajı görüyorum
I yanlışlıkla çünkü Benim buggy.c dosya silindi.
Benim buggy1.c dosya var ise Geçerli dizinde,
Orada aslında olur o hat hakkı Bana söylediklerini kod satırı
Kelimenin tam anlamıyla okur.
Ne yazık ki, bunu silindi.
Biz tür gezinmek zorunda gidiyoruz daha körü körüne bu biraz aracılığıyla.
>> Tamam, bu yüzden görelim ne Burada yapmak istiyorsun?
Eh, ben yerel ne bilmek istiyorum değişkenler belki benim için kullanılabilir.
Ben programı başladım.
En olabileceğini görelim zaten bizim için başlatıldı.
Ben Bilgi halkı, hiçbir yerli yazın.
Pekala, o değil bu yüzden Bana bilgi ton verir.
Ben denemek ve bir değişken yazdırmak olabilir, ama herhangi bir değişken isimlerini bilmiyorum.
Ben bir arka iz deneyebilirsiniz, ama ana içinde değilim,
bu yüzden ben yapılmış değil biliyorum Şu anda başka bir işlev çağrısı.
>> Benim tek seçenek olduğu gibi Yani görünüyor n ya da öylesine kullanın ve dalış başlamak için.
Ben n kullanmak için gidiyorum.
Yani n yazın.
Aman Tanrım, neler oluyor burada.
Program alınan sinyalleri, SIGSEGV segmentasyon hatası,
ve ardından şeyler bir sürü.
Ben zaten bunaldım.
Eh, aslında orada bir burada çok öğrenilecek.
Peki bu bize ne anlatıyor?
Ne söyler bu program, bir hakkında, ancak sahip değil henüz, seg arıza.
Ve özellikle de, ben gidiyorum Hatta burada daha fazla yakınlaştırmak için,
bu konuda hatayı seg için ilgili bir şey strcmp denir.
>> Şimdi, biz ele olmayabilir yoğun bu işlevi kullanın.
Biz gitmiyoruz çünkü Ama bu-- her fonksiyonu hakkında konuşmak için bu
C standardında var library-- ama onlar, sana tüm mevcut konum
Eğer almak özellikle reference.cs50.net bak.
Ve strcmp gerçekten güçlü içeride var işlevi
string.h başlığının bir başlık olan dosya,
işlevlerine adanmış dosya o iş ve dizeleri işlemek.
>> Ve özellikle de ne strcmp yapmasıdır iki dizeleri değerlerini karşılaştırır.
Yani hatayı segmentasyon üzereyim Bir çağrı görünüyor strcmp için.
Ben n vurdu, ve aslında ben mesajı alıyorum program sinyali SIGSEGV ile sona
Segmentasyon hatası. Yani şimdi Aslında seg hatalı olması,
ve benim program oldukça vardır çok etkili bir vazgeçmiş.
Bu programın sonudur.
O bozuldu, çöktü.
Yani çok değildi, ama ben aslında biraz öğrendin
Bu küçük deneyimlerinden.
Ne öğrendiniz?
Eh, benim program çöküyor Hemen oldukça fazla.
Benim program çöker Bir strcmp için diyoruz, ama ben
herhangi bir yerel değişkenleri yok benim o çöker anda programı.
Peki dize veya dizeler, Ben belki karşılaştırarak olabilir.
Ben herhangi bir yerel yoksa değişkenler, sen belki
belki bir ben orada have-- yürütebiliriz doğru olabilir global değişken.
>> Ama genelde, öyle görünüyor gibi karşılaştırarak kulüpler
yok bir şey.
Yani inceleyelim Biraz daha söyledi.
Yani benim ekranı temizlemek için gidiyorum.
Ben dışarı çıkın gidiyorum Bir saniye GDB ortamı.
Ve ben, tamam düşünme değilim, bu yüzden var Benim programda yerel bir değişken.
Ben geçmesi gerekiyor belki acaba Bir komut satırı argümanı olarak bir dize.
Yani sadece bu test edelim.
Ben daha önce bu yapmadım.
>> Ben bu programı çalıştırmak belki Bakalım Bir komut satırı argümanı ile çalışır.
Ha, hiçbir bölümleme hatası.
Sadece ben bunu anladım söyledi.
Yani belki de düzeltme burada.
Geri dönüp eğer ve gerçekten bakmak buggy1.c gerçek kaynak kodu,
Ben ne yapıyorum sanki görünüyor Ben olmadan strcmp için bir çağrı yapıyorum
Aslında argv [1] var olup olmadığını kontrol ediyor.
Bu aslında buggy1.c kaynak kodu.
Yani ben gerçekten gereken Benim programı düzeltmek için burada yapmak,
varsayarak ben olduğunu önümde dosya
Sadece yapmak için bir onay eklemek için emin argc 2'ye eşittir.
Yani bu örnek, yine ben, dediğim gibi Doğru, biraz yapmacık mı?
Genellikle gitmiyorsun yanlışlıkla kaynak kodunu silmek
ve daha sonra denemek zorunda ve programı hata ayıklama.
Ama umarım bu verdi Bir çizim
şeylerin türlü o Eğer düşünmeye olabilir
olarak programınızı hata ayıklama ediyoruz.
>> Burada vaziyet nedir?
Ne değişkenler I do Bana erişilebilir var?
Nerede tam olarak benim program Ne on line, kilitleniyor,
Ne işlevine ne çağrı üzerine?
Ipuçları Ne tür bana verir?
Ve bu tam olarak zihniyet tür size
sen ne zaman geçmesini gerektiğini Programlarınızı hata ayıklama hakkında düşünme.
>> Ben Doug Lloyd değilim.
Bu CS50 olduğunu.