From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 420637EE34 for ; Mon, 11 Apr 2016 14:02:19 +0200 (CEST) IronPort-PHdr: 9a23:q2nOGR/VtsbtUf9uRHKM819IXTAuvvDOBiVQ1KB92uIcTK2v8tzYMVDF4r011RmSDdWdt6MP0LWempujcFJDyK7JiGoFfp1IWk1NouQttCtkPvS4D1bmJuXhdS0wEZcKflZk+3amLRodQ56mNBXsq3G/pQQfBg/4fVIsYL+lSsiO3o/siKibwN76XUZhvHKFe7R8LRG7/036l/I9ps9cEJs30QbDuXBSeu5blitCLFOXmAvgtI/rpMYwuwwZgf8q9tZBXKPmZOx4COUAVHV1BVso/9XmvgXvSg6G531UEjlH00kAPw+Q1hbwFrf2vzCy4tB60m+6OsDtZbs1RS6j/+FgTxq+2wkdMDts32jdkM19iOpgqxKsvRFli9rbaYuPNfd6OLjWfd4ASHBpUcNYVigHCYS5OdhcR9EdNPpV+tGu72AFqgGzUEzxXe4= Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=gabriel.scherer@gmail.com; spf=Pass smtp.mailfrom=gabriel.scherer@gmail.com; spf=None smtp.helo=postmaster@mail-ig0-f179.google.com Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of gabriel.scherer@gmail.com) identity=pra; client-ip=209.85.213.179; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="gabriel.scherer@gmail.com"; x-sender="gabriel.scherer@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of gabriel.scherer@gmail.com designates 209.85.213.179 as permitted sender) identity=mailfrom; client-ip=209.85.213.179; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="gabriel.scherer@gmail.com"; x-sender="gabriel.scherer@gmail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-ig0-f179.google.com) identity=helo; client-ip=209.85.213.179; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="gabriel.scherer@gmail.com"; x-sender="postmaster@mail-ig0-f179.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0C9AAAgkQtXjLPVVdFdg1U1fQaoKYFRhV2KfgENgXIhhWwCgSMHOBQBAQEBAQEBAREBAQEIDQkJHzGCLYIVAQEEEhEEGQEbEgsBAwwGBQsNAgIJHQICIgERAQUBChIGExIQh28BAxIOni2BMT4xizaBaoJXhy4KGScDClGETgEBAQEBBQEBAQEBAQETAQUKBW2FJYRLhD2DAoJWAQSGLwyRSYFUhCOIFYI1jFiHXoYLER6BDh4BAYI5DREIgWYgMIorAQEB X-IPAS-Result: A0C9AAAgkQtXjLPVVdFdg1U1fQaoKYFRhV2KfgENgXIhhWwCgSMHOBQBAQEBAQEBAREBAQEIDQkJHzGCLYIVAQEEEhEEGQEbEgsBAwwGBQsNAgIJHQICIgERAQUBChIGExIQh28BAxIOni2BMT4xizaBaoJXhy4KGScDClGETgEBAQEBBQEBAQEBAQETAQUKBW2FJYRLhD2DAoJWAQSGLwyRSYFUhCOIFYI1jFiHXoYLER6BDh4BAYI5DREIgWYgMIorAQEB X-IronPort-AV: E=Sophos;i="5.24,462,1454972400"; d="scan'208";a="213420865" Received: from mail-ig0-f179.google.com ([209.85.213.179]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/AES128-GCM-SHA256; 11 Apr 2016 14:02:18 +0200 Received: by mail-ig0-f179.google.com with SMTP id gy3so59025272igb.0 for ; Mon, 11 Apr 2016 05:02:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=VdgQY/aHxXBHNQrJ+j+VruJ4QCbHc0uPSMdDnKEGMbU=; b=dJm3svXBNxax1jPXpwqFOwMu8UMVZ/I+XQRfvPmGTc5Y0pI+Xe18ZAdMrgkILr2oj6 P+FChwde8A9Ki9TH9stIJn0Bk7sVPRDYQ34ygE3HLqNpnjMMTe5DMjvPEtJFELqok+G0 HJPWVTP7E9Mz1jxYl1GGy+9PvhSa41HhoReqrcp59KE40pQtTKYEt0IlAWpnAVMzOJCc XLtPLV4/AnTcaQh/4KqjgQpbjb1c0QbFUUD3ZfMaVHiMu4RcfKXBREPMeQrs+k6QBQ4W zdg8zwNNJgOn/3pzX9SNcx9zF+XGpjFXw0AfmJADB/qzwacHykZu5jelkai4WEfQ5gm2 O6uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=VdgQY/aHxXBHNQrJ+j+VruJ4QCbHc0uPSMdDnKEGMbU=; b=lz1ZxY7h0+aSfpcxPXuiyw8GerN2OQBEv1wxy+pFEVALpCTpLe7iGuXUvk9FKa6f3e pnQeLByHHs4QXGOB8py09GIawxyTVrLcdpi9lbfkuWavC7Ei0u/ksLQLk7ZCPCjP2JP8 4LEGqnuxnnRZ3DCclO589o/WraRWc68adc84Vnl2ZifVLgZ2Q3684jerP+PrwITTKS6w 7ZWFkFuXpkb4rzbkyFkU0BeZGpzc5syojT06L4r6qAFxhCqUDoD3PMv5AR6SthZhtNJ3 1ASLR07AITOHj19CZBtkSs7hVYAKr/aGctAnsuT1zUJWhOMtWOl/8Z+dOd5HAKExz9dm ld3g== X-Gm-Message-State: AOPr4FUYgeMroq7GzxiyDTp7wS3mgsCEKGiKXoLgOKBVSx4sljaFS43OwdYzSvSE1k/WUfRXUBNkk/y9mVk16A== X-Received: by 10.50.217.130 with SMTP id oy2mr16032192igc.94.1460376136964; Mon, 11 Apr 2016 05:02:16 -0700 (PDT) MIME-Version: 1.0 Received: by 10.79.17.4 with HTTP; Mon, 11 Apr 2016 05:01:37 -0700 (PDT) In-Reply-To: <1D3284E6-F0BD-49C3-AF8E-F5C49549BBFA@citrix.com> References: <1D3284E6-F0BD-49C3-AF8E-F5C49549BBFA@citrix.com> From: Gabriel Scherer Date: Mon, 11 Apr 2016 08:01:37 -0400 Message-ID: To: Rob Hoes Cc: "caml-list@inria.fr" Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Caml-list] Memory leak in ocaml runtime with backtraces+threads? I did not previously know of that problem, sorry. Could you submit a bugreport on the Mantis bugtracker? http://caml.inria.fr/mantis/ On Mon, Apr 11, 2016 at 7:27 AM, Rob Hoes wrote: > Hello, > > I have noticed that an OCaml program with backtrace recording enabled see= ms to leak memory each time a new thread is created and completes. > > For example, the following program, compiled with the `-g` option, will v= ery quickly eat up all your memory: > > let _ =3D > Printexc.record_backtrace true; > let rec loop () =3D > let t =3D Thread.create (fun () -> > try > raise Not_found > with Not_found -> > () > ) () in > Thread.join t; > loop () > in > loop () > > I=E2=80=99ve tried this on various compilers (4.02.3, 4.01.0 and 3.12.1),= on Linux and Mac, native and bytecode, and see the problem on all of them. > > Valgrind reports that the allocation of `caml_backtrace_buffer` in the fu= nction `caml_stash_backtrace` in asmrun/backtrace_prim.c is the culprit (ht= tps://github.com/ocaml/ocaml/blob/trunk/asmrun/backtrace_prim.c#L98): > > if (caml_backtrace_buffer =3D=3D NULL) { > Assert(caml_backtrace_pos =3D=3D 0); > caml_backtrace_buffer =3D malloc(BACKTRACE_BUFFER_SIZE > * sizeof(backtrace_slot)); > if (caml_backtrace_buffer =3D=3D NULL) return; > } > > The `caml_backtrace_buffer` variable is a global variable initialised to = NULL in byterun/backtrace.c. However, it seems to be local to a thread (how= does it become thread local?), is set to NULL whenever a thread is created= (where?), and a new malloc happens when an exception is raised. It is not = freed when the thread completes. > > Has anyone seen this before, or have suggestions for how to fix it? > > Thanks, > Rob > > > -- > Caml-list mailing list. Subscription management and archives: > https://sympa.inria.fr/sympa/arc/caml-list > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs