1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Valgrind] 2 00:00:02,000 --> 00:00:05,000 [네이트 Hardison, 하버드 대학교] 3 00:00:05,000 --> 00:00:07,000 이 CS50.TV, CS50입니다] 4 00:00:07,000 --> 00:00:10,000 C 프로그램에서 가장 어려운 버그 중 일부 5 00:00:10,000 --> 00:00:13,000 메모리의 그릇된 관리에서 왔습니다. 6 00:00:13,000 --> 00:00:15,000 엉망으로하는 방법에는 거대한 숫자가있다 7 00:00:15,000 --> 00:00:17,000 메모리의 잘못된 양을 할당 포함 8 00:00:17,000 --> 00:00:20,000 변수를 초기화 잊어하면, 9 00:00:20,000 --> 00:00:23,000 버퍼의 끝에 전이나 후에 쓰기, 10 00:00:23,000 --> 00:00:25,000 메모리를 여러 번 계속 자유롭게. 11 00:00:25,000 --> 00:00:28,000 증상은 간헐적 인 충돌에 이르기까지 다양한 12 00:00:28,000 --> 00:00:30,000 신비 덮어 값으로, 13 00:00:30,000 --> 00:00:34,000 자주 멀리 원래 오류에서 제거 장소 및 시간에. 14 00:00:34,000 --> 00:00:37,000 기본 근본 원인으로 다시 관찰 문제를 추적 15 00:00:37,000 --> 00:00:39,000 도전 할 수 있습니다, 16 00:00:39,000 --> 00:00:42,000 그러나 다행스럽게도 Valgrind라는 유용한 프로그램이 17 00:00:42,000 --> 00:00:44,000 그 도움이 많이 작업을 수행 할 수 있습니다. 18 00:00:44,000 --> 00:00:47,000 >> 당신은 활성화 Valgrind 아래 프로그램을 실행 19 00:00:47,000 --> 00:00:50,000 힙 메모리 할당 및 액세스 광범위하게 확인하지 않습니다. 20 00:00:50,000 --> 00:00:53,000 Valgrind 문제를 감지하면, 당신에게 즉각적인을 제공합니다 21 00:00:53,000 --> 00:00:56,000 작업을 수행 할 수 있습니다 직접 정보를 22 00:00:56,000 --> 00:00:58,000 더 쉽게 찾아 문제를 해결할 수 있습니다. 23 00:00:58,000 --> 00:01:01,000 또한 적은 치명적인 메모리 문제에 대한 보고서를 Valgrind 24 00:01:01,000 --> 00:01:04,000 이러한 메모리 누수와 같은, 힙 메모리를 할당, 25 00:01:04,000 --> 00:01:07,000 하고 해방 잊고 있어요. 26 00:01:07,000 --> 00:01:10,000 우리 디버거에서의 컴파일러, 꽝, GDB를 좋아 27 00:01:10,000 --> 00:01:14,000 Valgrind는 무료 소프트웨어이며,이 기기에 설치되어 있습니다. 28 00:01:14,000 --> 00:01:16,000 Valgrind는 여러분의 바이너리 실행 파일에서 실행 29 00:01:16,000 --> 00:01:20,000 네. C 나. H 소스 코드 파일, 30 00:01:20,000 --> 00:01:23,000 그럼 당신은 프로그램의 최신 복사본을 컴파일해야합니다 31 00:01:23,000 --> 00:01:25,000 꽝를 사용하거나합니다. 32 00:01:25,000 --> 00:01:28,000 그런 다음, Valgrind 아래에 프로그램을 실행하는 것은 할 수 33 00:01:28,000 --> 00:01:32,000 그냥 단어 Valgrind로 표준 프로그램 명령을 prefixing 간단, 34 00:01:32,000 --> 00:01:35,000 이는 Valgrind까지 시작하고 그것의 내부 프로그램을 실행합니다. 35 00:01:35,000 --> 00:01:38,000 시작할 때, Valgrind 일부 복잡한 아는 36 00:01:38,000 --> 00:01:41,000 메모리 검사의 실행을 구성 할 수 jiggering, 37 00:01:41,000 --> 00:01:44,000 그래서 설치하고 실행하기 위해 비트를 취할 수 있습니다. 38 00:01:44,000 --> 00:01:48,000 이 프로그램은 다음 훨씬 더 천천히, 일반적으로 실행 그것을됩니다 39 00:01:48,000 --> 00:01:52,000 하고 완료하면 Valgrind는 메모리 사용량의 요약을 인쇄합니다. 40 00:01:52,000 --> 00:01:58,000 모든 것이 잘되면, 그것은 다음과 같이합니다 : 41 00:01:58,000 --> 00:02:01,000 이 경우. / clean_program 42 00:02:01,000 --> 00:02:04,000 제가 실행하려는 프로그램의 경로입니다. 43 00:02:04,000 --> 00:02:06,000 그리고이 어떤 인수를하지 않습니다 반면, 44 00:02:06,000 --> 00:02:09,000 만약 그랬다면 나는 평소와 같이 명령의 끝에, 그냥 압정으로 고정을 물었다. 45 00:02:09,000 --> 00:02:12,000 클린 프로그램은 내가 만든 좀 멍청 프로그램입니다 46 00:02:12,000 --> 00:02:15,000 즉, 힙에 ints의 블록을위한 공간을 할당 47 00:02:15,000 --> 00:02:19,000 일부 값 중 내부를 놓고, 전체 블록을 만듭니다. 48 00:02:19,000 --> 00:02:23,000 이렇게하면 오류없이 누출 아니,에 촬영하신 거죠. 49 00:02:23,000 --> 00:02:27,000 >> 또 다른 중요한 측정 항목은 할당 된 바이트의 총 수입니다. 50 00:02:27,000 --> 00:02:32,000 귀하의 할당이 메가바이트 이상에있는 경우, 프로그램에 따라, 51 00:02:32,000 --> 00:02:34,000 당신은 아마 뭔가 잘못을 다하고 있습니다. 52 00:02:34,000 --> 00:02:37,000 당신은 불필요하게 중복 저장을하는거야? 53 00:02:37,000 --> 00:02:40,000 이 스택을 사용하는 것이 더 효과적 때, 저장을 위해 힙을 사용하고 있습니까? 54 00:02:40,000 --> 00:02:43,000 따라서, 메모리 오류가 진정한 악마가 될 수 있습니다. 55 00:02:43,000 --> 00:02:46,000 더 명백한 사람은 멋진 충돌을 일으킬 56 00:02:46,000 --> 00:02:49,000 이지만 아직도 정확하게하기 어려울 수 있습니다 57 00:02:49,000 --> 00:02:51,000 정확히 어떤 충돌로했다. 58 00:02:51,000 --> 00:02:54,000 메모리 오류가 더 insidiously, 프로그램 59 00:02:54,000 --> 00:02:56,000 여전히 깨끗하게 컴파일 할 수 60 00:02:56,000 --> 00:02:58,000 아직도 제대로 작동 할 수 61 00:02:58,000 --> 00:03:01,000 당신은 대부분의 시간을 행운 관리 because. 62 00:03:01,000 --> 00:03:04,000 여러 후 "성공 결과" 63 00:03:04,000 --> 00:03:07,000 당신은, 충돌 컴퓨터의 우연이라고 생각할 수 64 00:03:07,000 --> 00:03:10,000 하지만 컴퓨터는 절대 틀리지 않습니다. 65 00:03:10,000 --> 00:03:13,000 >> Valgrind를 실행하면 볼 수 메모리 오류의 원인을 추적 할 수 있습니다 66 00:03:13,000 --> 00:03:18,000 뿐만 아니라 오류가 숨어 발견으로 아직 모르는. 67 00:03:18,000 --> 00:03:22,000 Valgrind 문제를 감지 할 때마다, 그것이 관찰에 대한 정보를 인쇄합니다. 68 00:03:22,000 --> 00:03:24,000 각 항목은 매우 간결한입니다 - 69 00:03:24,000 --> 00:03:27,000 저작권을 침해하는 명령어의 소스 라인,이 문제는 무엇이며, 70 00:03:27,000 --> 00:03:30,000 관련 메모리에 대한 약간의 정보 - 71 00:03:30,000 --> 00:03:34,000 하지만 종종이 올바른 위치에주의를 기울여 주시기하기에 충분한 정보입니다. 72 00:03:34,000 --> 00:03:37,000 다음은 버그가 프로그램을 실행 Valgrind의 예입니다 73 00:03:37,000 --> 00:03:40,000 그 힙 메모리의 잘못된 읽기를하지 않습니다. 74 00:03:40,000 --> 00:03:49,000 우리는 컴파일에 오류 또는 경고를 볼 수 없습니다. 75 00:03:49,000 --> 00:03:53,000 어 - 오, 오류 요약은 두 오류가 있다고 - 76 00:03:53,000 --> 00:03:56,000 크기 4의 두 잘못된 읽기 - 바이트입니다. 77 00:03:56,000 --> 00:04:01,000 모두 나쁜는 invalid_read.c의 주요 기능에서 발생 읽고 78 00:04:01,000 --> 00:04:04,000 라인 16 라인 (19)의 두 번째에서 첫 번째. 79 00:04:04,000 --> 00:04:06,000 가 코드를 보자. 80 00:04:06,000 --> 00:04:11,000 printf의 메모리 블록의 끝을 지났 한 정수를 읽으려고하는 최초의 호출 것 같습니다. 81 00:04:11,000 --> 00:04:13,000 우리는 Valgrind의 출력에서​​ 다시 만난다면 82 00:04:13,000 --> 00:04:16,000 우리는 Valgrind 정확히 그게 우리에게 말하는 것을 참조하십시오. 83 00:04:16,000 --> 00:04:19,000 우리가 읽을하려는 주소는 0 바이트를 시작 84 00:04:19,000 --> 00:04:22,000 - 크기 16 바이트의 블록의 끝을 지났습니다 85 00:04:22,000 --> 00:04:25,000 우리가 할당하는 4 개의 32 비트 ints. 86 00:04:25,000 --> 00:04:29,000 즉, 우리가 읽는 된 주소는, 그렇지 블록의 끝에서 시작 87 00:04:29,000 --> 00:04:32,000 우리는 우리의 나쁜 printf 전화에서 볼 것처럼. 88 00:04:32,000 --> 00:04:36,000 이제 잘못된 읽기, 거래의 큰처럼 들릴 수 89 00:04:36,000 --> 00:04:39,000 하지만 당신은 프로그램의 흐름을 제어하기 위해 데이터를 사용하는 경우 - 90 00:04:39,000 --> 00:04:42,000 예를 들어,의 일환으로 if 문 또는 루프 - 91 00:04:42,000 --> 00:04:45,000 그리고 일이 자동으로 나쁜 이동할 수 있습니다. 92 00:04:45,000 --> 00:04:47,000 나는 invalid_read 프로그램을 실행 할 수있는 방법보기 93 00:04:47,000 --> 00:04:50,000 그리고 보통의 아무 아웃이 발생하지 않습니다. 94 00:04:50,000 --> 00:04:52,000 무서운, 그렇지? 95 00:04:52,000 --> 00:04:56,000 >> 이제, 귀하가 귀하의 코드에서 발생할 수있는 오류를 좀 더 가지 살펴 보자 96 00:04:56,000 --> 00:04:59,000 우리는 그들을 감지하는 방법 Valgrind가 표시됩니다. 97 00:04:59,000 --> 00:05:01,000 우리는, invalid_read의 예를 본 98 00:05:01,000 --> 00:05:04,000 그래서 지금의이 invalid_write을 확인 해보자. 99 00:05:04,000 --> 00:05:09,000 다시 컴파일에 오류 또는 경고. 100 00:05:09,000 --> 00:05:12,000 좋아요, Valgrind이 프로그램에서 두 오류가 있다는 것을 말해 - 101 00:05:12,000 --> 00:05:15,000 그리고 invalid_write 및 invalid_read. 102 00:05:15,000 --> 00:05:18,000 가이 코드를 확인 해보자. 103 00:05:18,000 --> 00:05:21,000 우리가 고전 나 strlen 플러스 벌레의 인스턴스가 생긴 것 같은데. 104 00:05:21,000 --> 00:05:24,000 코드는 malloc 공간의 추가 바이트를하지 않습니다 105 00:05:24,000 --> 00:05:26,000 / 0 문자를 들면, 106 00:05:26,000 --> 00:05:30,000 그래서 str을 복사 ssubstrlen에서를 작성했을 때 "cs50 바위!" 107 00:05:30,000 --> 00:05:33,000 우리 블록의 끝을 지났 1 바이트를 썼습니다. 108 00:05:33,000 --> 00:05:36,000 우리가 printf 우리의 통화를 할 때 invalid_read 온다. 109 00:05:36,000 --> 00:05:40,000 가 / 0 문자를 읽을 때 Printf가 잘못 메모리를 읽고 종료 110 00:05:40,000 --> 00:05:43,000 이렇게 E 문자열의 끝 부분에 보이는대로 인쇄입니다. 111 00:05:43,000 --> 00:05:45,000 그러나이 중 아무 것도 Valgrind를 탈출하지 않습니다. 112 00:05:45,000 --> 00:05:48,000 우리는으로 str 복사의 일환으로이 invalid_write을 잡은 것을 알 113 00:05:48,000 --> 00:05:51,000 메인 행 11과 invalid_read는 printf의 일부입니다. 114 00:05:51,000 --> 00:05:54,000 Valgrind, 신난다. 115 00:05:54,000 --> 00:05:57,000 다시 말하지만,이 큰 문제 같아 보이지 않을 수도 있습니다. 116 00:05:57,000 --> 00:06:00,000 우리는 Valgrind의 외부 계속해서이 프로그램을 실행할 수 있습니다 117 00:06:00,000 --> 00:06:03,000 및 오류 증상을 볼 수 없습니다. 118 00:06:03,000 --> 00:06:06,000 >> 그러나 볼이 약간의 변화를 살펴 보자 119 00:06:06,000 --> 00:06:09,000 어떻게 일이 진짜 나쁜받을 수 있습니다. 120 00:06:09,000 --> 00:06:14,000 자, 부여, 우리는이 코드에서 조금만보다 더 일을 남용하고 있습니다. 121 00:06:14,000 --> 00:06:17,000 우리는 두 개의 문자열의 힙 공간을 할당하고 122 00:06:17,000 --> 00:06:19,000 cs50 바위의 길이, 123 00:06:19,000 --> 00:06:22,000 이 시간, / 0 문자를 기억. 124 00:06:22,000 --> 00:06:25,000 하지만 우리는 메모리 블록에 슈퍼 - 긴 문자열에 던져 125 00:06:25,000 --> 00:06:27,000 그 S는를 가리키고 있습니다. 126 00:06:27,000 --> 00:06:30,000 어떤 영향을하면 메모리 블록에이됩니다 거기에 T 포인트? 127 00:06:30,000 --> 00:06:34,000 음, 만약 S 바로 인접 메모리로 T 포인트 128 00:06:34,000 --> 00:06:37,000 단지 이후에 오는 129 00:06:37,000 --> 00:06:39,000 그러면 우리는 T.의 일부를 통해 서면으로 수도 130 00:06:39,000 --> 00:06:41,000 가이 코드를 실행할 수 있습니다. 131 00:06:41,000 --> 00:06:43,000 무슨 일이 있었는지 좀 봐. 132 00:06:43,000 --> 00:06:47,000 우리는 힙 블록 모두에 저장된 문자열이 제대로 출력 한 것으로 나타났다. 133 00:06:47,000 --> 00:06:49,000 아무것도 전혀 잘못된 것 없습니다. 134 00:06:49,000 --> 00:06:52,000 그러나,이 우리의 코드로 돌아 가게하고 135 00:06:52,000 --> 00:06:55,000 우리가 cs50 바위를 복사 어디에 줄을 주석으로 136 00:06:55,000 --> 00:06:59,000 두 번째 메모리 블록에, t에 의해 지적했다. 137 00:06:59,000 --> 00:07:02,000 자, 우리는이 코드를 실행할 때 우리는해야 138 00:07:02,000 --> 00:07:06,000 첫 번째 메모리 블록의 내용이 인쇄를 참조하십시오. 139 00:07:06,000 --> 00:07:09,000 우와, 우리는 str을 복사 한 경우에도 140 00:07:09,000 --> 00:07:12,000 두 번째 힙 블록에 모든 문자는 하나, T 의해 지적 141 00:07:12,000 --> 00:07:15,000 우리는 인쇄를 나가. 142 00:07:15,000 --> 00:07:18,000 사실, 문자열 우리는 우리의 첫번째 블록에 박제 143 00:07:18,000 --> 00:07:21,000 첫 번째 블록 두 번째 블록에를 지나쳤 144 00:07:21,000 --> 00:07:23,000 모든 정상적인 것 같습니다 만들기. 145 00:07:23,000 --> 00:07:26,000 Valgrind하지만, 우리에게 진실을 이야기 알려줍니다. 146 00:07:26,000 --> 00:07:28,000 우리는 간다. 147 00:07:28,000 --> 00:07:32,000 그 무효의 모든 읽고 씁니다. 148 00:07:32,000 --> 00:07:36,000 >> 의 오류의 또 다른 종류의 예를 살펴 보도록하겠습니다. 149 00:07:36,000 --> 00:07:39,000 여기보다 불행한 일을. 150 00:07:39,000 --> 00:07:41,000 우리는 힙에 정수를위한 공간을 잡아 151 00:07:41,000 --> 00:07:45,000 P - - 그 공간을 가리 키도록 우리는 정수 포인터를 초기화합니다. 152 00:07:45,000 --> 00:07:48,000 그러나, 우리 포인터가 초기화되는 동안, 153 00:07:48,000 --> 00:07:52,000 가 가리키는 있다는 데이터는 힙의 해당 부분에 있던 정크이기도. 154 00:07:52,000 --> 00:07:55,000 그래서 우리는 INT 전으로 데이터를로드 할 때, 155 00:07:55,000 --> 00:07:57,000 우리는 기술적으로, 전을 초기화 156 00:07:57,000 --> 00:08:00,000 우리는 정크 데이터를 이렇게. 157 00:08:00,000 --> 00:08:03,000 전화는 편리한 디버깅 매크로입니다, 주장 158 00:08:03,000 --> 00:08:06,000 aptly라는 이름의 주장 라이브러리에서 정의 159 00:08:06,000 --> 00:08:09,000 중지는 테스트 조건이 실패 할 경우 프로그램 것이다. 160 00:08:09,000 --> 00:08:11,000 나는이 0이 아닌 경우 즉,이다. 161 00:08:11,000 --> 00:08:14,000 힙 공간에 어떤 건지에 따라, P 의해 지적 162 00:08:14,000 --> 00:08:18,000 이 프로그램은 때로는 작동하고 다른 시간에 실패 할 수 있습니다. 163 00:08:18,000 --> 00:08:20,000 작동하는 경우, 우리는 운이지고있어. 164 00:08:20,000 --> 00:08:24,000 컴파일러는이 오류를 잡을 만, 확인 의지를 Valgrind하지 않습니다. 165 00:08:24,000 --> 00:08:28,000 이 우리는 정크 데이터의 사용에서 형태소 분석 오류를 참조하십시오. 166 00:08:28,000 --> 00:08:32,000 >> 당신이 힙 메모리를 할당 있지만 할당을 취소하거나 확보되지 않는 경우 167 00:08:32,000 --> 00:08:34,000 그는 누출이라고합니다. 168 00:08:34,000 --> 00:08:37,000 종료를 실행하고 즉시 작은 수명이 짧은 프로그램, 169 00:08:37,000 --> 00:08:39,000 누출은 매우 해롭지, 170 00:08:39,000 --> 00:08:42,000 하지만, 큰 크기 및 / 또는 장수의 프로젝트, 171 00:08:42,000 --> 00:08:46,000 심지어 작은 누출은 주요 식으로 조합 할 수 있습니다. 172 00:08:46,000 --> 00:08:49,000 CS50를 들어, 우리는 당신을 기대 173 00:08:49,000 --> 00:08:51,000 당신이 할당 된 힙 메모리를 모두 자유롭게, 알아서 174 00:08:51,000 --> 00:08:54,000 우리는 당신이 수동 프로세스를 제대로 처리 기술을 구축하고자부터 175 00:08:54,000 --> 00:08:56,000 C.에 필요한 176 00:08:56,000 --> 00:08:59,000 이렇게하려면, 당신의 프로그램이 정확하게 있어야합니다 177 00:08:59,000 --> 00:09:03,000 malloc과 무료 통화 사이의 일대일는 통신. 178 00:09:03,000 --> 00:09:06,000 다행히도, Valgrind도 메모리 누수를 할 수 있습니다. 179 00:09:06,000 --> 00:09:09,000 여기 leak.c라는 새는 프로그램입니다 할당 180 00:09:09,000 --> 00:09:13,000 힙의 공간, 거기에 기록하지만, 그것을 확보하지 않습니다. 181 00:09:13,000 --> 00:09:16,000 우리는 확인하고 Valgrind 아래 실행과 컴파일 182 00:09:16,000 --> 00:09:18,000 우리는보고, 우리는 메모리 오류도이없는 반면, 그 183 00:09:18,000 --> 00:09:20,000 우리가 한 누출을 가지고 있습니다. 184 00:09:20,000 --> 00:09:23,000 확실히 손실 16 바이트이 있습니다 185 00:09:23,000 --> 00:09:27,000 프로그램이 종료되면 그 메모리 포인터가 범위에 존재하지 않았을 의미합니다. 186 00:09:27,000 --> 00:09:30,000 지금, Valgrind는 우리에게 누설에 대한 정보의 톤을 제공하지 않습니다 187 00:09:30,000 --> 00:09:35,000 하지만 우리는 그 보고서의 하단으로 내려주는이 작은 노트를 수행하는 경우 188 00:09:35,000 --> 00:09:38,000 을 다시 실행 - 누출 확인 = 전체 189 00:09:38,000 --> 00:09:41,000 누수 된 메모리의 전체 내용을 보려면 190 00:09:41,000 --> 00:09:44,000 우리는 더 많은 정보를 얻을 수 있습니다. 191 00:09:44,000 --> 00:09:46,000 이제 힙 요약, 192 00:09:46,000 --> 00:09:50,000 분실 된 메모리가 처음 할당 된 곳 Valgrind 우리를 알려줍니다. 193 00:09:50,000 --> 00:09:52,000 우리가 소스 코드에서 찾고에서 알고있는 것처럼, 194 00:09:52,000 --> 00:09:55,000 Valgrind는 우리가 메모리를 유출 우리에게 알려 195 00:09:55,000 --> 00:09:58,000 leak.c의 8 호선에서 malloc를 호출로 할당 된 196 00:09:58,000 --> 00:10:00,000 main () 함수 인치 197 00:10:00,000 --> 00:10:02,000 아주 멋진. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind는 이러한 용어를 사용하는 누수 분류 : 199 00:10:04,000 --> 00:10:07,000 물론 분실 -이 힙 할당 된 메모리입니다 200 00:10:07,000 --> 00:10:10,000 어떤 프로그램은 더 이상 포인터가 없습니다. 201 00:10:10,000 --> 00:10:14,000 Valgrind를 사용하면 포인터를 가지고 있지만, 이후의 자취를 잃었 것으로 알고 있습니다. 202 00:10:14,000 --> 00:10:17,000 이 메모리는 확실히 유출된다. 203 00:10:17,000 --> 00:10:20,000 간접적 손실 -이 힙 할당 된 메모리입니다 204 00:10:20,000 --> 00:10:24,000 어떤 거기에 유일한 포인터도 손실됩니다 수 있습니다. 205 00:10:24,000 --> 00:10:27,000 예를 들어, 연결리스트의 첫 번째 노드에 포인터를 분실하는 경우 206 00:10:27,000 --> 00:10:30,000 다음 첫 번째 노드 자체는 분명히 손실 될 207 00:10:30,000 --> 00:10:34,000 후속 노드는 간접적으로 손실 될 것입니다 동안. 208 00:10:34,000 --> 00:10:37,000 가능 잃었 어 -이 힙 할당 된 메모리입니다 209 00:10:37,000 --> 00:10:41,000 어떤에 Valgrind는 포인터 여부가 있는지 확신 할 수 없습니다. 210 00:10:41,000 --> 00:10:44,000 그래도 연결할 수는 힙 할당 된 메모리입니다 211 00:10:44,000 --> 00:10:47,000 프로그램이 여전히 출구에서 포인터를 가지고있는에, 212 00:10:47,000 --> 00:10:50,000 이는 일반적으로 의미합니다 거기에 전역 변수를 가리 킵니다. 213 00:10:50,000 --> 00:10:53,000 이러한 누수를 확인하려면, 당신은 또한 옵션을 포함해야합니다 214 00:10:53,000 --> 00:10:55,000 - 아직도 도달 = 예 215 00:10:55,000 --> 00:10:58,000 Valgrind의 호출 인치 216 00:10:58,000 --> 00:11:01,000 >> 이 다른 경우는, 그들을 청소에 대해 서로 다른 전략을 필요로 할 수 217 00:11:01,000 --> 00:11:05,000 하지만 누수가 제거해야합니다. 218 00:11:05,000 --> 00:11:08,000 불행하게도, 누수를 해결하는 것은 힘들 수 있습니다 219 00:11:08,000 --> 00:11:11,000 무료로 잘못된 통화 프로그램을 날려 버릴 수 있기 때문에. 220 00:11:11,000 --> 00:11:14,000 예를 들어, 우리가 invalid_free.c 보면, 221 00:11:14,000 --> 00:11:18,000 우리는 나쁜 기억 반납의 예를 참조하십시오. 222 00:11:18,000 --> 00:11:21,000 전체 블록을 확보 할 수있는 하나의 호출해야하는 것은 무엇입니까 223 00:11:21,000 --> 00:11:24,000 메모리, int_block 의해 지적 224 00:11:24,000 --> 00:11:27,000 대신 각 정수 크기 섹션을 확보하기 위해이되었습니다 225 00:11:27,000 --> 00:11:29,000 개별적으로 메모리가 부족합니다. 226 00:11:29,000 --> 00:11:32,000 이 catastrophically 실패합니다. 227 00:11:32,000 --> 00:11:34,000 꽝! 어떤 오류가 발생했습니다. 228 00:11:34,000 --> 00:11:36,000 이 확실히 좋지 않습니다. 229 00:11:36,000 --> 00:11:39,000 당신은 오류의 종류와 붙어있어,하지만 당신은, 어디를 봐야할지 모를 경우 230 00:11:39,000 --> 00:11:41,000 당신의 친한 친구에 귀환한다. 231 00:11:41,000 --> 00:11:44,000 당신은 그것을 짐작 - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, 언제나이야, 정확히 알고 있습니다. 233 00:11:47,000 --> 00:11:50,000 alloc과 무료 카운트가 일치하지 않습니다. 234 00:11:50,000 --> 00:11:52,000 우리는 하나 alloc과 4 해방있어. 235 00:11:52,000 --> 00:11:55,000 그리고 Valgrind는 또한 어디에서 처음으로 나쁜 무료 통화 우리에게 말해줍니다 - 236 00:11:55,000 --> 00:11:58,000 확대를 게재 한 사람은 -에서 오는 - 237 00:11:58,000 --> 00:12:00,000 라인 16. 238 00:12:00,000 --> 00:12:03,000 당신이보다시피, 해방하는 나쁜 전화, 정말 나쁜 239 00:12:03,000 --> 00:12:05,000 그래서 우리는 프로그램 누수를 보내는 것이 좋습니다 240 00:12:05,000 --> 00:12:08,000 당신은 기능이 올바른 받고 작업을하는 동안. 241 00:12:08,000 --> 00:12:12,000 프로그램이 제대로 작동 후에 만​​ 누출을 찾고 시작, 242 00:12:12,000 --> 00:12:14,000 다른 오류없이. 243 00:12:14,000 --> 00:12:16,000 >> 그리고 우리가이 동영상에 대한 가진 전부입니다. 244 00:12:16,000 --> 00:12:18,000 이제 뭘 기다리는거야? 245 00:12:18,000 --> 00:12:21,000 지금 프로그램에 Valgrind 실행 이동합니다. 246 00:12:21,000 --> 00:12:25,000 내 이름은 네이트 Hardison입니다. 이 CS50입니다. [CS50.TV]