[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]