[Powered by Google Translate] [Valgrind] [Nate Hardison, Harvard Universiteti] Bu CS50.TV, CS50 edir] C proqramlarının ən çətin bugs bəzi yaddaş təsərrüfatsızlıq gəlir. Şeyi qıymaq yolları bir çox var, yaddaş yanlış məbləği bölüşdürülməsi, o cümlədən, dəyişənlərin başlamaq üçün unutmadan, bufer sonunda əvvəl və ya sonra yazı, və yaddaş neçə dəfə saxlamaq azad. Əlamətləri aralıq qəzaları dən üçündür müəmmalı üzerine dəyərlərə, tez-tez uzaq orijinal səhv çıxarılır yerləri və zaman. Əsas kök səbəb geri müşahidə problem izlənməsi çətin ola bilər, amma xoşbəxtlikdən Valgrind adlı faydalı proqram var ki, kömək etmək üçün bir çox edə bilərsiniz. Siz imkan Valgrind altında bir proqram run yığın yaddaş ayırmaları və girişler geniş yoxlanılması. Valgrind bir problem algıladığında,, siz dərhal verir Sizə imkan verir ki, birbaşa məlumat daha asanlıqla tapmaq və bu problemi həll. Də az ölümcül yaddaş məsələlər üzrə hesabatlar Valgrind belə yaddaş sızıntıları kimi yığın yaddaş ayrılması, və azad unutmurlar. Bizim ayıklama bizim compiler, cingilti, gdb, kimi Valgrind pulsuz proqram, və bu cihaz quraşdırılıb. Valgrind, sizin ikili çalıştırılabilir çalışır sizin. c və ya. h kodunu faylları, belə ki, proqram bir up-to-tarix nüsxəsi tərtib əmin olmaq zınqıltı istifadə edərək və ya olun. Sonra Valgrind altında proqram çalışan ola bilər yalnız söz Valgrind standart proqram komanda prefixing kimi sadə, olan Valgrind up başlayır və daxilində proqram çalışır. Başlayan zaman, Valgrind sıra kompleks yoxdur yaddaş çek üçün yürütülebilir konfiqurasiya jiggering, belə onu və yayınlanmasını üçün bir az bilər. Bu proqram sonra daha yavaş-yavaş, normal həyata olacaq və başa zaman, Valgrind onun yaddaş istifadə xülasəsi çap olunacaqdır. Bütün yaxşı gedərsə, bu kimi bir şey görünür: Bu halda,. / Clean_program Mən çalıştırmak üçün istədiyiniz proqram yoludur. Və bu heç bir dəlilləri daşımır isə, bunu, mən həmişə olduğu kimi komanda sonuna yalnız tack onlara had. Təmiz proqram I yaradılmış bir silly az proqramı ki, yığın haqqında ints blokunun üçün yer ayırıb bəzi dəyərləri onların daxili qoymaq, bütün məhəllə kurtarır. Bu səhvlər və sızmalar, heç üçün çəkiliş etdiyiniz budur. Digər mühüm metrik ayrılmış bytes ümumi sayı dir. Sizin daxilolmaların isə megabayt və ya daha yüksək olduqda, proqram asılı olaraq, bəlkə səhv bir şey edirik. Siz lazımsız dublikatları saxlanılması edirmi? Bu yığını istifadə etmək daha yaxşı olardı zaman, saxlanması üçün yığın istifadə edirsiniz? Belə ki, yaddaş səhvlər həqiqətən pis ola bilər. Daha açıq olanlar, möhtəşəm qəzaları səbəb hətta sonra hələ yerini ağır ola bilər nə dəqiq qəza səbəb oldu. Yaddaş səhv ilə daha qərəzlə, bir proqram hələ cleanly tərtib edə bilərsiniz və hələ də düzgün iş görünə bilər siz çox vaxt uğurlu almaq üçün idarə, çünki. Bir neçə sonra "uğurlu nəticələr" Siz yalnız bir qəza kompüter bir fluke hesab edir ki, ola bilər lakin kompüter yanlış heç vaxt. Valgrind Running siz görünən yaddaş səhvlər səbəb aşağı izlemek kömək edə bilər habelə səhvlər lurking tapmaq kimi hətta hələ bilmirəm. Valgrind bir problem algılar Hər dəfə, o, müşahidə nə haqqında məlumat görüntüler. Hər bir maddə ədalətli yığcam deyil - etmiş təlimatı mənbə xətt, məsələ nədir, cəlb yaddaş və bir az info - lakin tez-tez sağ yer üçün diqqət yönəltmək üçün kifayət qədər məlumat var. Burada arabası proqram çalışan Valgrind nümunəsidir ki, yığın yaddaş yalnış oxu yoxdur. Biz tərtib heç bir səhv və ya xəbərdarlıq oldu. Ah-oh, səhv xülasə iki səhvlər var ki, deyir - ölçüsü 4 iki etibarsız okuma - bytes olmasıdır. Hər iki pis invalid_read.c əsas funksiyası meydana oxuyur line 16 və line 19 ikinci ilk. Nin kodu baxaq. Printf bizim yaddaş blokunun sonu son bir int oxumaq üçün çalışır, ilk zəng kimi görünür. Biz Valgrind çıktı geri baxsaq, biz Valgrind məhz bizə bildirib ki, görürük. Biz oxumaq çalışdığınız ünvan 0 bayt başlayır - ölçüsü 16 bayt blokunun sonunda keçmiş biz ayrılan dörd 32-bit ints. Yəni, biz oxumaq çalışır ünvanı, sağ bizim blokunun sonunda başlayır biz pis printf zəng görmək kimi. İndi etibarsız okuma, bir əqdin böyük kimi görünə bilər ancaq proqram axını nəzarət məlumatlar kullanıyorsanız - Məsələn, bir hissəsi kimi, bəyanat və ya loop - sonra şeyi səssizcə pis bilərsiniz. Mən invalid_read proqram çalıştırabilirsiniz necə Watch və adi bir şey həyata olur. Scary, ha? İndi isə sizin kodu qarşılaşa bilər ki, səhvlər bir çox növ baxaq və biz onları algılar necə Valgrind görəcəksiniz. Biz yalnız bir invalid_read nümunə gördüm İndi nin bir invalid_write kontrol imkan verir. Yenə tərtib heç bir səhv və ya xəbərdarlıq. OK, Valgrind Bu proqram iki səhvlər var ki, deyir - və invalid_write və invalid_read. Bu kodu kontrol edək. Biz klassik strlen plus bir səhv bir misal var kimi görünür. Kodu malloc yer əlavə byte deyil də / 0 karakter üçün, belə küç surəti ssubstrlen onu yazmaq üçün getdiyi "cs50 rocks!" bizim blok sonunda keçmiş 1 byte yazdı. Biz printf üçün zəng zaman invalid_read gəlir. Bu / 0 xarakter deyilir zaman Printf etibarsız yaddaş oxu başa Bu E simli sonunda görünür kimi çap edir. Amma bu heç Valgrind qaçdı. Biz küç surəti hissəsi kimi bu invalid_write tutdu ki əsas xətti, 11 və invalid_read printf hissəsidir. Valgrind üzrə Rock. Yenə bu bir böyük kimi görünə bilər. Biz Valgrind kənarda üzərində bu proqram çalıştırabilirsiniz və hər hansı bir səhv əlamətləri görmür. Lakin, bax bu bir az variasiya baxaq necə şeylər həqiqətən pis əldə edə bilərsiniz. Belə ki, verilmiş, bu kodu yalnız bir az daha çox şeylər sui-istifadə olunur. Biz yalnız iki strings üçün yığın yer ayrılması edirik cs50 süxurların uzunluğu, bu dəfə / 0 xarakter xatırlayaraq. Amma sonra biz yaddaş blok bir super-uzun string atmaq S işarə edir. Hansı təsiri yaddaş blokunda olacaq ki, T bal? Yaxşı, əgər S yalnız qonşu olan yaddaş T xal, yalnız sonra gələn, sonra biz T. hissəsi üzərində yazılı ola bilər Bu kodu run edək. Nə oldu. Biz yığın blokları, həm də saxlanılan strings düzgün çap ortaya çıxdı. Heç bütün yanlış görünür. Lakin, bizim kodu geri getmək imkan və biz cs50 süxurların surəti olduğu xəttini şərh ikinci yaddaş blok daxil, t ilə işarə etdi. İndi biz bu kodu çalıştırdığınızda biz olmalıdır yalnız ilk yaddaş blokunun məzmunu çap görürük. Whoa, biz küç surəti etmədi baxmayaraq ikinci yığın bloku hər hansı bir simvol, bir, T ilə işarə biz bir çap çıxmaq. Həqiqətən, simli biz ilk blok daxil doldurulmuş ilk blok və ikinci blok daxil overran hər şey normal görünür edir. Valgrind, baxmayaraq ki, bizim əsl hekayə deyir. Biz də gedin. O etibarsız Bütün oxuyur və yazır. Səhvi başqa cür nümunə baxaq. Burada olduqca uğursuz bir şey yoxdur. Biz, yığın bir int üçün yer qapmaq p - - Bu yer qeyd etmək və bir int göstərici başlamaq. Lakin, pointer başlatılmış isə, ona işarə edir ki, data yalnız yığın ki hissəsində nə junk edir. Beləliklə, biz int i o data yük zaman, biz texniki, i başlamaq lakin biz junk data ilə bunu. Zəng lazımlı ayıklama makro olan qorumağa ən tutarlı adına iddia kitabxana müəyyən, abort öz test vəziyyəti uğursuz proqramı olacaq. I 0 deyilsə ki,. Yığın məkanında nə asılı olaraq, p ilə işarə Bu proqram bəzən iş və digər vaxtlarda uğursuz ola bilər. Işləyir, biz yalnız uğurlu əldə edirik. Bu compiler bu səhv tutmaq, lakin əmin iradəsi Valgrind deyil. Var ki, junk data bizim istifadə irəli gələn səhv oldu. Siz yığın yaddaş ayrılması ancaq bu deallocate və ya azad olmayan zaman, ki, baş adlanır. Çıxışları çalışır və dərhal bir kiçik, qısa müddətli proqram üçün, sızması kifayət qədər zərərsiz, lakin daha böyük ölçüsü və / və ya uzunömürlülük bir layihə üçün hətta kiçik sızma böyük bir şey mürəkkəb bilər. CS50, biz sizə gözləyirsiniz siz ayırırlar yığın yaddaş bütün azad qayğı, sizə əl prosesi düzgün idarə etmək bacarıqları qurmaq istəyirik ildən C. tələb Bunu etmək üçün, proqram bir dəqiq olmalıdır malloc və pulsuz zənglər arasında birə-bir qiyabi. Xoşbəxtlikdən, Valgrind çox yaddaş sızıntıları sizə kömək edə bilər. Burada leak.c adlı leaky proqram ki ayırıb yığın yer, o yazır, lakin bu, azad deyil. Biz olun və Valgrind altında run ilə tərtib və biz görürük ki, biz yaddaş səhvlər yoxdur isə ki, biz bir qaçaq var. Mütləq itirilmiş 16 bytes var proqramı tərk zaman xatirəsinə göstərici daxilində deyil yəni. İndi Valgrind, bizə sızması haqqında məlumat ton vermir lakin biz onun hesabat alt tərəf aşağı verir ki, bu kiçik qeyd edin əgər ilə təkrar üçün - sızması kontrol = tam sızdırılan yaddaş tam görmek üçün, Daha çox məlumat almaq lazımdır. İndi, yığın xülasəylə Itirilmiş ki, yaddaş ilkin ayrılıb yerləşir Valgrind bizə deyir. Biz mənbə axtarır bilmək kimi, Valgrind biz yaddaş sızan bizə məlumat leak.c xətti 8 malloc zəng ilə ayrılan əsas funksiyası. Pretty uykusuz. Valgrind bu şərtləri istifadə sızması kateqoriyalara: Əlbəttə itirdi - Bu yığın ayrılmış yaddaş olan proqram artıq bir göstərici var. Valgrind siz bir göstərici idi, lakin, çünki takip itirmişdir bilir. Bu yaddaş mütləq əks olunur. Dolayı itirilmiş - Bu yığın ayrılmış yaddaş bu yeganə göstəricilərinə də itirilmiş olunur. Məsələn, bir bağlı siyahısında ilk node üçün pointer itirilmiş əgər, sonra ilk node özü, mütləq itirilmiş olacaq sonrakı qovşaqlarının dolayı itirilmiş olacaq edir. Ola bilsin itirdi - Bu yığın ayrılmış yaddaş olan Valgrind bir göstərici və ya olub-olmadığını əmin ola bilməz. Hələ müyəssər yığın ayrılmış yaddaş proqram hələ exit bir göstərici var olan, hansı adətən o deməkdir ki, bu qlobal dəyişən xal. Bu sızıntıları kontrol üçün, siz də seçimi daxil olacaq - Hələ müyəssər = yes Valgrind sizin sehr edir. Bu müxtəlif hallarda, onların təmizlənməsi üçün müxtəlif strategiyalar tələb edə bilər lakin sızmalar aradan qaldırılmalıdır. Təəssüf ki, sızması təyinat etmək çətin ola bilər pulsuz yanlış zənglər proqram partlatmaq bilər-ci ildən. Məsələn, biz invalid_free.c baxsaq, biz pis yaddaş deallocation bir nümunə oldu. Bütün blok azad bir zəng olmalıdır nə yaddaş, int_block ilə işarə əvəzinə hər int ölçülü bölmə azad cəhdi olmuşdur fərdi yaddaş. Bu katastrofik bilməyəcəyik. Boom! Hansı bir səhv. Bu, mütləq yaxşı deyil. Hata bu cür ilə vurulmuş edirik, baxmayaraq ki, siz, harada baxmaq bilmirəm yeni yaxşı dost geri düşür. Siz guessed - Valgrind. Valgrind, həmişə olduğu kimi, qədər dəqiq bilir. Bu alloc və pulsuz sayar uyğun deyil. Biz 1 alloc və 4 kurtarır var. Və Valgrind də olduğu ilk pis pulsuz bizə deyir - bu infilak tətikləyən bir - gələn - line 16. Gördüyünüz kimi, azad pis zənglər, həqiqətən pis biz proqram sızması imkan gəlir Siz funksionallığı doğru almaq üçün çalışırıq isə. Proqram düzgün iş yalnız sonra sızması axtarır başlamaq, hər hansı digər səhvlər olmadan. Və biz bu video üçün var hamısı. İndi nə gözləyir? İndi proqramları Valgrind run gedin. My name Nate Hardison edir. Bu CS50 edir. [CS50.TV]