Getting [Fatal error: exception Out_of_memory] using Cairo.PNG.create in OCaml

Getting [Fatal error: exception Out_of_memory] using Cairo.PNG.create in OCaml

我使用 Cairo.PNG.create 在 OCaml 中读取图像。 我得到

Fatal error: exception Out_of_memory

当我尝试阅读一些图片时。它们是 5KB,但是我可以读取大小为 5KB 的图像。我可以读取更大的图像(例如 45KB),所以我认为错误的原因不是图像的大小。但是,除了尺寸之外,我找不到与我无法阅读的图像的共同点。 什么时候在 OCaml 中使用 Cairo.PNG.create 会出现错误?我想要删除错误的提示。

这类错误通常是内存损坏的迹象。您应该查看对 Marshal 模块的所有调用,无论是直接调用还是间接调用(如 input_value)。它们通常是邪恶的原因。否则,可能的候选者是 C-bindings 中的错误。这种错误很难发现和调试。

P.S。而且,要确保这确实是内存损坏,您应该查看 dmesg 输出。如果不是内存损坏,那么一定有 OOM killer 的注释,比如 "killing all children, etc"。但我很确定你不会看到这样的东西,因为被 OOM 杀死的应用程序通常以最后一个词结束:"Killed".

还需要检查您正在阅读的图像是否格式正确。也许这些图像将自己描述为巨大的。我相信我见过一些流氓 PNG 格式,它们的尺寸看起来大得离谱。

Cairo.PNG.create 是一个 thin wrapper around the C function cairo_image_surface_create_from_png. It raises Out_of_memory when the C function returns CAIRO_STATUS_NO_MEMORY。由于这是在分配任何内存之前完成的,因此我认为这不是包装器中的错误。你能在你的图像上报告命令 file 的结果吗?