2015-02-03 2 views
0

OCaml에서 이미지를 읽으려면 Cairo.PNG.create를 사용합니다. 이미지를 읽을 때OCaml에서 Cairo.PNG.create를 사용하여 [치명적인 오류 : 예외 Out_of_memory] 얻기

Fatal error: exception Out_of_memory 

내가 읽을 때. 그들은 5KB이지만, 읽을 수있는 크기가 5KB 인 이미지가 있습니다. 더 큰 이미지 (예 : 45KB)를 읽을 수 있으므로 오류의 원인이 이미지의 크기라고 생각하지 않습니다. 그러나 크기 이외에 읽을 수없는 이미지가있는 공통점을 찾을 수 없습니다. 언제 OCaml에서 Cairo.PNG.create를 사용하여 오류가 발생합니까? 힌트를 통해 오류를 삭제하고 싶습니다.

답변

0

Cairo.PNG.create은 C 함수 cairo_image_surface_create_from_png을 중심으로 thin wrapper입니다. C 함수가 CAIRO_STATUS_NO_MEMORY을 반환하면 raises Out_of_memory이됩니다. 이것은 어떤 메모리가 할당되기 전에 이루어지기 때문에 이것이 래퍼의 버그라고 생각하지 않습니다. 이미지에 file 명령의 결과를 신고 해 주시겠습니까?

+0

명령을 시도했는데 읽을 수없는 이미지 형식이 GIF라는 것을 알았습니다. Finder에서 이미지 정보를 볼 때 형식은 PNG입니다. 그래서 포맷이 상당히 PNG라고 잘못 생각했습니다. 당황 스럽지만 이런 상황을 모릅니다. 고맙습니다. – mmsss

0

이러한 종류의 오류는 일반적으로 메모리 손상의 징조입니다. Marshal 모듈에 대한 모든 호출을 직접 또는 간접적으로 (예 : input_value)보아야합니다. 그들은 보통 악의 원인입니다. 그렇지 않은 경우 가능한 후보는 C -bindings의 버그입니다. 이런 종류의 오류는 찾아 내고 디버그하기가 매우 어렵습니다.

P. 그리고 이것이 실제로 메모리 손상인지 확인하려면 dmesg 출력을 살펴 봐야합니다. 메모리 손상이 아니라면 "모든 어린이를 죽이는 것"과 같은 OOM 킬러의 메모가 있어야합니다. 하지만 OOM으로 죽은 응용 프로그램은 대개 마지막 단어 "Killed"로 끝나기 때문에 이런 식으로 보지 못하게 될 것입니다.

+0

나는 ChirS에 대한 코멘트에 기록 된대로 오류를 삭제할 수 있었다. 답장을 보내 주셔서 감사합니다. – mmsss

1

확인할 사항은 읽는 이미지의 형식이 올바른지 여부입니다. 어쩌면 이미지 자체가 거대한 것으로 묘사됩니다. 나는 크기가 어리석게 커 보이는 일부 불량 PNG 형식을 본 것으로 믿습니다.

+0

나는 ChirS에 대한 코멘트에 기록 된대로 오류를 지울 수 있었다. 답장을 보내 주셔서 감사합니다. – mmsss