[Powered by Google Translate] [Valgrind]
[ನೇಟ್ Hardison, ಹಾರ್ವರ್ಡ್ ವಿಶ್ವವಿದ್ಯಾಲಯ]
ಈ CS50.TV, CS50 ಹೊಂದಿದೆ]
ಸಿ ಕಾರ್ಯಕ್ರಮಗಳಲ್ಲಿ ಅತ್ಯಂತ ಕಷ್ಟ ದೋಷಗಳನ್ನು ಕೆಲವು
ಮೆಮೊರಿ ಕೆಟ್ಟ ನಿರ್ವಹಣೆ ಬರುತ್ತವೆ.
ವಿಷಯಗಳನ್ನು ಅಪ್ ತಿರುಗಿಸಲು ವಿಧಾನಗಳಲ್ಲಿ ಒಂದು ಬೃಹತ್ ಸಂಖ್ಯೆಯ, ಇವೆ
ಮೆಮೊರಿ ತಪ್ಪು ಪ್ರಮಾಣವನ್ನು ಹಂಚುತ್ತಾರೆ ಸೇರಿದಂತೆ,
ಅಸ್ಥಿರ ಆರಂಭಿಸಲು ಮರೆತಿದ್ದ
ಒಂದು ಬಫರ್ ಕೊನೆಯಲ್ಲಿ ಮೊದಲು ಅಥವಾ ನಂತರ ಬರೆಯುವ,
ಮತ್ತು ಮೆಮೊರಿ ಬಹು ಬಾರಿ ಇರಿಸಿಕೊಳ್ಳಲು ಮುಕ್ತಗೊಳಿಸಿತು.
ಲಕ್ಷಣಗಳು ಮರುಕಳಿಸುವ ಕುಸಿತಗೊಂಡಾಗ ಹಿಡಿದು
ನಿಗೂಢವಾಗಿ ಬರೆಯಲ್ಪಟ್ಟಿತೆಂದರೆ ಮೌಲ್ಯಗಳಿಗೆ,
ಸಾಮಾನ್ಯವಾಗಿ ದೂರದ ಮೂಲ ದೋಷ ತೆಗೆದುಹಾಕಲಾಗಿದೆ ಸ್ಥಳಗಳು ಮತ್ತು ಸಮಯದಲ್ಲಿ.
ಆಧಾರವಾಗಿರುವ ಮೂಲ ಕಾರಣ ಮತ್ತೆ ಗಮನಿಸಿದ ಸಮಸ್ಯೆ ಟ್ರೇಸಿಂಗ್
ಸವಾಲು ಮಾಡಬಹುದು,
ಆದರೆ ಅದೃಷ್ಟವಶಾತ್ Valgrind ಎಂಬ ಉಪಯುಕ್ತ ಪ್ರೋಗ್ರಾಂ ಇಲ್ಲ
ಎಂದು ಸಹಾಯ ಮಾಡಲು ಸಾಕಷ್ಟು ಮಾಡಬಹುದು.
>> ನೀವು ಸಕ್ರಿಯಗೊಳಿಸಲು Valgrind ಅಡಿಯಲ್ಲಿ ಒಂದು ಪ್ರೋಗ್ರಾಂ
ರಾಶಿ ಮೆಮೊರಿಯ ಹಂಚುವಿಕೆಯು ಮತ್ತು ಆಕ್ಸೆಸ್ಗಳ ವ್ಯಾಪಕ ತಪಾಸಣೆ.
Valgrind ಸಮಸ್ಯೆ ಪತ್ತೆ ಮಾಡಿದಾಗ, ಅದನ್ನು ನೀವು ತಕ್ಷಣ ನೀಡುತ್ತದೆ
ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ ನೇರ ಮಾಹಿತಿ
ಸುಲಭವಾಗಿ ಹುಡುಕಲು ಮತ್ತು ತೊಂದರೆಯನ್ನು ಪರಿಹರಿಸಬಹುದು.
, ಕಡಿಮೆ ಪ್ರಾಣಾಂತಿಕ ಸ್ಮರಣೆ ಸಮಸ್ಯೆಗಳ ಮೇಲೆ ವರದಿಗಳನ್ನು Valgrind
ಮೆಮೊರಿ ಸೋರುವಿಕೆ ಮಾಹಿತಿ, ರಾಶಿ ಮೆಮೊರಿ ಹಂಚುತ್ತಾರೆ,
ಮತ್ತು ಮುಕ್ತಗೊಳಿಸಲು ಮರೆತಿದ್ದ.
ನಮ್ಮ ದೋಷಸೂಚಕವು ನಮ್ಮ ಕಂಪೈಲರ್, ಖಣಿಲು, GDB, ಲೈಕ್
Valgrind ಉಚಿತ ಸಾಫ್ಟ್ವೇರ್ ಆಗಿದೆ, ಮತ್ತು ಇದು APPLIANCE ಸ್ಥಾಪಿಸಿದ.
Valgrind, ನಿಮ್ಮ ಯುಗಳ ಕಾರ್ಯಗತಗೊಳ್ಳಬಹುದಾದ ಚಲಿಸುತ್ತದೆ
ನಿಮ್ಮ. ಸಿ ಅಥವಾ. H ಮೂಲ ಕೋಡ್ ಕಡತಗಳನ್ನು,
ಆದ್ದರಿಂದ ನಿಮ್ಮ ಕಾರ್ಯಕ್ರಮದ ಒಂದು ಅಪ್ ಆಧುನಿಕ ಪ್ರತಿಯನ್ನು ಸಂಕಲಿಸಿದ್ದಾನೆ ಮರೆಯಬೇಡಿ
ಖಣಿಲು ಬಳಸಿ ಅಥವಾ ಮಾಡಿ.
ನಂತರ, Valgrind ಅಡಿಯಲ್ಲಿ ನಿಮ್ಮ ಪ್ರೋಗ್ರಾಂ ಚಲಾಯಿತವಾಗುತ್ತಿದೆ ಮಾಡಬಹುದು
ಕೇವಲ ಪದ Valgrind ಪ್ರಮಾಣಿತ ಪ್ರೋಗ್ರಾಂ ಆಜ್ಞೆಯನ್ನು prefixing ಎಂದು ಸರಳ,
ಇದು Valgrind ಅಪ್ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ ಮತ್ತು ಅದರ ಒಳಗೆ ಕಾರ್ಯಕ್ರಮವನ್ನು ನಡೆಸುತ್ತದೆ.
ಪ್ರಾರಂಭವಾಗುತ್ತಿದ್ದಾಗ, Valgrind ಕೆಲವು ಸಂಕೀರ್ಣ ಮಾಡುತ್ತದೆ
ಮೆಮೊರಿ ಚೆಕ್ಗಳಿಗೆ ಕಾರ್ಯಗತಗೊಳ್ಳುವ ಸಂರಚಿಸಲು jiggering,
ಆದ್ದರಿಂದ ಅದನ್ನು ಪಡೆಯಲು ಮತ್ತು ಚಾಲನೆಯಲ್ಲಿರುವ ಒಂದು ಬಿಟ್ ತೆಗೆದುಕೊಳ್ಳಬಹುದು.
ಪ್ರೋಗ್ರಾಂ ನಂತರ, ಹೆಚ್ಚು ನಿಧಾನವಾಗಿ, ಸಾಮಾನ್ಯವಾಗಿ ಕಾರ್ಯರೂಪಕ್ಕೆ ಇದು ಕಾಣಿಸುತ್ತದೆ
ಮತ್ತು ಇದು ಮುಗಿದಾಗ, Valgrind ಅದರ ಮೆಮೊರಿ ಬಳಕೆಯ ಸಾರಾಂಶ ಮುದ್ರಿಸಲು ಕಾಣಿಸುತ್ತದೆ.
ಎಲ್ಲಾ ಚೆನ್ನಾಗಿ ಹೋದರೆ, ಇದು ಸ್ವಲ್ಪ ನೋಡೋಣ:
ಈ ಸಂದರ್ಭದಲ್ಲಿ,. / Clean_program
ನಾನು ಚಲಾಯಿಸಲು ಬಯಸುವ ಪ್ರೋಗ್ರಾಂ ಮಾರ್ಗವನ್ನು ಹೊಂದಿದೆ.
ಮತ್ತು ಇದನ್ನು ಯಾವುದೇ ವಾದಗಳು ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಬೀರದಿದ್ದರೂ,
ಅದನ್ನು ಮಾಡಿದರೆ ನಾನು ಎಂದಿನಂತೆ ಆಜ್ಞೆಯನ್ನು ಕೊನೆಗೆ ಕೇವಲ ಸ್ಪಂದನ ಅವರನ್ನು ಇದ್ದೆ.
ಕ್ಲೀನ್ ಪ್ರೋಗ್ರಾಂ ನಾನು ರಚಿಸಿದ ಒಂದು ಸಿಲ್ಲಿ ಕಡಿಮೆ ಕಾರ್ಯಕ್ರಮ
ಎಂದು, ರಾಶಿ ಮೇಲೆ ints ಒಂದು ಬ್ಲಾಕ್ ಜಾಗ ಗೊತ್ತುಪಡಿಸುತ್ತದೆ
ಕೆಲವು ಮೌಲ್ಯಗಳು ಅವುಗಳಲ್ಲಿ ಒಳಗಿಟ್ಟು, ಮತ್ತು ಇಡೀ ಬ್ಲಾಕ್ ಬಿಡುಗಡೆ.
ನೀವು ದೋಷಗಳನ್ನು ಮತ್ತು ಯಾವುದೇ ಸೋರಿಕೆಯನ್ನು ಯಾವುದೇ, ಚಿತ್ರೀಕರಣವನ್ನು ಏನನ್ನು ಹೊಂದಿದೆ.
>> ಇನ್ನೊಂದು ಮುಖ್ಯವಾದ ಮೆಟ್ರಿಕ್ ನಿಯೋಜಿತವಾದ ಬೈಟ್ಗಳು ಒಟ್ಟು ಸಂಖ್ಯೆ.
ನಿಮ್ಮ ಹಂಚಿಕೆಯು ಮೆಗಾಬೈಟ್ಗಳು ಅಥವಾ ಹೆಚ್ಚಿನ ರಲ್ಲಿ ಇದ್ದರೆ, ಪ್ರೋಗ್ರಾಂ ಅವಲಂಬಿಸಿ,
ನೀವು ಬಹುಶಃ ಏನೋ ಮಾಡುತ್ತಿರುವುದು.
ನೀವು ಅನಗತ್ಯವಾಗಿ ನಕಲುಗಳನ್ನು ಸಂಗ್ರಹಿಸುವ ಮಾಡಲಾಗುತ್ತದೆ?
ಇದು ಸ್ಟಾಕ್ ಬಳಸಲು ಉತ್ತಮ ಎಂದು ನೀವು, ಶೇಖರಣೆ ರಾಶಿ ಬಳಸುತ್ತಿದ್ದರೆ?
ಆದ್ದರಿಂದ, ಮೆಮೊರಿ ದೋಷಗಳನ್ನು ನಿಜವಾದ ದುಷ್ಟ ಮಾಡಬಹುದು.
ಹೆಚ್ಚು ಬಹಿರಂಗವಾದ ಬಿಡಿಗಳು, ಅದ್ಭುತ ಕುಸಿತಗೊಂಡಾಗ ಕಾರಣವಾಗಬಹುದು
ಆದರೆ ಅದು ಇನ್ನೂ ಗುರುತಿಸಲು ಕಷ್ಟ
ಎಂಬುದನ್ನು ಕುಸಿತ ಕಾರಣವಾಯಿತು.
ಒಂದು ಮೆಮೊರಿ ದೋಷ ಹೆಚ್ಚು ದ್ರೋಹದಿಂದ, ಒಂದು ಪ್ರೋಗ್ರಾಂ
ಇನ್ನೂ ಸರಿಯಾಗಿ ಸಂಕಲಿಸಬಲ್ಲ
ಮತ್ತು ಇನ್ನೂ ಸರಿಯಾಗಿ ಕೆಲಸ ಕಾಣಿಸಬಹುದು
ನೀವು ಸಮಯ ಅದೃಷ್ಟ ಪಡೆಯಲು ನಿರ್ವಹಿಸುತ್ತಿದ್ದ ಕಾರಣ.
ಹಲವಾರು ನಂತರ "ಯಶಸ್ವೀ ಫಲಿತಾಂಶಗಳು"
ನೀವು, ಘರ್ಷಣೆಯ ಕಂಪ್ಯೂಟರ್ ಒಂದು ಚಪ್ಪಟೆ ಮೀನು ಎಂದು ಭಾವಿಸುತ್ತೇನೆ ಇರಬಹುದು
ಆದರೆ ಕಂಪ್ಯೂಟರ್ ತಪ್ಪು ಎಂದಿಗೂ.
>> Valgrind ರನ್ನಿಂಗ್ ನೀವು ಕಾಣುವ ಮೆಮೊರಿ ದೋಷಗಳು ಕಾರಣ ಕೆಳಗೆ ಟ್ರ್ಯಾಕ್ ಸಹಾಯ ಮಾಡಬಹುದು
ಹಾಗೆಯೇ ದೋಷಗಳನ್ನು ಸುಪ್ತ ಹೇಗೆ ಎಂದು ನೀವು ಇನ್ನೂ ಬಗ್ಗೆ ಗೊತ್ತಿಲ್ಲ.
Valgrind ಸಮಸ್ಯೆ ಪತ್ತೆ ಪ್ರತಿ ಬಾರಿ, ಇದು ವೀಕ್ಷಿಸಿದ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ತೋರಿಸುತ್ತದೆ.
ಪ್ರತಿ ಐಟಂ ತಕ್ಕಮಟ್ಟಿಗೆ ಸಂಕ್ಷಿಪ್ತ ಹೊಂದಿದೆ -
ಆಕ್ಷೇಪಾರ್ಹ ಬೋಧನೆಯ ಮೂಲ ಲೈನ್, ಏನು ಸಮಸ್ಯೆ,
ಒಳಗೊಂಡಿತ್ತು ಮೆಮೊರಿ ಬಗ್ಗೆ ಮತ್ತು ಸ್ವಲ್ಪ ಮಾಹಿತಿ -
ಆದರೆ ಅದು ಸರಿಯಾದ ಸ್ಥಳಕ್ಕೆ ನಿಮ್ಮ ಗಮನವನ್ನು ನಿರ್ದೇಶಿಸುವ ಸಾಕಷ್ಟು ಮಾಹಿತಿ ಇಲ್ಲಿದೆ.
ಇಲ್ಲಿ ಒಂದು ದೋಷಯುಕ್ತ ಕಾರ್ಯಕ್ರಮದಲ್ಲಿ ಚಾಲನೆಯಲ್ಲಿರುವ Valgrind ಉದಾಹರಣೆ
ಆ ರಾಶಿ ಮೆಮೊರಿ ಅಮಾನ್ಯ ಓದಲು ಮಾಡುತ್ತದೆ.
ನಾವು ಸಂಕಲನ ಯಾವುದೇ ದೋಷಗಳು ಅಥವಾ ಎಚ್ಚರಿಕೆಗಳನ್ನು ನೋಡಿ.
UH-OH, ದೋಷ ಸಾರಾಂಶವನ್ನು ಎರಡು ದೋಷಗಳು ಇವೆ ಹೇಳುತ್ತಾರೆ -
ಗಾತ್ರ 4 ಎರಡು ಅಮಾನ್ಯವಾಗಿದೆ ಬರಹಗಳು - ಬೈಟ್ಗಳು, ಎಂದು.
ಎರಡೂ ಕೆಟ್ಟ, invalid_read.c ಮುಖ್ಯ ಕಾರ್ಯ ನಡೆಯಿತು ಓದುತ್ತದೆ
ಸಾಲಿನ 16 ಮತ್ತು ಸಾಲು 19 ರಂದು ಎರಡನೇ ಪ್ರಥಮ.
ನ ಕೋಡ್ ನೋಡೋಣ.
Printf ನಮ್ಮ ಮೆಮೊರಿ ಬ್ಲಾಕ್ ಕೊನೆಯಲ್ಲಿ ಕಳೆದ ಒಂದು ಇಂಟ್ ಓದಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ ಮೊದಲ ಕರೆ ತೋರುತ್ತಿದೆ.
ನಾವು Valgrind ನ ಉತ್ಪಾದನೆಯಲ್ಲಿ ಹಿಂತಿರುಗಿ ನೋಡಲು, ವೇಳೆ
ನಾವು Valgrind ಖಂಡಿತವಾಗಿಯೂ ನಮಗೆ ಹೇಳಿದ ನೋಡಿ.
ನಾವು ಓದಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ವಿಳಾಸಕ್ಕೆ 0 ಬೈಟ್ಗಳು ಆರಂಭವಾಗುತ್ತದೆ
- ಗಾತ್ರವನ್ನು 16 ಬೈಟ್ಗಳು ಬ್ಲಾಕ್ ಕೊನೆಯಲ್ಲಿ ಹಿಂದೆ
ನಾವು ವಿಂಗಡಿಸುವ ನಾಲ್ಕು 32-ಬಿಟ್ ints.
ಅಂದರೆ, ನಾವು ಓದಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದ ವಿಳಾಸಕ್ಕೆ, ಬಲ ನಮ್ಮ ಬ್ಲಾಕ್ ಕೊನೆಯಲ್ಲಿ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ
ನಮ್ಮ ಕೆಟ್ಟ printf ಕರೆ ಕಾಣುವ ಕೇವಲ ಮಾಹಿತಿ.
ಈಗ ಅಮಾನ್ಯವಾಗಿದೆ ಬರಹಗಳು, ಒಂದು ಒಪ್ಪಂದದ ದೊಡ್ಡ ಹೋಲುವಂತಿದ್ದು ಇರಬಹುದು
ಆದರೆ ನಿಮ್ಮ ಪ್ರೋಗ್ರಾಂ ಹರಿವನ್ನು ನಿಯಂತ್ರಿಸಲು ಡೇಟಾವನ್ನು ಬಳಸುತ್ತಿದ್ದರೆ -
ಉದಾಹರಣೆಗೆ, ಒಂದು ಭಾಗವಾಗಿ ವೇಳೆ ಹೇಳಿಕೆ ಅಥವಾ ಲೂಪ್ -
ನಂತರ ವಿಷಯಗಳನ್ನು ಮೌನವಾಗಿ ಕೆಟ್ಟ ಹೋಗಬಹುದು.
ನಾನು invalid_read ಪ್ರೊಗ್ರಾಮನ್ನು ಹೇಗೆ ವೀಕ್ಷಿಸಿ
ಮತ್ತು ಸಾಮಾನ್ಯ ಬಗ್ಗೆ ಔಟ್ ಸಂಭವಿಸುತ್ತದೆ.
ಸ್ಕೇರಿ, HUH?
>> ಈಗ, ಅವರ ನಿಮ್ಮ ಕೋಡ್ ಎದುರಿಸಬೇಕಾಗುತ್ತದೆ ದೋಷಗಳನ್ನು ಕೆಲವು ರೀತಿಯ ನೋಡೋಣ
ಮತ್ತು ನಾವು ಅವರನ್ನು ಪತ್ತೆ ಹೇಗೆ 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 ಪ್ರತಿಯನ್ನು ಮಾಡಲಿಲ್ಲ ಸಹ
ಎರಡನೇ ರಾಶಿ ಬ್ಲಾಕ್ ಯಾವುದೇ ಪಾತ್ರಗಳು, ಒಂದು, ಟಿ ಮೂಲಕ ತೋರಿಸಿದರು
ನಾವು ಒಂದು ಪ್ರಿಂಟ್ ಔಟ್.
ವಾಸ್ತವವಾಗಿ, ಸ್ಟ್ರಿಂಗ್ ನಮ್ಮ ಮೊದಲ ಬ್ಲಾಕ್ ತುಂಬಿ
ಮೊದಲ ಬ್ಲಾಕ್ ಮತ್ತು ಎರಡನೇ ಬ್ಲಾಕ್ ಆಗಿ, ಸದೆಬಡಿದು
ಎಲ್ಲವೂ ಸಾಮಾನ್ಯ ಕಾಣುವಂತೆ ಮಾಡುತ್ತಾನೆ.
Valgrind, ಆದರೂ, ನಮಗೆ ನಿಜವಾದ ಕಥೆಯನ್ನು ಹೇಳುತ್ತದೆ.
ನಾವು ಹೋಗಿ.
ಆ ಅಮಾನ್ಯವಾಗಿದೆ ಎಲ್ಲಾ ಓದುತ್ತದೆ ಮತ್ತು ಬರೆಯುತ್ತಾರೆ.
>> ನ ದೋಷ ಮತ್ತೊಂದು ವಿಧದ ಒಂದು ಉದಾಹರಣೆಯನ್ನು ನೋಡೋಣ.
ಇಲ್ಲಿ ನಾವು ಬದಲಿಗೆ ದುರದೃಷ್ಟಕರ ಏನನ್ನಾದರೂ ಮಾಡಬೇಕು.
ನಾವು, ರಾಶಿ ಮೇಲೆ ಇಂಟ್ ಜಾಗವನ್ನು ಆಕ್ರಮಿಸಲು
ಪು - - ಆ ಜಾಗವನ್ನು ತೋರಿಸಲು ಮತ್ತು ನಾವು ಒಂದು ಇಂಟ್ ಪಾಯಿಂಟರ್ ಆರಂಭಿಸಲು.
ಆದರೆ, ನಮ್ಮ ಪಾಯಿಂಟರ್ ಆರಂಭಿಸಲಾಗಿಲ್ಲ ಆದರೆ,
ಇದು ಸೂಚಿಸುವ ಪ್ರಕಾರ ಅಕ್ಷಾಂಶ ಕೇವಲ ರಾಶಿ ಆ ಭಾಗದಲ್ಲಿ ಯಾವುದೇ ಜಂಕ್ ಯೋಗ್ಯವಾಗಿರುತ್ತದೆ.
ನಾವು ಇಂಟ್ ನಾನು ಒಳಗೆ ದತ್ತಾಂಶವನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ,
ನಾವು ತಾಂತ್ರಿಕವಾಗಿ, ನಾನು ಆರಂಭಿಸಲು
ಆದರೆ ನಾವು ಜಂಕ್ ಡೇಟಾವನ್ನು ಹೊಂದಿರುವ ಹಾಗೆ.
ಕರೆ ಒಂದು HANDY ಡೀಬಗ್ ಮ್ಯಾಕ್ರೋ ಇದು, ಪ್ರತಿಪಾದಿಸಲು
ಯೋಗ್ಯವಾಗಿ ಎಂಬ ಸಮರ್ಥನೆ ಗ್ರಂಥಾಲಯದ ವ್ಯಾಖ್ಯಾನಿಸಲಾಗಿದೆ,
ಸ್ಥಗಿತಗೊಳಿಸು ತನ್ನ ಪರೀಕ್ಷೆಯ ಸ್ಥಿತಿಯನ್ನು ವಿಫಲವಾದಲ್ಲಿ ಪ್ರೋಗ್ರಾಂ ತಿನ್ನುವೆ.
ಇ 0 ಇದ್ದಲ್ಲಿ ಅಂದರೆ,.
ರಾಶಿ ಸ್ಪೇಸ್ ರಲ್ಲಿ ಎಂಬುದನ್ನು ಅವಲಂಬಿಸಿ, p ತೋರಿಸಿದರು
ಈ ಪ್ರೋಗ್ರಾಂ ಕೆಲವೊಮ್ಮೆ ಕೆಲಸ ಮತ್ತು ಇತರ ಸಮಯದಲ್ಲಿ ವಿಫಲಗೊಳ್ಳಬಹುದು.
ಇದು ಕೆಲಸ ವೇಳೆ, ನಾವು ಅದೃಷ್ಟ ಬರುತ್ತಿದೆ.
ಕಂಪೈಲರ್ ಈ ದೋಷ ಕ್ಯಾಚ್, ಆದರೆ ಖಚಿತವಾಗಿ ವಿಲ್ Valgrind ಮಾಡುವುದಿಲ್ಲ.
ಅಲ್ಲಿ ನಾವು ಜಂಕ್ ಅಕ್ಷಾಂಶ ನಮ್ಮ ಬಳಕೆಯ ಭುಗಿಲೆದ್ದ ದೋಷವನ್ನು ನೋಡುವುದಿಲ್ಲ.
>> ನೀವು ರಾಶಿ ಮೆಮೊರಿ ನಿಯೋಜಿಸಿ ಆದರೆ deallocate ಅಥವಾ ಕ್ಲಿಕ್ ಮಾಡದೇ ಇದ್ದಾಗ,
ಒಂದು ಸೋರಿಕೆ ಎನ್ನುತ್ತಾರೆ.
ನಿರ್ಗಮಿಸುತ್ತದೆ ಓಡುತ್ತದೆ ಮತ್ತು ತಕ್ಷಣ ಒಂದು ಸಣ್ಣ, ಅಲ್ಪಾವಧಿಯ ಕಾರ್ಯಕ್ರಮ,
ಸೋರಿಕೆಯನ್ನು ತಕ್ಕಮಟ್ಟಿಗೆ ನಿರುಪದ್ರವಿಗಳು,
ಆದರೆ ದೊಡ್ಡ ಗಾತ್ರ ಮತ್ತು / ಅಥವಾ ಬಾಳಿಕೆಗೆ ಯೋಜನೆಗೆ,
ಸಣ್ಣ ಸೋರಿಕೆ ಪ್ರಮುಖ ಏನೋ ಆಗಿ ಸಂಯೋಗಗೊಂಡು.
CS50, ನೀವು ನಿರೀಕ್ಷೆ ಇಲ್ಲ
ನೀವು ನಿಯೋಜಿಸಿ ಎಂದು ರಾಶಿ ಮೆಮೊರಿ ಎಲ್ಲಾ ಮುಕ್ತಗೊಳಿಸಿದ ಆರೈಕೆಯನ್ನು,
ನೀವು ಕೈಯಾರೆ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಸರಿಯಾಗಿ ನಿರ್ವಹಿಸಲು ಕೌಶಲಗಳನ್ನು ನಿರ್ಮಿಸಲು ಬಯಸುವ ರಿಂದ
ಸಿ ಅಗತ್ಯವಿರುವ
ಹಾಗೆ, ನಿಮ್ಮ ಪ್ರೋಗ್ರಾಂ ನಿಖರ ಇರಬೇಕು
malloc ಮತ್ತು ಉಚಿತ ಕರೆಗಳನ್ನು ನಡುವೆ ಒಂದಕ್ಕೊಂದು ಪತ್ರವ್ಯವಹಾರದ.
ಅದೃಷ್ಟವಶಾತ್, Valgrind ತುಂಬಾ ಮೆಮೊರಿ ಸೋರುವಿಕೆ ನಿಮಗೆ ಸಹಾಯ ಮಾಡಬಹುದು.
ಇಲ್ಲಿ leak.c ಎಂಬ ಸೋರುವ ಪ್ರೋಗ್ರಾಂ ಎಂದು ಗೊತ್ತುಪಡಿಸುತ್ತದೆ
ರಾಶಿ ಮೇಲೆ ಸ್ಥಳವನ್ನು ಅದನ್ನು ಬರೆಯುತ್ತಾರೆ, ಆದರೆ ಇದು ಉಚಿತ ಇಲ್ಲ.
ನಾವು ಮಾಡಿ ಮತ್ತು Valgrind ಅಡಿಯಲ್ಲಿ ಚಾಲನೆ ಅದನ್ನು ಕಂಪೈಲ್
ಮತ್ತು ನಾವು ನೋಡಿ, ನಾವು ಮೆಮೊರಿ ದೋಷಗಳು ಯಾವುದೇ ಹೊಂದಿರುತ್ತವೆ, ಎಂದು
ನಾವು ಒಂದು ಸೋರಿಕೆಗೆ ಹೊಂದಿಲ್ಲ.
ಖಂಡಿತವಾಗಿಯೂ ಕಳೆದುಕೊಂಡ 16 ಬೈಟ್ಗಳು, ಇವೆ
ಪ್ರೋಗ್ರಾಂ ನಿರ್ಗಮಿಸಿದೆ ಆ ಮೆಮೊರಿ ಸೂಚಕವನ್ನು ವ್ಯಾಪ್ತಿ ಎಂದು ಅರ್ಥ.
ಈಗ, Valgrind, ನಮಗೆ ಸೋರಿಕೆ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಒಂದು ಟನ್ ನೀಡುವುದಿಲ್ಲ
ಆದರೆ ಅದು ತನ್ನ ವರದಿಯನ್ನು ಕೆಳಭಾಗದಲ್ಲಿ ಕೆಳಭಾಗಕ್ಕೆ ನೀಡುವ ಈ ಸಣ್ಣ ಟಿಪ್ಪಣಿ ಅನುಸರಿಸಿದರೆ
ಜೊತೆಗೆ ಮರುಪ್ರದರ್ಶನ ಗೆ - ಸೋರಿಕೆ ಪರಿಶೀಲಿಸಿ = ಪೂರ್ಣ
ಸೋರಿಕೆಯಾದ ಮೆಮೊರಿ ಪೂರ್ಣ ವಿವರಗಳನ್ನು ನೋಡಲು,
ನಾವು ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಪಡೆಯುತ್ತೀರಿ.
ಈಗ, ರಾಶಿ ಸಾರಾಂಶ ರಲ್ಲಿ,
ಸೋತರು ಎಂದು ಮೆಮೊರಿ ಆರಂಭದಲ್ಲಿ ನೀಡಲಾಯಿತು ಅಲ್ಲಿ Valgrind ನಮಗೆ ಹೇಳುತ್ತದೆ.
ನಾವು ಮೂಲ ಕೋಡ್ ಹುಡುಕುವುದರಲ್ಲಿ ತಿಳಿದಿರುವ ಹಾಗೆ,
Valgrind ನಾವು ಮೆಮೊರಿ ಸೋರಿಕೆಯಾಗಿದ್ದು ನಮಗೆ ಮಾಹಿತಿ
leak.c ಸಾಲಿನ 8 ರಂದು malloc ಒಂದು ಕರೆಯೊಂದಿಗೆ ಹಂಚಿಕೆ
ಮುಖ್ಯ ಕಾರ್ಯದಲ್ಲಿ.
ಪ್ರೆಟಿ ನಿಫ್ಟಿ.
>> Valgrind ಈ ಪದಗಳನ್ನು ಬಳಸಿ ಸೋರಿಕೆಯನ್ನು ವರ್ಗೀಕರಿಸುತ್ತದೆ:
ಖಂಡಿತವಾಗಿಯೂ ಕಳೆದುಕೊಂಡರು - ಈ ರಾಶಿ ನಿಯೋಜಿಸಲಾದ ಮೆಮೊರಿ ಹೊಂದಿದೆ
ಇದು ಕಾರ್ಯಕ್ರಮದ ಮುಂದೆ ಪಾಯಿಂಟರ್ ಹೊಂದಿದೆ ಗೆ.
Valgrind ನೀವು ಒಮ್ಮೆ ಪಾಯಿಂಟರ್ ಆದರೆ ಇದು ಜಾಡು ಕಳೆದುಕೊಂಡಿದ್ದಾರೆ ಎಂದು ತಿಳಿದಿದೆ.
ಈ ಮೆಮೊರಿ ಖಂಡಿತವಾಗಿಯೂ ಸೋರಿಕೆಯಾಗಿದೆ.
ಪರೋಕ್ಷವಾಗಿ ಕಳೆದುಕೊಂಡರು - ಈ ರಾಶಿ ನಿಯೋಜಿಸಲಾದ ಮೆಮೊರಿ ಹೊಂದಿದೆ
ಅದು ಮಾತ್ರ ಪಾಯಿಂಟರ್ಗಳನ್ನು ಸಹ ಕಳೆದುಹೋಗಿವೆ ಗೆ.
ಉದಾಹರಣೆಗೆ, ನೀವು ಒಂದು ಲಿಂಕ್ ಪಟ್ಟಿಯಲ್ಲಿ ಮೊದಲ ನೋಡ್ ನಿಮ್ಮ ಪಾಯಿಂಟರ್ ಸೋತರೆ,
ನಂತರ ಮೊದಲ ನೋಡ್ ಸ್ವತಃ ಖಂಡಿತವಾಗಿ, ಕಳೆದು ಎಂದು
ಯಾವುದೇ ನಂತರದ ಗ್ರಂಥಿಗಳು ಪರೋಕ್ಷವಾಗಿ ಕಳೆದು ಹೇಳಿದರು.
ಪ್ರಾಯಶಃ ಕಳೆದು - ಈ ರಾಶಿ ನಿಯೋಜಿಸಲಾದ ಮೆಮೊರಿ ಹೊಂದಿದೆ
ಇದು Valgrind ಒಂದು ಪಾಯಿಂಟರ್ ಅಥವಾ ಇಲ್ಲ ಎಂದು ಖಚಿತವಾಗಿ ಇರುವಂತಿಲ್ಲ.
ಇನ್ನೂ ತಲುಪಬಹುದಾದ ರಾಶಿ ನಿಯೋಜಿಸಲಾದ ಮೆಮೊರಿ ಹೊಂದಿದೆ
ಪ್ರೋಗ್ರಾಂ ಇನ್ನೂ ನಿರ್ಗಮನ ಒಂದು ಪಾಯಿಂಟರ್ ಇದು ಗೆ,
ಇದು ವಿಶಿಷ್ಟವಾಗಿ ಎಂದರೆ ಇದು ಒಂದು ಜಾಗತಿಕ ವೇರಿಯಬಲ್ ಅಂಕಗಳನ್ನು.
ಈ ಸೋರಿಕೆಯನ್ನು ಪರಿಶೀಲಿಸಲು, ನೀವು ಆಯ್ಕೆಯನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿದೆ
- ಇನ್ನೂ ತಲುಪಬಹುದಾದ = ಹೌದು
Valgrind ನಿಮ್ಮ ಕೋರಿಕೆಯನ್ನು ರಲ್ಲಿ.
>> ಈ ವಿವಿಧ ಸಂದರ್ಭಗಳಲ್ಲಿ, ಅದನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಲು ವಿವಿಧ ಕಾರ್ಯತಂತ್ರಗಳನ್ನು ಬಯಸುತ್ತವೆ
ಆದರೆ ಸೋರಿಕೆಯನ್ನು ಹೊರಹಾಕಬೇಕು.
ದುರದೃಷ್ಟವಶಾತ್, ಸೋರಿಕೆಯನ್ನು ಸರಿಪಡಿಸಿತು ಮಾಡಲು ಕಷ್ಟ
ಉಚಿತ ತಪ್ಪು ಕರೆಗಳನ್ನು ನಿಮ್ಮ ಪ್ರೋಗ್ರಾಂ ಸ್ಫೋಟಿಸುವ ಏಕೆಂದರೆ.
ಉದಾಹರಣೆಗೆ, ನಾವು invalid_free.c ನೋಡಿದರೆ,
ನಾವು ಕೆಟ್ಟ ಮೆಮೊರಿ deallocation ಉದಾಹರಣೆ ನೋಡಿ.
ಸಂಪೂರ್ಣ ಬ್ಲಾಕ್ ಮುಕ್ತಗೊಳಿಸಲು ಒಂದು ಕರೆ ಏನಾಗಿರಬೇಕೆಂದು
ಮೆಮೊರಿ, int_block ಮೂಲಕ ತೋರಿಸಿದರು
ಬದಲಾಗಿ ಪ್ರತಿ ಇಂಟ್ ಗಾತ್ರದ ವಿಭಾಗ ಮುಕ್ತಗೊಳಿಸಲು ಪ್ರಯತ್ನದಲ್ಲಿ ಮಾರ್ಪಟ್ಟಿದೆ
ಪ್ರತ್ಯೇಕವಾಗಿ ಮೆಮೊರಿಯ.
ಈ ಪೂರ್ತಿ ವಿಫಲಗೊಳ್ಳುತ್ತದೆ.
ಬೂಮ್! ಯಾವ ದೋಷ.
ಈ ಖಂಡಿತವಾಗಿ ಉತ್ತಮ ಅಲ್ಲ.
ನೀವು ದೋಷ ಈ ರೀತಿಯ ಸಿಕ್ಕಿಕೊಂಡುಬಿಟ್ಟಿರುತ್ತೇವೆ, ಆದರೂ, ಮತ್ತು ನೀವು, ಅಲ್ಲಿ ನೋಡಲು ಗೊತ್ತಿಲ್ಲ ವೇಳೆ
ನಿಮ್ಮ ಹೊಸ ಉತ್ತಮ ಗೆಳೆಯನನ್ನು ಹಿಂದೆ ಬೀಳುತ್ತವೆ.
ನೀವು ಊಹಿಸಿದಂತೆ - Valgrind.
Valgrind, ಎಂದು ಯಾವಾಗಲೂ ಅಪ್, ನಿಖರವಾಗಿ ತಿಳಿದಿಲ್ಲ.
alloc ಮತ್ತು ಉಚಿತ ಎಣಿಕೆಗಳು ಅಪ್ ಹೊಂದುತ್ತಿಲ್ಲ.
ನಾವು 1 alloc ಮತ್ತು 4 ಫ್ರೀಸ್ ಮಾಡಲೇಬೇಕು.
ಮತ್ತು Valgrind ಸಹ ಅಲ್ಲಿ ಮೊದಲ ಕೆಟ್ಟ ಉಚಿತ ಕರೆ ನಮಗೆ ಹೇಳುತ್ತದೆ -
ಹಿಗ್ಗಿದ ಕಾರಣವಾಯಿತು ಒಂದು - ಬರುವ ಇದೆ -
ಸಾಲು 16.
ನೀವು ನೋಡಿ ಎಂದು, ಮುಕ್ತಗೊಳಿಸಲು ಕೆಟ್ಟ ಕರೆಗಳು, ನಿಜವಾಗಿಯೂ ಕೆಟ್ಟ
ಆದ್ದರಿಂದ ನಿಮ್ಮ ಪ್ರೋಗ್ರಾಂ ಸೋರಿಕೆಗೆ ಅವಕಾಶ ಶಿಫಾರಸು
ನೀವು ಕಾರ್ಯವನ್ನು ಸರಿಯಾದ ಪಡೆಯುವಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತಲೇ.
ನಿಮ್ಮ ಪ್ರೋಗ್ರಾಂ ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾತ್ರ ನಂತರ ಸೋರಿಕೆಯನ್ನು ನಿರೀಕ್ಷಿಸಲು ಆರಂಭಿಸುವಂತೆ,
ಯಾವುದೇ ದೋಷಗಳು ಇಲ್ಲದೆ.
>> ಮತ್ತು ನಾವು ಈ ವೀಡಿಯೊ ಪಡೆದಿರುವಿರಿ ಅಷ್ಟೆ.
ಈಗ ನೀವು ಕಾಯುವ?
ಇದೀಗ ನಿಮ್ಮ ಕಾರ್ಯಕ್ರಮಗಳಲ್ಲಿ Valgrind ರನ್ ಹೋಗಿ.
ನನ್ನ ಹೆಸರು ನೇಟ್ Hardison ಹೊಂದಿದೆ. ಈ CS50 ಹೊಂದಿದೆ. [CS50.TV]