[ocaml-ctypes] Binding that works in bytecode, segfaults in native code
Hezekiah M. Carty
hez at 0ok.org
Mon Oct 20 11:39:06 BST 2014
On Tue, Oct 14, 2014 at 7:09 AM, Jeremy Yallop <yallop at gmail.com> wrote:
> On 8 October 2014 14:19, Hezekiah M. Carty <hez at 0ok.org> wrote:
>> In the mean time are there any suggestions or techniques you can recommend to
>> help track down the cause of this segfault?
>
> I think A. Hauptmann's advice elsewhere is worth repeating here, for
> the benefit of anyone who runs into similar issues:
>
> "Use Gc.compact, not just Gc.full_major. And put it in a often
> called function of your library code, not only at application level. I
> always overlay any suspicious function with a wrapper of this scheme:
>
> let f .. =
> Gc.compact ();
> let x = f .. in
> Gc.compact ();
> x
>
> And then run your application with valgrind. Valgrind did find
> this error instantly."
> (https://github.com/hcarty/ocaml-gdal/pull/3)
To follow up on the specifics for this case: A finalization/free
function provided by GDAL was freeing memory I had allocated from
ctypes leading to a double free. As A. Hauptmann pointed out in the
pull request link above, valgrind picked up the mistake and its source
immediately. For this crash removing the GDAL-provided finalization
function was enough to avoid the issue - OCaml + ctypes were already
freeing everything the finalizer would have freed.
I'm rather embarrassed that I didn't use valgrind in the first place.
Thanks to A Hauptmann for getting me back on track with these
bindings.
Hez
More information about the Ctypes
mailing list