[Powered by Google Translate] [Valgrind] [நேட் Hardison, ஹார்வர்ட் பல்கலைக்கழகம்] இந்த CS50.TV, CS50 உள்ளது] சி திட்டங்கள் மிகவும் கடினம் பிழைகள் சில நினைவகம் தவறாக வரும். பொருட்களை திருகு வழிகளை ஒரு பெரும் எண்ணிக்கையிலான உள்ளன நினைவகம் தவறான அளவு ஒதுக்கீடு உட்பட, மாறிகள் துவக்க மறந்து, இடையக இறுதிக்குள் அல்லது பிறகு எழுதி, மற்றும் நினைவக பல முறை வைத்து பெறலாம். அறிகுறிகள் இடைவிட்டு விபத்துக்கள் வரை மர்மமான முறையில் மறைந்து மதிப்புகளுக்கு, பெரும்பாலும் இதுவரை அசல் பிழை நீக்கப்பட்டது இடங்கள் மற்றும் நேரங்களில். அடிப்படை காரணத்தை மீண்டும் கண்டுபிடிக்கப்பட்ட பிரச்சனை தடமறிவதை சவால், ஆனால் அதிர்ஷ்டவசமாக Valgrind என்று ஒரு பயனுள்ளதாக திட்டம் இல்லை என்று உதவி செய்ய நிறைய செய்ய முடியும். நீங்கள் செயல்படுத்த Valgrind கீழ் ஒரு நிரலை இயக்க நினைவகத்தை குவிக்கும் ஒதுக்கீடுகள் மற்றும் அணுகல்கள் விரிவான சோதனை. Valgrind ஒரு பிரச்சினை கண்டறிந்து போது, அது, நீங்கள் உடனடியாக கொடுக்கிறது நீங்கள் அனுமதிக்கும் நேரடி தகவல் மேலும் எளிதாக கண்டுபிடித்து சிக்கல். , மேலும் குறைந்த ஆபத்தான நினைவக பிரச்சினைகளை அறிக்கைகள் Valgrind இத்தகைய நினைவக கசிவை என, நினைவகத்தை குவிக்கும் ஒதுக்கீடு, அதை விடுவிக்க மறந்து. எங்கள் வழு நம் மொழி, கணகண வென்ற சப்தம், GDB, போன்ற Valgrind இலவச மென்பொருள் ஆகும், அது பயன்பாட்டிற்கான நிறுவப்பட்டுள்ளது. Valgrind, உங்கள் பைனரி இயங்கக்கூடிய இயங்கும் உங்கள். கேட்ச் அல்லது. ம மூல குறியீடு கோப்புகள், எனவே நீங்கள் உங்கள் திட்டத்தின் ஒரு வரை தேதி நகல் தொகுக்கப்பட்ட வேண்டும் என்பதை உறுதி கணகண வென்ற சப்தம் பயன்படுத்தி அல்லது கொள்ளுங்கள். பின்னர், Valgrind கீழ் உங்கள் இயங்குவதாக இருக்க முடியும் வெறும் வார்த்தை Valgrind கூடிய நிலையான திட்டம் கட்டளை prefixing போன்ற எளிய, இது Valgrind தொடங்கும் மற்றும் அது உள்ளே நிரலை இயக்கும். ஆரம்ப போது, Valgrind சில சிக்கலான இல்லை நினைவக காசோலைகளுக்கு இயங்கக்கூடிய கட்டமைக்க jiggering, அது எழுந்து ஓடி ஒரு பிட் எடுத்து கொள்ளலாம். நிரல் பின்னர், மிக மெதுவாக, பொதுவாக இயக்க அது முடியாது அதை முடித்த போது, Valgrind அதன் நினைவக பயன்பாடு ஒரு சுருக்கம் அச்சிட வேண்டும். எல்லாம் நன்றாக நடந்தால், அதை இந்த மாதிரி ஏதாவது இருக்கும்: இந்த வழக்கில்,. / Clean_program நான் இயக்க வேண்டும் திட்டம் பாதையாகும். இந்த ஒரு விவாதம் தேவையில்லை போது, அதை செய்தால் நான் வழக்கம் போல் கட்டளை முடிவுக்கு மட்டும் பிசுப்பு அவர்கள் விட்டோம். சுத்தமான திட்டத்தை நான் உருவாக்கிய ஒரு சிறு சிறு நிரல் என்று, குவியல் மீது ints ஒரு தொகுதி இடைவெளி ஒதுக்கீடு சில மதிப்புகள் அவர்கள் உள்ளே வைத்து, மற்றும் முழு தொகுதி வெறுமையாக்கப்படுகிறது. இந்த பிழைகள் மற்றும் கசிவை இல்லை, படப்பிடிப்பு என்ன ஆகும். மற்றொரு முக்கியமான மெட்ரிக் ஒதுக்கீடு பைட்டுகள் மொத்த எண்ணிக்கை ஆகும். உங்கள் ஒதுக்கீடுகள் மெகாபைட் அல்லது அதிகம் உள்ளன என்றால், நிரல் பொறுத்து, ஒருவேளை நீங்கள் தவறு செய்கிறீர்கள். நீங்கள் அனாவசியமாக பிரதிகளை சேமித்து? இது ஸ்டேக் பயன்படுத்த நன்றாக இருக்கும் போது, சேமிப்பு குவியல் பயன்படுத்தும்? எனவே, நினைவக பிழைகள் உண்மையில் தீய முடியும். மேலும் வெளிப்படையான ஒருவர், கண்கவர் மோதல்கள் காரணமாக ஆனால் கூட அது இன்னும் காட்ட கடுமையாக இருக்க முடியும் சரியாக விபத்தில் வழிவகுத்தது. ஒரு நினைவக பிழை இன்னும் மெல்ல, ஒரு திட்டம் இன்னும் தெளிவாக தொகுக்க முடியும் இன்னும் சரியாக வேலை செய்ய காணலாம் நீங்கள் நேரம் மிகவும் அதிர்ஷ்டம் பெற நிர்வகிக்கப்படும் ஏனெனில். பல பிறகு "வெற்றிகரமான முடிவுகளை," நீங்கள், ஒரு விபத்தில் கணினி ஒரு தட்டைப்புழு என்று நினைக்கலாம் ஆனால் கணினி தவறு ஆகும். Valgrind இயங்கும் நீங்கள் காணக்கூடிய நினைவக பிழைகள் காரணம் கண்டறிய உதவும் அத்துடன் பிழைகள் லூர்கிங் காண நீங்கள் இன்னும் பற்றி தெரியாது. Valgrind ஒரு பிரச்சினை கண்டறிந்து ஒவ்வொரு முறையும், அது அனுசரிக்கப்பட்டது பற்றி தகவல் அச்சிடுகிறது. ஒவ்வொரு உருப்படியை மிகவும் ஒழுங்கான இல்லை - குற்றமிழைக்கும் வழிமுறை மூலம் வரி, பிரச்சினை என்ன, இதில் நினைவாற்றல் பற்றி ஒரு சிறு தகவல் - ஆனால் பெரும்பாலும் அது சரியான இடத்தில் உங்கள் கவனத்தை ஈர்க்க போதுமான தகவல் இல்லை. இங்கே ஒரு தரமற்ற திட்டம் இயங்கும் Valgrind ஒரு உதாரணம் அந்த குவியல் நினைவகம் ஒரு தவறான வாசிக்க செய்கிறது. நாம் தொகுப்பு எந்த பிழைகள் அல்லது எச்சரிக்கைகள் பார்க்க. பத்திதான் ஓ, பிழை சுருக்கம் இரண்டு பிழைகள் உள்ளன என்று - அளவு 4 இரண்டு தவறான புத்தகங்கள் - பைட்டுகள், என்று. இரண்டு மோசமான, invalid_read.c முக்கிய செயல்பாடு ஏற்பட்டது படிக்கிறார் வரி 16 மற்றும் வரி 19 இரண்டாவது முதல். இந்த குறியீடு பார்க்கிறேன். Printf நம் நினைவகம் தொகுதி முடிவு கடந்த ஒரு எண்ணாக வாசிக்க முயற்சிக்கும் முதல் அழைப்பு தெரிகிறது. நாம் Valgrind வெளியீட்டு வந்து பார், என்றால் நாம் Valgrind சரியாக சொன்னாள் என்று. நாம் வாசிக்க முயற்சிக்கும் முகவரியை 0 பைட்டுகள் தொடங்குகிறது - அளவு 16 பைட்டுகள் தொகுதி முடிவு கடந்த நாம் ஒதுக்கப்பட்ட நான்கு 32 பிட் ints. என்று, நாங்கள் படிக்க முயற்சி முகவரி, சரியான எங்கள் தொகுதி இறுதியில் தொடங்குகிறது நாம் மோசமான printf அழைப்பு பார்க்க போல். இப்போது, தவறான புத்தகங்கள், ஒரு ஒப்பந்தம் என்று பெரிய போல் தெரியவில்லை என்று ஆனால் நீங்கள் உங்கள் நிரல் ஓட்டத்தை கட்டுப்படுத்த தரவு பயன்படுத்தி என்றால் - உதாரணமாக, ஒரு பகுதியாக இருந்தால் அறிக்கை அல்லது கண்ணி - பின்னர் விஷயங்கள் அமைதியாக மோசமான போக முடியும். நான் invalid_read நிரலை எப்படி பார்க்க சாதாரண எதுவும் வெளியே நடக்கும். பயங்கரமான, இல்லையா? இப்போது, நீங்கள் உங்கள் குறியீடு உள்ள எதிர்கொள்ளும் என்று பிழைகளை இன்னும் சில வகையான பார்த்து விட்டு மற்றும் நாம் அவற்றை கண்டறிந்து எப்படி Valgrind பார்க்கிறேன். நாம் மட்டும், ஒரு invalid_read ஒரு எடுத்துக்காட்டாக பார்த்தேன் எனவே இப்போது ஒரு invalid_write வெளியே பார்க்கிறேன். மீண்டும், தொகுப்பு எந்த பிழைகள் அல்லது எச்சரிக்கைகள். சரி, Valgrind இந்த திட்டம் இரண்டு பிழைகள் உள்ளன என்று - மற்றும் invalid_write மற்றும் ஒரு invalid_read. இந்த குறியீடு வெளியே பார்க்கிறேன். நாம் சிறந்த strlen கூடுதலாக ஒரு பிழை ஒரு உதாரணமாக கிடைத்தது போல். குறியீடு malloc இடத்தை கூடுதல் பைட் இல்லை / 0 கதாபாத்திரத்தை, எனவே str நகல் ssubstrlen அதை எழுதும் போது "cs50 பாறைகள்!" எங்கள் தொகுதி முடிவு கடந்த 1 பைட் எழுதினார். நாம் printf எங்கள் அழைப்பை போது invalid_read வருகிறது. இது / 0 தன்மையை படிக்கும் போது Printf தவறான நினைவக படித்து நிறைவடைகிறது இந்த மின் சரம் முடிவில் தெரிகிறது அதை அச்சிடும் தான். ஆனால் இந்த எந்த Valgrind தப்பினார். நாம் str நகல் பகுதியாக இது invalid_write பிடித்து பார்க்க முக்கிய வரிசையில் 11, மற்றும் invalid_read printf பகுதியாக உள்ளது. Valgrind, ராக். மீண்டும், இந்த ஒரு பெரிய ஒப்பந்தம் போன்ற தெரியவில்லை என்று. நாம் Valgrind வெளியே மேல் இந்த நிரலை இயக்க முடியும் எந்த பிழை அறிகுறிகள் பார்க்க. எனினும், பார்க்க இந்த ஒரு சிறிய மாற்றம் பார்க்க போகலாம் எப்படி விஷயங்கள் மிகவும் மோசமான பெற முடியும். எனவே, வழங்கப்படும், நாம் இந்த குறியீடு தான் ஒரு பிட் விட விஷயங்கள் தவறாக உள்ளன. நாம் இரண்டு சரங்களுக்கான குவியல் இடத்தை ஒதுக்கீடு cs50 பாறைகள் நீளம், இந்த நேரத்தில், / 0 தன்மை நினைவு. ஆனால் நாம் நினைவு தொகுதி ஒரு சூப்பர் நீண்ட சரம் இல் தூக்கி என்று எஸ் சுட்டி காட்டியது. என்ன விளைவு நினைவக தொகுதி மீது வேண்டும் என்று அந்த டி புள்ளிகள்? நன்றாக, S வெறும் அருகில் என்று நினைவக டி புள்ளிகள், அதை பிறகு வரும், நாம் டி பகுதியாக மீது எழுதப்பட்ட இந்த குறியீடு ஓடிப்போகட்டும். என்ன நடந்தது பாருங்கள். நாம் குவியல் தொகுதிகள் இரண்டு சேமிக்கப்படும் சரங்களை சரியாக அச்சு வேண்டும் தோன்றினார். ஒன்றும் தவறு இல்லை. எனினும், நமது குறியீடு மீண்டும் செல்லலாம் மற்றும் நாம் cs50 பாறைகள் நகலெடுக்க அங்கு வரி அவுட் கருத்து இரண்டாவது நினைவு தொகுப்பு கொண்டு, t மூலம் சுட்டிக்காட்டினார். இப்போது, நாம் இந்த குறியீடு ரன் போது நாம் வேண்டும் முதல் நினைவு தொகுதி உள்ளடக்கங்களை அச்சிட பார்க்க. ஓ, நாம் str நகல் கூட இரண்டாவது குவியல் தொகுதி எந்த கதாபாத்திரங்கள், ஒரு, டீ சுட்டிக்காட்டினார் நாம் ஒரு அச்சு வெளியே. உண்மையில், சரம் நாம் முதல் தொகுதி என்ற அடைத்த முதல் தொகுதி மற்றும் இரண்டாவது தொகுதி வந்து, overran எல்லாம் சரியாக உள்ளது செய்யும். Valgrind, எனினும், நாம் உண்மையான கதையை சொல்கிறது. அங்கு நாம். அந்த தவறான அனைத்து எழுதுதல் மற்றும். அது பிழை மற்றொரு வகையான ஒரு எடுத்துக்காட்டாக பார்க்கிறேன். இங்கே நாம் மாறாக துரதிருஷ்டவசமான ஏதாவது. நாம், குவியல் மீது ஒரு முழு எண்ணாக இடத்தை கைப்பற்றி ப - - அந்த இடத்தில் சுட்டிக்காட்ட நாம் ஒரு முழு எண்ணாக சுட்டிக்காட்டி துவக்க. எனினும், எங்கள் சுட்டிக்காட்டி துவக்கப்படும் போது, அதை சுட்டி காட்டும் என்று தரவு தான் குவியல் என்று பகுதியில் என்ன குப்பை உள்ளது. நாம் எண்ணாக நான் அந்த தரவு ஏற்ற போது, நாம் தொழில்நுட்ப, நான் துவக்க ஆனால் நாம் குப்பை தரவு அவ்வாறு. அழைப்பு எளிது பிழைத்திருத்தங்களுக்கும் மேக்ரோ என்பது, உறுதிப்படுத்த பொருத்தமாக என்ற உறுதி நூலகத்தில் வரையறுக்கப்பட்ட, கலைக்க அதன் சோதனை நிலையில் தவறினால் திட்டம் சாப்பிடுவேன். நான் 0 என்றால் அந்த உள்ளது. குவியல் இடைவெளி இருந்தது என்பதை பொறுத்து,, ப சுட்டிக்காட்டினார் இந்த திட்டம் சில நேரங்களில் வேலை மற்றும் பிற நேரங்களில் செயலிழக்க செய்யலாம். அது வேலை செய்தால், நாம் தான் அதிர்ஷ்டம் கிடைக்கிறது. தொகுப்பி இந்த பிழை பிடிக்க, ஆனால் நிச்சயமாக Valgrind மாட்டேன். அங்கு நாம் குப்பை தரவு நம் பயன்பாட்டில் இருந்து வளம் பிழை பார்க்க. நீங்கள் குவியல் நினைவகத்தை ஒதுக்க ஆனால் அது deallocate அல்லது அதை விடுவிக்க இல்லாத போது, ஒரு கசிவு எனப்படுகிறது. வெளியேறும் இயங்கும் உடனடியாக ஒரு சிறிய, குறுகிய திட்டத்தை, கசிவை மிகவும் பாதிப்பில்லாத இருக்கும், ஆனால் பெரிய அளவு மற்றும் / அல்லது நீண்ட ஒரு திட்டத்திற்கு, கூட ஒரு சிறிய கசிவு முக்கிய ஏதாவது கலந்திணையலாம். CS50 செய்ய, நீங்கள் எதிர்பார்க்க நீங்கள் ஒதுக்க என்று நினைவகத்தை குவிக்கும் அனைத்து பெறலாம் கவனித்து, நீங்கள் கைமுறை செயல்பாடு சரியாக கையாள திறன்களை உருவாக்க வேண்டும் இருந்து சி தேவைப்படுகிறது அவ்வாறு செய்ய, உங்கள் திட்டத்தை ஒரு துல்லியமான வேண்டும் malloc மற்றும் இலவச அழைப்புகளை இடையே ஒருவருக்கு ஒருவர் கடித. அதிர்ஷ்டவசமாக, Valgrind கூட நினைவு கசிவுகள் உங்களுக்கு உதவ முடியும். இங்கே leak.c என்று ஒரு கசியும் திட்டம் என்று தொண்டு குவியல் இடத்தை, அது எழுதுகிறார், ஆனால் அது விடுதலை இல்லை. நாம், மேக் மற்றும் Valgrind கீழ் இயங்கும் அதை தொகுக்க மற்றும் நாம் பார்க்க, நாம் நினைவக பிழைகள் இல்லை இல்லை போது, அந்த நாம் ஒரு கசிவு இல்லை. நிச்சயமாக இழந்து 16 பைட்டுகள் உள்ளன நிரல் வெளியேறிவிட்டது போது நினைவக சுட்டிக்காட்டி நோக்கம் இல்லை என்று பொருள். இப்போது, Valgrind, எங்களுக்கு கசிவு பற்றிய தகவல்களை ஒரு டன் கொடுக்க முடியாது ஆனால் நாம் அதை அதன் அறிக்கை கீழே நோக்கி கீழே கொடுக்கிறது என்று இந்த சிறிய குறிப்பு பின்பற்ற வேண்டும் உடன் மீண்டும் இயக்கவும் முதல் - கசிவு சரிபார்த்து = முழு கசியவிடப்பட்ட நினைவகம் முழு விவரங்களை காண, நாம் இன்னும் தகவல் கிடைக்கும். இப்போது, குவியல் சுருக்கம் உள்ள, இழந்த அந்த நினைவு ஆரம்பத்தில் ஒதுக்கீடு அங்கு Valgrind நமக்கு சொல்கிறது. நாம் மூல குறியீடு தேடும் இருந்து மட்டும் தான் தெரியும் போல, Valgrind நாம் நினைவு கசிந்தது என்று எங்களுக்கு தகவல் leak.c வரிசையில் 8 malloc ஒரு அழைப்பு ஒதுக்கீடு முக்கிய செயல்பாடு. Pretty நாகரீகமான. Valgrind இந்த விதிமுறைகளை பயன்படுத்தி கசிவை வகைப்படுத்தும்: நிச்சயமாக இழந்தது - இந்த குவியல் ஒதுக்கீடு நினைவு இது நிரல் இனி ஒரு சுட்டிக்காட்டி உள்ளது. Valgrind நீங்கள் ஒருமுறை சுட்டிக்காட்டி, ஆனால் பின்னர் அது போனதே என்று தெரிகிறது. இந்த நினைவகம் நிச்சயமாக கசிந்தது. மறைமுகமாக இழந்தது - இந்த குவியல் ஒதுக்கீடு நினைவு இது மட்டுமே சுட்டிகள் மேலும் இழந்தது. உதாரணமாக, நீங்கள் ஒரு இணைக்கப்பட்ட பட்டியலில் முதல் முனை உங்கள் சுட்டிக்காட்டி இழந்து விட்டால், பின்னர் முதல் முனை தன்னை நிச்சயமாக, இழந்தது பின்னர் முனைகள் மறைமுகமாக இழந்த போது. ஒருவேளை இழந்து - இந்த குவியல் ஒதுக்கீடு நினைவு எந்த Valgrind ஒரு சுட்டிக்காட்டி அல்லது இல்லை என்பதை உறுதியாக இருக்க முடியாது. இன்னும் எடுக்கவில்லை குவியல் ஒதுக்கீடு நினைவு நிரல் இன்னும் வெளியேறவும் ஒரு சுட்டிக்காட்டி கொண்டிருக்கும் வரை, இது பொதுவாக, அதாவது இது ஒரு உலகளாவிய மாறி புள்ளிகள். இந்த கசிவுகள் சரி பார்க்கிறது, நீங்கள் விருப்பத்தை சேர்க்க வேண்டும் - இன்னும் எடுக்கவில்லை = ஆம் Valgrind உங்கள் பிரார்த்தனையுடன் உள்ள. இந்த வெவ்வேறு சந்தர்ப்பங்களில், அவர்களை சுத்தம் வெவ்வேறு உத்திகளை தேவைப்படும் ஆனால் கசிவை அழிக்கப்பட வேண்டும். துரதிருஷ்டவசமாக, கசிவை சரிசெய்ய, செய்ய கடினமாக இருக்கும் இலவச தவறான அழைப்புகள் உங்கள் நிரல் கொட்ட முடியும் என்பதால். உதாரணமாக, நாம் invalid_free.c பார் என்றால், நாம் மோசமான நினைவக ஒதுக்கீடு விடுத்தல் ஒரு உதாரணம் பார்க்கலாம். முழு தொகுதி விடுவிக்க ஒரு அழைப்பு இருக்க வேண்டும் என்ன நினைவகம், int_block மூலம் சுட்டிக்காட்டினார் அதற்கு பதிலாக ஒவ்வொரு எண்ணாக அளவிலான பகுதியை விடுவிக்க முயற்சி மாறிவிட்டது தனிப்பட்ட நினைவகம். இந்த துரதிருஷ்டவசமான செயலிழக்கும் செய்யும். பூரிப்பு! என்ன பிழை. இந்த நிச்சயம் நல்லதல்ல. நீங்கள் பிழை இந்த வகையான மாட்டிக்கொண்டிருக்கிறோம், என்றாலும், மற்றும் நீ, அங்கு பார்க்க தெரியவில்லை எனில் உங்கள் புதிய சிறந்த நண்பர் மீண்டும் வீழ்ச்சி. நீங்கள் தேடுவதை - Valgrind. Valgrind, எப்போதும், தான் சரியாக என்ன தெரியும். alloc மற்றும் இலவச எண்ணிக்கை வரை பொருந்தவில்லை. நாம் 1 alloc மற்றும் 4 விடுவிக்கப்படுவார் கிடைத்துவிட்டது. மற்றும் Valgrind கூட அங்கு முதல் கெட்ட இலவச அழைப்பு நமக்கு சொல்கிறது - blowup தூண்டப்படலாம் என்று ஒரு - இருந்து வருகிறது - வரி 16. நீங்கள் பார்க்க போல், விடுவித்து மோசமான அழைப்புகள், மிகவும் மோசமாக உள்ளது எனவே உங்கள் திட்டம் கசிவு விடாமல் நீங்கள் செயல்பாடு சரியான பெற்று பணிபுரிகிறோம் போது. உங்கள் திட்டம் ஒழுங்காக வேலை மட்டுமே பிறகு கசிவை தேட ஆரம்பிக்க, மற்ற பிழைகள் இல்லாமல். என்று நாம் இந்த வீடியோ கிடைத்தது அவ்வளவுதான். இப்போது என்ன காத்திருக்கிறார்கள்? இப்போது உங்கள் திட்டங்களில் Valgrind இயக்க போகும். என் பெயர் நேட் Hardison உள்ளது. இந்த CS50 உள்ளது. [CS50.TV]