Received: (at 27234) by debbugs.gnu.org; 9 Sep 2017 20:44:39 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Sep 09 16:44:39 2017 Received: from localhost ([127.0.0.1]:57959 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1dqmcJ-0007E3-IR for submit <at> debbugs.gnu.org; Sat, 09 Sep 2017 16:44:39 -0400 Received: from mail-lf0-f50.google.com ([209.85.215.50]:34334) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <linasvepstas@HIDDEN>) id 1dqmcI-0007Do-1z for 27234 <at> debbugs.gnu.org; Sat, 09 Sep 2017 16:44:38 -0400 Received: by mail-lf0-f50.google.com with SMTP id l196so11421459lfl.1 for <27234 <at> debbugs.gnu.org>; Sat, 09 Sep 2017 13:44:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:reply-to:from:date:message-id:subject:to; bh=yZ86tWlta7Y5z6FPek4nVjpJC2CgQHZruB5di6MzktU=; b=IZgHi1fMyjx0k4gS9a64BduJ0pSwK2+5xiQYXiK8d5Lu1lLIoGGBC6l3fFeyNwMmJk atnEFPWuuB3NiJlX/XlBSlJ5B6ImHEOKn/l0AgmydoVYMmnkVYB8yFAMIjMYlEHKkzg0 lR8gCuAG1j4ptq4XEMw1040kD9Rn58eQ+8zmteH6QSey+k0c6Zxl7vwkcTHD7HUEEfkb r6UpnFXRdN4rUsFJ7XBiIESppTPQqALwhaQbGvqmWaJ2ZGFj5McNXjBfFh728Ctm1gbU nPOwlxCQVDjl52caBZvDhCyyCp5TZ7PZ8caHXiF+8Wmf0X5PUP6xiv92+Dz7FVbX7qX6 /g1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:reply-to:from:date:message-id :subject:to; bh=yZ86tWlta7Y5z6FPek4nVjpJC2CgQHZruB5di6MzktU=; b=H92KYGGYEo7jP2aTLz70F9Oe2Xb3Oz7lpVTuBv0ik3dPEd75RfWbOX7At0GIu8V8L1 ToRHVUdr5gGDQmnIx8I3HW+msNYVIAAqHV5jCJ6pmipnZtmorQTgl0yNAJ2lMKkyqj8/ Ng25/Ju2uv0fsaiVKMldvFl3uPsS846l3XuxaO93x7iO16rPPfDOCLlctB7OQpqdJZr2 llHgdA7pEBvzU3yDcj4v20kWzETHYRVrbJhMlZQNijFs0zgSL6nm595jaclAhj4eX7t3 OONEB8o4JHmv1K6FLyqGTKZK3APF/+lSKg7z979zgjzTPqldeeKqaKb83r5PnRKrQeTF WaxA== X-Gm-Message-State: AHPjjUi1BVSWaFPuJ8TuRiy/haQ1on6KnNgd54jq4CqlFB9I1q2LQ/tc A6OVggz1r1bn3dOQ41zwkEDS/Yz7DQ== X-Google-Smtp-Source: AOwi7QBUAF4sbtaURAw6Zj1bKmUhi+kUf/9JHRMFy2raexKQqCYSEdHG3p+cTio8BPtZccCQjz4ja7BEGC80lPV+4y0= X-Received: by 10.25.202.23 with SMTP id a23mr1717732lfg.260.1504989871998; Sat, 09 Sep 2017 13:44:31 -0700 (PDT) MIME-Version: 1.0 Received: by 10.25.44.200 with HTTP; Sat, 9 Sep 2017 13:44:11 -0700 (PDT) From: Linas Vepstas <linasvepstas@HIDDEN> Date: Sat, 9 Sep 2017 15:44:11 -0500 Message-ID: <CAHrUA37zT6FU606vJhDD250nByzpkmj9_DBVvNgjXE3PAdf1sg@HIDDEN> Subject: Followup. To: 27234 <at> debbugs.gnu.org Content-Type: multipart/alternative; boundary="f403045ea792b60b930558c7c250" X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 27234 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Reply-To: linasvepstas@HIDDEN Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 0.5 (/) --f403045ea792b60b930558c7c250 Content-Type: text/plain; charset="UTF-8" The original bug report failed to explain how to trigger the bug. I think I know of a simple way to trigger the bug, but have not yet created the simple test-case. I believe that the bug can be triggered like so: Create some medium-sized "random" (arbitrary) snippet of guile code. Send it to the guile repl server. Do it again and again, as fast as possible. The bug will trigger. By "arbitary/random" I mean some code that is simple but non-repeating: say, concatenate some random strings, count the number of letters in them, take the square root -- just do assorted, non-repeating computations that force the REPL to evaluate some new blob of scheme code every time. Now, once out of every 5 or 50 times, introduce a bug in the scheme code, causing the REPL to throw an exception. Using ut8 strings might also be a required ingredient. I believe that this will trigger the bug. I believe that the bug is some unprotected section in the guile interpreter, and a race condition clobbers the guile stack(s) and it all goes downhill from here. --f403045ea792b60b930558c7c250 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><br clear=3D"all"><div>The original bug report failed to e= xplain how to trigger the bug.=C2=A0 I think I know of a simple way to trig= ger the bug, but have not yet created the simple test-case.=C2=A0 I believe= that the bug can be triggered like so:</div><div><br></div><div>Create som= e medium-sized "random" (arbitrary) snippet of guile code. Send i= t to the guile repl server.=C2=A0 Do it again and again, as fast as possibl= e.=C2=A0 The bug will trigger.</div><div><br></div><div>By "arbitary/r= andom" I mean some code that is simple but non-repeating: say, concate= nate some random strings, count the number of letters in them, take the squ= are root -- just do assorted, non-repeating computations that force the REP= L to evaluate some new blob of scheme code every time.</div><div><br></div>= <div>Now, once out of every 5 or 50 times, introduce a bug in the scheme co= de, causing the REPL to throw an exception.=C2=A0 Using ut8 strings might a= lso be a required ingredient.</div><div><br></div><div>I believe that this = will trigger the bug. I believe that the bug is some unprotected section in= the guile interpreter, and a race condition clobbers the guile stack(s) an= d it all goes downhill from here.</div><div><br></div><br> </div> --f403045ea792b60b930558c7c250--
bug-guile@HIDDEN
:bug#27234
; Package guile
.
Full text available.Received: (at submit) by debbugs.gnu.org; 4 Jun 2017 14:58:09 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Jun 04 10:58:09 2017 Received: from localhost ([127.0.0.1]:55940 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1dHWyl-0003iV-44 for submit <at> debbugs.gnu.org; Sun, 04 Jun 2017 10:58:09 -0400 Received: from eggs.gnu.org ([208.118.235.92]:34576) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <linasvepstas@HIDDEN>) id 1dHWyi-0003i0-HI for submit <at> debbugs.gnu.org; Sun, 04 Jun 2017 10:58:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <linasvepstas@HIDDEN>) id 1dHWyX-0006Qk-Qj for submit <at> debbugs.gnu.org; Sun, 04 Jun 2017 10:57:59 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:49184) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from <linasvepstas@HIDDEN>) id 1dHWyX-0006QX-Mn for submit <at> debbugs.gnu.org; Sun, 04 Jun 2017 10:57:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53752) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from <linasvepstas@HIDDEN>) id 1dHWyS-0001Ec-0z for bug-guile@HIDDEN; Sun, 04 Jun 2017 10:57:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <linasvepstas@HIDDEN>) id 1dHWyM-0006IZ-Gc for bug-guile@HIDDEN; Sun, 04 Jun 2017 10:57:48 -0400 Received: from mail-lf0-x22e.google.com ([2a00:1450:4010:c07::22e]:34158) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from <linasvepstas@HIDDEN>) id 1dHWyL-0006Fm-SF for bug-guile@HIDDEN; Sun, 04 Jun 2017 10:57:42 -0400 Received: by mail-lf0-x22e.google.com with SMTP id v20so28785472lfa.1 for <bug-guile@HIDDEN>; Sun, 04 Jun 2017 07:57:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:reply-to:from:date:message-id:subject:to; bh=fDowtPjzhOCoDpRB3nbwureBQp9WCeOO4DHNio7/poM=; b=PjF4HNEygq4jxAHQ3acXy2rdo/AJySclymxcP9U+GU8xK8VsWiNgxPeKVG2OAsO8j7 CFjFJ8E8C0YLJ7cpbwvB8e4fKqh3XtlGKt0ZxkBhdULX16j3SUbjOUa2EMUlCTlMZOoW HKOMjYh6C9n97H+Xctq9sO2y0VQ+nxIuxcpFDZ0433tADDIWBQos6g61c2oM6CtLKJb9 ctLjtVlfZ8vPQqRcyIRNBEwECB9/L3dnutCqek2rIhYsBV06PeMtaKJX3v/D9UWYWBfy lSZKpBqFkW2jnFioCL3KzeKCpF+JtQmXwemBVGPpBEbiOacJa9vUbMfUyK2Whf8CIdoQ vQOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:reply-to:from:date:message-id :subject:to; bh=fDowtPjzhOCoDpRB3nbwureBQp9WCeOO4DHNio7/poM=; b=ja9UeYKg8wV/+4VnywTBHaWkyUko/sUHly9gTpAUYq+aZC0tJ3i6PSJNBddWQ5GqNs YHIgt+P1TIMVpbF0Ubul7NBdwDKkt73Z6qQX+TsYfK+DFrzsF28qz2Trbm89tEHNknkG xWid2SlkXTIBh4Wt+2njhk1MZOjddBWSBqSwkHgMh2h/GGBu+3PoRGm98LNuKgz7HTNe ao5X2OGeAGwvJo5Rfiug6YKG2dIlE/+NasZy1C/1Rp7dT8nLcG74Fhm044uT9xSVX6zA HJr0bIQLCKKNJFSeE1Wk5CYhQ1Amcsq2wB+2AYdXGMMGu4DpaBxVv0brtmSu30BczO63 yI3w== X-Gm-Message-State: AODbwcCNiBkiPqcp26u1/krl06spKbtEXMtLhR8K77aPC/S634IjmfP5 iyrekAUpCY5/DKtRCOXOtTn/fEpNODDL X-Received: by 10.46.14.10 with SMTP id 10mr5021674ljo.25.1496588257697; Sun, 04 Jun 2017 07:57:37 -0700 (PDT) MIME-Version: 1.0 Received: by 10.25.157.70 with HTTP; Sun, 4 Jun 2017 07:57:17 -0700 (PDT) From: Linas Vepstas <linasvepstas@HIDDEN> Date: Sun, 4 Jun 2017 09:57:17 -0500 Message-ID: <CAHrUA361VtW9ZOgEbxTYsDi3K7WY4YVaGA=YAK3VQKSVs8Bc_g@HIDDEN> Subject: Hang in GC, inf loop while walking frame pointers To: bug-guile@HIDDEN Content-Type: multipart/alternative; boundary="f403045ea6d679a79b0551239b33" X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -4.0 (----) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Reply-To: linasvepstas@HIDDEN Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -4.0 (----) --f403045ea6d679a79b0551239b33 Content-Type: text/plain; charset="UTF-8" what: guile-2.2-stable, from git. I've got a large, complex, heavily multi-threaded guile program that hangs during garbage collection; usually after running for half a day. It hangs in a tight loop in scm_i_vm_mark_stack, spinning at 100% of CPU. This is due to the for-loop line fp = SCM_FRAME_DYNAMIC_LINK (fp)) at libguile/vm.c line 975 failing to advance the frame pointer. There's no "obvious" corruption in the stack; it simply looks like the frame was incompletely set up, and so incrementing to the next fp does not go anywhere. I have recompiled guile with VM_ENABLE_ASSERTIONS and am trying to reproduce the bug now. The rest of this email is a record of a long debug session isolating the problem, and showing that, overall, the thread and stack data look more-or-less correct and uncorrupoted, except for the inability to walk forward in the frame. -- linas (gdb) bt #0 scm_i_vm_mark_stack (vp=0x755c1bd0, mark_stack_ptr=0x7f3e9b783f40, mark_stack_limit=0x7f3e9b793eb0) at ../../libguile/vm.c:1011 #1 0x00007f3e9db8835e in GC_mark_from (mark_stack_top=0x7f3e9b783ee0, mark_stack_top@entry=0x7f3e9b783f00, mark_stack=mark_stack@entry=0x7f3e9b783eb0, mark_stack_limit=mark_stack_limit@entry=0x7f3e9b793eb0) at ../mark.c:772 #2 0x00007f3e9db8897e in GC_do_local_mark (local_mark_stack=0x7f3e9b783eb0, local_top=0x7f3e9b783f00) at ../mark.c:1037 #3 0x00007f3e9db88b98 in GC_mark_local ( local_mark_stack=local_mark_stack@entry=0x7f3e9b783eb0, id=id@entry=4) at ../mark.c:1170 #4 0x00007f3e9db88eaa in GC_help_marker (my_mark_no=my_mark_no@entry=80003) at ../mark.c:1238 #5 0x00007f3e9db92e3c in GC_mark_thread (id=<optimized out>) at ../pthread_support.c:380 #6 0x00007f3e9e2ae6ba in start_thread (arg=0x7f3e9b794700) at pthread_create.c:333 #7 0x00007f3e9dfdd82d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 (gdb) step #0 find_slot_map (cache=0x7f3e9b783ab0, ip=0x1) at ../../libguile/vm.c:935 935 if (cache->entries[slot].ip == ip) (gdb) print slot $1 = 0 (gdb) print cache->entries[slot].ip $2 = (scm_t_uint32 *) 0x1 (gdb) print cache->entries[slot].map $4 = (const scm_t_uint8 *) 0x0 (gdb) step scm_i_vm_mark_stack (vp=0x755c1bd0, mark_stack_ptr=0x7f3e9b783f40, mark_stack_limit=0x7f3e9b793eb0) at ../../libguile/vm.c:1011 1011 slot_map = find_slot_map (SCM_FRAME_RETURN_ADDRESS (fp), &cache); (gdb) print fp $5 = (union scm_vm_stack_element *) 0x7f3e94cdee38 #define SCM_FRAME_RETURN_ADDRESS(fp) ((fp)[0].as_ip) (gdb) print (fp)[0].as_ip $6 = (scm_t_uint32 *) 0x1 OK that looks weird ... is this corrupted ?? but whatever, because the returned slot_map is never used ... because ... (gdb) step scm_i_vm_mark_stack (vp=0x755c1bd0, mark_stack_ptr=0x7f3e9b783f40, mark_stack_limit=0x7f3e9b793eb0) at ../../libguile/vm.c:975 975 fp = SCM_FRAME_DYNAMIC_LINK (fp)) (gdb) print fp $7 = (union scm_vm_stack_element *) 0x7f3e94cdee38 frames.h:#define SCM_FRAME_DYNAMIC_LINK(fp) ((fp) + (fp)[1].as_uint) (gdb) print (fp)[1].as_uint $8 = 0 OK, that seems bad, because now fp never advances, it just repeats over and over with this same value. (gdb) 979 for (slot = nlocals - 1; sp < fp; sp++, slot--) (gdb) print nlocals $10 = -2 (gdb) print sp $11 = (union scm_vm_stack_element *) 0x7f3e94cdee48 #define SCM_FRAME_NUM_LOCALS(fp, sp) ((fp) - (sp)) (gdb) print fp $12 = (union scm_vm_stack_element *) 0x7f3e94cdee38 (gdb) print ((fp) - (sp)) $13 = -2 Ohh .. its not -16 because its -2 * sizeof (union scm_vm_stack_element *) so that's OK. So for loops is skipped, it should go to. sp = SCM_FRAME_PREVIOUS_SP (fp); frames.h:#define SCM_FRAME_PREVIOUS_SP(fp) ((fp) + 2) and so now it loops around and repeats. (gdb) print cache $19 = {entries = {{ip = 0x1, map = 0x0}, {ip = 0x0, map = 0x0} <repeats 23 times>, {ip = 0x1a1b5e0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}}} (gdb) print &cache $20 = (struct slot_map_cache *) 0x7f3e9b783ab0 and so the loop repeates forever, because fp = SCM_FRAME_DYNAMIC_LINK (fp) never advances fp, because (fp)[1].as_uint is zero. So where is fp pointing to? recall fp == 0x7f3e94cdee38 (gdb) x/20x 0x7f3e94cdee00 0x7f3e94cdee00: 0x0000000000000904 0x000000000000200c 0x7f3e94cdee10: 0x0000000001a1b7e0 0x0000000001a1b5e0 0x7f3e94cdee20: 0x0000000000000004 0x000000000000200c 0x7f3e94cdee30: 0x0000000000169bd6 0x0000000000000001 0x7f3e94cdee40: 0x0000000000000000 0x000000000192acd0 0x7f3e94cdee50: 0x0000000001fa4bc0 0x0000000001a1c6d0 0x7f3e94cdee60: 0x0000000044507950 0x0000000000000002 0x7f3e94cdee70: 0x000000000005a6f5 0x00000000018febd0 0x7f3e94cdee80: 0x000000006d490d00 0x00007f3e9e97241c 0x7f3e94cdee90: 0x0000000000000002 0x00007f3e9e97241c (gdb) x/s 0x7f3e94cdee60 0x7f3e94cdee60: "PyPD" <<< ?? is this a meaningul string? (gdb) x/s 0x7f3e94cdee81 0x7f3e94cdee81: "\rIm" << how about this ??? So this does not look healthy. How did we get here? (gdb) print vp $21 = (struct scm_vm *) 0x755c1bd0 (gdb) print mark_stack_ptr $22 = (struct GC_ms_entry *) 0x7f3e9b783f40 (gdb) print mark_stack_limit $23 = (struct GC_ms_entry *) 0x7f3e9b793eb0 (gdb) print upper $24 = (void *) 0x7ffdd986 (gdb) print GC_greatest_plausible_heap_addr $25 = (void *) 0x7ffdd986 (gdb) print lower $26 = (void *) 0x17a1ff8 (gdb) print vp->fp $27 = (union scm_vm_stack_element *) 0x7f3e94cdee18 (gdb) print vp->sp $28 = (union scm_vm_stack_element *) 0x7f3e94cdee00 (gdb) print vp->stack_top $29 = (union scm_vm_stack_element *) 0x7f3e94cdf000 So lets walk manually. frames.h:#define SCM_FRAME_DYNAMIC_LINK(fp) ((fp) + (fp)[1].as_uint) (gdb) print (vp->fp) + (vp->fp)[1].as_uint $31 = (union scm_vm_stack_element *) 0x7f3e94cdee38 So we are instanly in trouble! once through the loop, and we've got the broken fp So how did we get here? (gdb) print vp $32 = (struct scm_vm *) 0x755c1bd0 (gdb) print *vp $33 = {ip = 0x7f3e9e5a6378 <subr_stub_code+56>, sp = 0x7f3e94cdee00, fp = 0x7f3e94cdee18, stack_limit = 0x7f3e94cde000, trace_level = 0, sp_min_since_gc = 0x7f3e94cdee00, stack_size = 512, stack_bottom = 0x7f3e94cde000, stack_top = 0x7f3e94cdf000, overflow_handler_stack = 0x304, hooks = {0x4, 0x4, 0x4, 0x4, 0x4}, resumable_prompt_cookie = 0x7f3d397f9440, engine = 1} Looks plausible, not corrupted. Why is engine=1 ?? #define SCM_VM_REGULAR_ENGINE 0 #define SCM_VM_DEBUG_ENGINE 1 #define SCM_VM_NUM_ENGINES 2 # define SCM_I_CURRENT_THREAD (scm_i_current_thread) (gdb) print scm_i_current_thread $34 = (scm_i_thread *) 0x0 OK, that's not excellent. (gdb) print thread_count $35 = 161 (gdb) bt #0 scm_i_vm_mark_stack (vp=0x755c1bd0, mark_stack_ptr=0x7f3e9b783f40, mark_stack_limit=0x7f3e9b793eb0) at ../../libguile/vm.c:1011 #1 0x00007f3e9db8835e in GC_mark_from (mark_stack_top=0x7f3e9b783ee0, mark_stack_top@entry=0x7f3e9b783f00, mark_stack=mark_stack@entry=0x7f3e9b783eb0, mark_stack_limit=mark_stack_limit@entry=0x7f3e9b793eb0) at ../mark.c:772 #2 0x00007f3e9db8897e in GC_do_local_mark (local_mark_stack=0x7f3e9b783eb0, local_top=0x7f3e9b783f00) at ../mark.c:1037 #3 0x00007f3e9db88b98 in GC_mark_local ( local_mark_stack=local_mark_stack@entry=0x7f3e9b783eb0, id=id@entry=4) at ../mark.c:1170 #4 0x00007f3e9db88eaa in GC_help_marker (my_mark_no=my_mark_no@entry=80003) at ../mark.c:1238 #5 0x00007f3e9db92e3c in GC_mark_thread (id=<optimized out>) at ../pthread_support.c:380 #6 0x00007f3e9e2ae6ba in start_thread (arg=0x7f3e9b794700) at pthread_create.c:333 #7 0x00007f3e9dfdd82d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 so bdwgc is version gc7_6_0 So ../mark.c:772 is GET_HDR and GET_HDR is in include/private/gc_hdrs.h define GET_HDR(p, hhdr) ... ((hhdr) = HDR_INNER(p) # define HDR_INNER(p) HDR_FROM_BI(BI(p),p) #define HDR_FROM_BI(bi, p) \ ((bi)->index[((word)(p) >> LOG_HBLKSIZE) & (BOTTOM_SZ - 1)]) This seems all wrong.. wtf .... is it called by thread_mark ?? in libguile/thread.c: thread_gc_kind = GC_new_kind (GC_new_free_list (), GC_MAKE_PROC (GC_new_proc (thread_mark), 0), 0, 1) in bdwgc/misc.c GC_new_proc GC_mark_procs[result] = proc #define GC_mark_procs GC_arrays._mark_procs #define PROC(descr) \ (GC_mark_procs[((descr) >> GC_DS_TAG_BITS) & (GC_MAX_MARK_PROCS-1)]) GC_obj_kinds[result].ok_descriptor = descr; <<< this is where MAKE_PROC goes. anyway ... in mark.c line 733 case GC_DS_PROC: mark_stack_top--; credit -= GC_PROC_BYTES; mark_stack_top = (*PROC(descr))((word *)current_p, mark_stack_top, mark_stack_limit, ENV(descr)); continue; But that's the wrong line number. line 772 is in case GC_DS_PER_OBJECT: if ((signed_word)descr >= 0) { /* Descriptor is in the object. */ descr = *(word *)(current_p + descr - GC_DS_PER_OBJECT); Oh, it goes to retry, which loops around and calls PROC which is thread_mark which is called with args mark_stack_top = (*PROC(descr))((word *)current_p, mark_stack_top, mark_stack_limit, ENV(descr)); (gdb) print current_p $39 = (ptr_t) 0x7225d380 "@\325%r" so back in libguile/threads.c line 84: const struct scm_i_thread *t = (struct scm_i_thread *) addr; (gdb) print *(struct scm_i_thread *) current_p $40 = {next_thread = 0x7225d540, handle = 0x5763f3b0, pthread = 139900934399744, result = 0x4, exited = 0, guile_mode = 1, needs_unregister = 1, wake = 0x0, sleep_cond = {__data = {__lock = 0, __futex = 0, __total_seq = 0, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x0, __nwaiters = 0, __broadcast_seq = 0}, __size = '\000' <repeats 47 times>, __align = 0}, sleep_pipe = {151, 197}, freelists = 0x71cfe800, pointerless_freelists = 0x71cfe780, dynamic_state = 0x71de7900, dynstack = { base = 0x698c3800, top = 0x698c3940, limit = 0x698c3a00}, pending_asyncs = 0x304, block_asyncs = 0, continuation_root = 0x5763f340, continuation_base = 0x7f3d397f9c90, vp = 0x755c1bd0, base = 0x7f3d397f9da0, regs = {{__jmpbuf = {139905204221696, 139906923931021, 1, 139894281647232, 139906913276512, 0, 139906918327551, 8388608}, __mask_was_saved = 964664752, __saved_mask = {__val = {0, 139900934399744, 139900934399744, 139900934397344, 139906923929400, 139893936840720, 1804170656, 139906913276512, 139900934399744, 139900934397344, 139900934397504, 139893936840720, 139906910859134, 139906913276484, 139906910857112, 27401856}}}}} (gdb) print ((struct scm_i_thread *) current_p)->vp $41 = (struct scm_vm *) 0x755c1bd0 which is exactly the vp we had before, so this is the correct thread. So ... all the values in *(struct scm_i_thread *) current_p look more or less OK; its not corrupted. And all the values in *vp look more or less OK, its not corrrupted except that engine=1 looks wrong. So what's up with the weird stack looping? Again: From before, we had: (gdb) print *vp $42 = {ip = 0x7f3e9e5a6378 <subr_stub_code+56>, sp = 0x7f3e94cdee00, fp = 0x7f3e94cdee18, stack_limit = 0x7f3e94cde000, trace_level = 0, sp_min_since_gc = 0x7f3e94cdee00, stack_size = 512, stack_bottom = 0x7f3e94cde000, stack_top = 0x7f3e94cdf000, overflow_handler_stack = 0x304, hooks = {0x4, 0x4, 0x4, 0x4, 0x4}, resumable_prompt_cookie = 0x7f3d397f9440, engine = 1} so fp, sp, stack_bottom, stack_top all are self-consistent with each other. The problem is that fp = SCM_FRAME_DYNAMIC_LINK (fp) goes nowhere, after the first iteration. Is the frame corrupted? How? what does the rest of the stack look like? (gdb) x/32x 0x7f3e94cdee00 0x7f3e94cdee00: 0x0000000000000904 0x000000000000200c 0x7f3e94cdee10: 0x0000000001a1b7e0 0x0000000001a1b5e0 0x7f3e94cdee20: 0x0000000000000004 0x000000000000200c <<< theres the 4 0x7f3e94cdee30: 0x0000000000169bd6 0x0000000000000001 <<< there's the new fp 0x7f3e94cdee40: 0x0000000000000000 0x000000000192acd0 <<< there's the zero. 0x7f3e94cdee50: 0x0000000001fa4bc0 0x0000000001a1c6d0 0x7f3e94cdee60: 0x0000000044507950 0x0000000000000002 0x7f3e94cdee70: 0x000000000005a6f5 0x00000000018febd0 0x7f3e94cdee80: 0x000000006d490d00 0x00007f3e9e97241c 0x7f3e94cdee90: 0x0000000000000002 0x00007f3e9e97241c 0x7f3e94cdeea0: 0x0000000000000002 0x00007f3e8d797630 0x7f3e94cdeeb0: 0x0000000000000002 0x00007f3e86effacc 0x7f3e94cdeec0: 0x0000000000000003 0x000000006d490d00 0x7f3e94cdeed0: 0x00007f3e86eb8698 0x0000000000000002 0x7f3e94cdeee0: 0x00007f3e8e51f450 0x0000000000000008 0x7f3e94cdeef0: 0x0000000001a37c10 0x000000000192acd0 So... who sets up thread->vp ? /* #define VM_ENABLE_ASSERTIONS */ However, defining this breaks the build. diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 6c88ebf..f0f8164 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -2050,11 +2050,11 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp, if (!scm_module_system_booted_p) { - ASSERT (scm_is_true + ASSERT (scm_is_true( scm_equal_p (modname, scm_list_2 (SCM_BOOL_T, - scm_from_utf8_symbol ("guile")))); + scm_from_utf8_symbol ("guile"))))); var = scm_lookup (sym); } else if (scm_is_true (SCM_CAR (modname))) diff --git a/libguile/vm.c b/libguile/vm.c index 18f2192..c26066e 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -63,7 +63,7 @@ static size_t page_size; /* The VM has a number of internal assertions that shouldn't normally be necessary, but might be if you think you found a bug in the VM. */ -/* #define VM_ENABLE_ASSERTIONS */ +#define VM_ENABLE_ASSERTIONS static void vm_expand_stack (struct scm_vm *vp, union scm_vm_stack_element *new_sp) SCM_NOINLINE; GEN guile-procedures.texi /bin/bash: line 1: 24078 Broken pipe ./meta/guile Aborted ./libguile/guile Aborted gdb libguile/.libs/lt-guile #0 0x00007ffff74f7428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54 #1 0x00007ffff74f902a in __GI_abort () at abort.c:89 #2 0x00007ffff7b707c4 in vm_regular_engine (thread=0x7282, vp=0x806f30, registers=0x6, resume=-145787864) at ../../libguile/vm-engine.c:2053 #3 0x00007ffff7b711d2 in scm_call_n (proc=0x832b30, argv=argv@entry=0x0, nargs=nargs@entry=0) at ../../libguile/vm.c:1257 #4 0x00007ffff7af14e9 in scm_call_0 (proc=<optimized out>) at ../../libguile/eval.c:481 #5 0x00007ffff7b10568 in scm_primitive_load_path (args=<optimized out>) at ../../libguile/load.c:1248 #6 0x00007ffff7b6e976 in vm_regular_engine (thread=0x7282, vp=0x806f30, registers=0x6, resume=-145787864) at ../../libguile/vm-engine.c:784 Oh. wtf. (define last-gc (gc-stats)) (define start-time (get-internal-real-time)) (define run-time (get-internal-run-time)) (define (avg-time-taken) (define now (get-internal-real-time)) (define run (get-internal-run-time)) (define cur (gc-stats)) (define gc-time-taken (* 1.0e-9 (- (cdar cur) (cdar last-gc)))) (define elapsed-time (* 1.0e-9 (- now start-time))) (define cpu-time (* 1.0e-9 (- run run-time))) (format #t "Elapsed time: ~5f secs. GC-time-taken: ~5f s or ~5f% cpu-usage: ~5f%\n" elapsed-time gc-time-taken (* 100 (/ gc-time-taken elapsed-time)) (* 100 (/ cpu-time elapsed-time)) ) (set! last-gc cur) (set! start-time now) (set! run-time run) ) linas@fanny: ~/src/novamente/src/opencog-git/opencog/nlp/learn $ vi x linas@fanny: ~/src/novamente/src/opencog-git/opencog/nlp/learn $ cat x #0 find_slot_map (cache=0x7f3e9b783ab0, ip=0x1) at ../../libguile/vm.c:935 935 if (cache->entries[slot].ip == ip) (gdb) print slot $1 = 0 (gdb) print cache->entries[slot].ip $2 = (scm_t_uint32 *) 0x1 (gdb) print cache->entries[slot].map $4 = (const scm_t_uint8 *) 0x0 (gdb) step scm_i_vm_mark_stack (vp=0x755c1bd0, mark_stack_ptr=0x7f3e9b783f40, mark_stack_limit=0x7f3e9b793eb0) at ../../libguile/vm.c:1011 1011 slot_map = find_slot_map (SCM_FRAME_RETURN_ADDRESS (fp), &cache); (gdb) print fp $5 = (union scm_vm_stack_element *) 0x7f3e94cdee38 #define SCM_FRAME_RETURN_ADDRESS(fp) ((fp)[0].as_ip) (gdb) print (fp)[0].as_ip $6 = (scm_t_uint32 *) 0x1 OK that looks weird ... is this corrupted ?? but whatever, because the returned slot_map is never used ... because ... (gdb) step scm_i_vm_mark_stack (vp=0x755c1bd0, mark_stack_ptr=0x7f3e9b783f40, mark_stack_limit=0x7f3e9b793eb0) at ../../libguile/vm.c:975 975 fp = SCM_FRAME_DYNAMIC_LINK (fp)) (gdb) print fp $7 = (union scm_vm_stack_element *) 0x7f3e94cdee38 frames.h:#define SCM_FRAME_DYNAMIC_LINK(fp) ((fp) + (fp)[1].as_uint) (gdb) print (fp)[1].as_uint $8 = 0 OK, that seems bad, because now fp never advances, it just repeats over and over with this same value. (gdb) 979 for (slot = nlocals - 1; sp < fp; sp++, slot--) (gdb) print nlocals $10 = -2 (gdb) print sp $11 = (union scm_vm_stack_element *) 0x7f3e94cdee48 #define SCM_FRAME_NUM_LOCALS(fp, sp) ((fp) - (sp)) (gdb) print fp $12 = (union scm_vm_stack_element *) 0x7f3e94cdee38 (gdb) print ((fp) - (sp)) $13 = -2 Ohh .. its not -16 because its -2 * sizeof (union scm_vm_stack_element *) so that's OK. So for loops is skipped, it should go to. sp = SCM_FRAME_PREVIOUS_SP (fp); frames.h:#define SCM_FRAME_PREVIOUS_SP(fp) ((fp) + 2) and so now it loops around and repeats. (gdb) print cache $19 = {entries = {{ip = 0x1, map = 0x0}, {ip = 0x0, map = 0x0} <repeats 23 times>, {ip = 0x1a1b5e0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}, {ip = 0x0, map = 0x0}}} (gdb) print &cache $20 = (struct slot_map_cache *) 0x7f3e9b783ab0 and so the loop repeates forever, because fp = SCM_FRAME_DYNAMIC_LINK (fp) never advances fp, because (fp)[1].as_uint is zero. So where is fp pointing to? recall fp == 0x7f3e94cdee38 (gdb) x/20x 0x7f3e94cdee00 0x7f3e94cdee00: 0x0000000000000904 0x000000000000200c 0x7f3e94cdee10: 0x0000000001a1b7e0 0x0000000001a1b5e0 0x7f3e94cdee20: 0x0000000000000004 0x000000000000200c 0x7f3e94cdee30: 0x0000000000169bd6 0x0000000000000001 0x7f3e94cdee40: 0x0000000000000000 0x000000000192acd0 0x7f3e94cdee50: 0x0000000001fa4bc0 0x0000000001a1c6d0 0x7f3e94cdee60: 0x0000000044507950 0x0000000000000002 0x7f3e94cdee70: 0x000000000005a6f5 0x00000000018febd0 0x7f3e94cdee80: 0x000000006d490d00 0x00007f3e9e97241c 0x7f3e94cdee90: 0x0000000000000002 0x00007f3e9e97241c (gdb) x/s 0x7f3e94cdee60 0x7f3e94cdee60: "PyPD" <<< ?? is this a meaningul string? (gdb) x/s 0x7f3e94cdee81 0x7f3e94cdee81: "\rIm" << how about this ??? So this does not look healthy. How did we get here? (gdb) print vp $21 = (struct scm_vm *) 0x755c1bd0 (gdb) print mark_stack_ptr $22 = (struct GC_ms_entry *) 0x7f3e9b783f40 (gdb) print mark_stack_limit $23 = (struct GC_ms_entry *) 0x7f3e9b793eb0 (gdb) print upper $24 = (void *) 0x7ffdd986 (gdb) print GC_greatest_plausible_heap_addr $25 = (void *) 0x7ffdd986 (gdb) print lower $26 = (void *) 0x17a1ff8 (gdb) print vp->fp $27 = (union scm_vm_stack_element *) 0x7f3e94cdee18 (gdb) print vp->sp $28 = (union scm_vm_stack_element *) 0x7f3e94cdee00 (gdb) print vp->stack_top $29 = (union scm_vm_stack_element *) 0x7f3e94cdf000 So lets walk manually. frames.h:#define SCM_FRAME_DYNAMIC_LINK(fp) ((fp) + (fp)[1].as_uint) (gdb) print (vp->fp) + (vp->fp)[1].as_uint $31 = (union scm_vm_stack_element *) 0x7f3e94cdee38 So we are instanly in trouble! once through the loop, and we've got the broken fp So how did we get here? (gdb) print vp $32 = (struct scm_vm *) 0x755c1bd0 (gdb) print *vp $33 = {ip = 0x7f3e9e5a6378 <subr_stub_code+56>, sp = 0x7f3e94cdee00, fp = 0x7f3e94cdee18, stack_limit = 0x7f3e94cde000, trace_level = 0, sp_min_since_gc = 0x7f3e94cdee00, stack_size = 512, stack_bottom = 0x7f3e94cde000, stack_top = 0x7f3e94cdf000, overflow_handler_stack = 0x304, hooks = {0x4, 0x4, 0x4, 0x4, 0x4}, resumable_prompt_cookie = 0x7f3d397f9440, engine = 1} Looks plausible, not corrupted. Why is engine=1 ?? #define SCM_VM_REGULAR_ENGINE 0 #define SCM_VM_DEBUG_ENGINE 1 #define SCM_VM_NUM_ENGINES 2 # define SCM_I_CURRENT_THREAD (scm_i_current_thread) (gdb) print scm_i_current_thread $34 = (scm_i_thread *) 0x0 OK, that's not excellent. (gdb) print thread_count $35 = 161 (gdb) bt #0 scm_i_vm_mark_stack (vp=0x755c1bd0, mark_stack_ptr=0x7f3e9b783f40, mark_stack_limit=0x7f3e9b793eb0) at ../../libguile/vm.c:1011 #1 0x00007f3e9db8835e in GC_mark_from (mark_stack_top=0x7f3e9b783ee0, mark_stack_top@entry=0x7f3e9b783f00, mark_stack=mark_stack@entry=0x7f3e9b783eb0, mark_stack_limit=mark_stack_limit@entry=0x7f3e9b793eb0) at ../mark.c:772 #2 0x00007f3e9db8897e in GC_do_local_mark (local_mark_stack=0x7f3e9b783eb0, local_top=0x7f3e9b783f00) at ../mark.c:1037 #3 0x00007f3e9db88b98 in GC_mark_local ( local_mark_stack=local_mark_stack@entry=0x7f3e9b783eb0, id=id@entry=4) at ../mark.c:1170 #4 0x00007f3e9db88eaa in GC_help_marker (my_mark_no=my_mark_no@entry=80003) at ../mark.c:1238 #5 0x00007f3e9db92e3c in GC_mark_thread (id=<optimized out>) at ../pthread_support.c:380 #6 0x00007f3e9e2ae6ba in start_thread (arg=0x7f3e9b794700) at pthread_create.c:333 #7 0x00007f3e9dfdd82d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109 so bdwgc is version gc7_6_0 So ../mark.c:772 is GET_HDR and GET_HDR is in include/private/gc_hdrs.h define GET_HDR(p, hhdr) ... ((hhdr) = HDR_INNER(p) # define HDR_INNER(p) HDR_FROM_BI(BI(p),p) #define HDR_FROM_BI(bi, p) \ ((bi)->index[((word)(p) >> LOG_HBLKSIZE) & (BOTTOM_SZ - 1)]) This seems all wrong.. wtf .... is it called by thread_mark ?? in libguile/thread.c: thread_gc_kind = GC_new_kind (GC_new_free_list (), GC_MAKE_PROC (GC_new_proc (thread_mark), 0), 0, 1) in bdwgc/misc.c GC_new_proc GC_mark_procs[result] = proc #define GC_mark_procs GC_arrays._mark_procs #define PROC(descr) \ (GC_mark_procs[((descr) >> GC_DS_TAG_BITS) & (GC_MAX_MARK_PROCS-1)]) GC_obj_kinds[result].ok_descriptor = descr; <<< this is where MAKE_PROC goes. anyway ... in mark.c line 733 case GC_DS_PROC: mark_stack_top--; credit -= GC_PROC_BYTES; mark_stack_top = (*PROC(descr))((word *)current_p, mark_stack_top, mark_stack_limit, ENV(descr)); continue; But that's the wrong line number. line 772 is in case GC_DS_PER_OBJECT: if ((signed_word)descr >= 0) { /* Descriptor is in the object. */ descr = *(word *)(current_p + descr - GC_DS_PER_OBJECT); Oh, it goes to retry, which loops around and calls PROC which is thread_mark which is called with args mark_stack_top = (*PROC(descr))((word *)current_p, mark_stack_top, mark_stack_limit, ENV(descr)); (gdb) print current_p $39 = (ptr_t) 0x7225d380 "@\325%r" so back in libguile/threads.c line 84: const struct scm_i_thread *t = (struct scm_i_thread *) addr; (gdb) print *(struct scm_i_thread *) current_p $40 = {next_thread = 0x7225d540, handle = 0x5763f3b0, pthread = 139900934399744, result = 0x4, exited = 0, guile_mode = 1, needs_unregister = 1, wake = 0x0, sleep_cond = {__data = {__lock = 0, __futex = 0, __total_seq = 0, __wakeup_seq = 0, __woken_seq = 0, __mutex = 0x0, __nwaiters = 0, __broadcast_seq = 0}, __size = '\000' <repeats 47 times>, __align = 0}, sleep_pipe = {151, 197}, freelists = 0x71cfe800, pointerless_freelists = 0x71cfe780, dynamic_state = 0x71de7900, dynstack = { base = 0x698c3800, top = 0x698c3940, limit = 0x698c3a00}, pending_asyncs = 0x304, block_asyncs = 0, continuation_root = 0x5763f340, continuation_base = 0x7f3d397f9c90, vp = 0x755c1bd0, base = 0x7f3d397f9da0, regs = {{__jmpbuf = {139905204221696, 139906923931021, 1, 139894281647232, 139906913276512, 0, 139906918327551, 8388608}, __mask_was_saved = 964664752, __saved_mask = {__val = {0, 139900934399744, 139900934399744, 139900934397344, 139906923929400, 139893936840720, 1804170656, 139906913276512, 139900934399744, 139900934397344, 139900934397504, 139893936840720, 139906910859134, 139906913276484, 139906910857112, 27401856}}}}} (gdb) print ((struct scm_i_thread *) current_p)->vp $41 = (struct scm_vm *) 0x755c1bd0 which is exactly the vp we had before, so this is the correct thread. So ... all the values in *(struct scm_i_thread *) current_p look more or less OK; its not corrupted. And all the values in *vp look more or less OK, its not corrrupted except that engine=1 looks wrong. So what's up with the weird stack looping? Again: From before, we had: (gdb) print *vp $42 = {ip = 0x7f3e9e5a6378 <subr_stub_code+56>, sp = 0x7f3e94cdee00, fp = 0x7f3e94cdee18, stack_limit = 0x7f3e94cde000, trace_level = 0, sp_min_since_gc = 0x7f3e94cdee00, stack_size = 512, stack_bottom = 0x7f3e94cde000, stack_top = 0x7f3e94cdf000, overflow_handler_stack = 0x304, hooks = {0x4, 0x4, 0x4, 0x4, 0x4}, resumable_prompt_cookie = 0x7f3d397f9440, engine = 1} so fp, sp, stack_bottom, stack_top all are self-consistent with each other. The problem is that fp = SCM_FRAME_DYNAMIC_LINK (fp) goes nowhere, after the first iteration. Is the frame corrupted? How? what does the rest of the stack look like? (gdb) x/32x 0x7f3e94cdee00 0x7f3e94cdee00: 0x0000000000000904 0x000000000000200c 0x7f3e94cdee10: 0x0000000001a1b7e0 0x0000000001a1b5e0 0x7f3e94cdee20: 0x0000000000000004 0x000000000000200c <<< theres the 4 0x7f3e94cdee30: 0x0000000000169bd6 0x0000000000000001 <<< there's the new fp 0x7f3e94cdee40: 0x0000000000000000 0x000000000192acd0 <<< there's the zero. 0x7f3e94cdee50: 0x0000000001fa4bc0 0x0000000001a1c6d0 0x7f3e94cdee60: 0x0000000044507950 0x0000000000000002 0x7f3e94cdee70: 0x000000000005a6f5 0x00000000018febd0 0x7f3e94cdee80: 0x000000006d490d00 0x00007f3e9e97241c 0x7f3e94cdee90: 0x0000000000000002 0x00007f3e9e97241c 0x7f3e94cdeea0: 0x0000000000000002 0x00007f3e8d797630 0x7f3e94cdeeb0: 0x0000000000000002 0x00007f3e86effacc 0x7f3e94cdeec0: 0x0000000000000003 0x000000006d490d00 0x7f3e94cdeed0: 0x00007f3e86eb8698 0x0000000000000002 0x7f3e94cdeee0: 0x00007f3e8e51f450 0x0000000000000008 0x7f3e94cdeef0: 0x0000000001a37c10 0x000000000192acd0 So... who sets up thread->vp ? /* #define VM_ENABLE_ASSERTIONS */ However, defining this breaks the build. diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 6c88ebf..f0f8164 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -2050,11 +2050,11 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp, if (!scm_module_system_booted_p) { - ASSERT (scm_is_true + ASSERT (scm_is_true( scm_equal_p (modname, scm_list_2 (SCM_BOOL_T, - scm_from_utf8_symbol ("guile")))); + scm_from_utf8_symbol ("guile"))))); var = scm_lookup (sym); } else if (scm_is_true (SCM_CAR (modname))) diff --git a/libguile/vm.c b/libguile/vm.c index 18f2192..c26066e 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -63,7 +63,7 @@ static size_t page_size; /* The VM has a number of internal assertions that shouldn't normally be necessary, but might be if you think you found a bug in the VM. */ -/* #define VM_ENABLE_ASSERTIONS */ +#define VM_ENABLE_ASSERTIONS static void vm_expand_stack (struct scm_vm *vp, union scm_vm_stack_element *new_sp) SCM_NOINLINE; GEN guile-procedures.texi /bin/bash: line 1: 24078 Broken pipe ./meta/guile Aborted ./libguile/guile Aborted gdb libguile/.libs/lt-guile #0 0x00007ffff74f7428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54 #1 0x00007ffff74f902a in __GI_abort () at abort.c:89 #2 0x00007ffff7b707c4 in vm_regular_engine (thread=0x7282, vp=0x806f30, registers=0x6, resume=-145787864) at ../../libguile/vm-engine.c:2053 #3 0x00007ffff7b711d2 in scm_call_n (proc=0x832b30, argv=argv@entry=0x0, nargs=nargs@entry=0) at ../../libguile/vm.c:1257 #4 0x00007ffff7af14e9 in scm_call_0 (proc=<optimized out>) at ../../libguile/eval.c:481 #5 0x00007ffff7b10568 in scm_primitive_load_path (args=<optimized out>) at ../../libguile/load.c:1248 #6 0x00007ffff7b6e976 in vm_regular_engine (thread=0x7282, vp=0x806f30, registers=0x6, resume=-145787864) at ../../libguile/vm-engine.c:784 --f403045ea6d679a79b0551239b33 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div>what: guile-2.2-stable, from git.<br><br>I've got= a large, complex, heavily multi-threaded guile program that<br>hangs durin= g garbage collection; usually after running for half a day.<br>It hangs in = a tight loop in scm_i_vm_mark_stack, spinning at 100% of CPU.<br><br>This i= s due to the for-loop line fp =3D SCM_FRAME_DYNAMIC_LINK (fp))<br>at libgui= le/vm.c line 975 failing to advance the frame pointer.<br>There's no &q= uot;obvious" corruption in the stack; it simply looks like<br>the fram= e was incompletely set up, and so incrementing to the next<br>fp does not g= o anywhere.<br><br>I have recompiled guile with VM_ENABLE_ASSERTIONS and am= trying to<br>reproduce the bug now.=C2=A0 The rest of this email is a reco= rd of a long<br>debug session isolating the problem, and showing that, over= all, the<br>thread and stack data look more-or-less correct and uncorrupote= d,<br>except for the inability to walk forward in the frame.<br><br>-- lina= s<br><br>(gdb) bt<br>#0=C2=A0 scm_i_vm_mark_stack (vp=3D0x755c1bd0, mark_st= ack_ptr=3D0x7f3e9b783f40,<br>=C2=A0=C2=A0=C2=A0 mark_stack_limit=3D0x7f3e9b= 793eb0) at ../../libguile/vm.c:1011<br>#1=C2=A0 0x00007f3e9db8835e in GC_ma= rk_from (mark_stack_top=3D0x7f3e9b783ee0,<br>=C2=A0=C2=A0=C2=A0 mark_stack_= top@entry=3D0x7f3e9b783f00,<br>=C2=A0=C2=A0=C2=A0 mark_stack=3Dmark_stack@e= ntry=3D0x7f3e9b783eb0,<br>=C2=A0=C2=A0=C2=A0 mark_stack_limit=3Dmark_stack_= limit@entry=3D0x7f3e9b793eb0) at ../mark.c:772<br>#2=C2=A0 0x00007f3e9db889= 7e in GC_do_local_mark (local_mark_stack=3D0x7f3e9b783eb0,<br>=C2=A0=C2=A0= =C2=A0 local_top=3D0x7f3e9b783f00) at ../mark.c:1037<br>#3=C2=A0 0x00007f3e= 9db88b98 in GC_mark_local (<br>=C2=A0=C2=A0=C2=A0 local_mark_stack=3Dlocal_= mark_stack@entry=3D0x7f3e9b783eb0, id=3Did@entry=3D4)<br>=C2=A0=C2=A0=C2=A0= at ../mark.c:1170<br>#4=C2=A0 0x00007f3e9db88eaa in GC_help_marker (my_mar= k_no=3Dmy_mark_no@entry=3D80003)<br>=C2=A0=C2=A0=C2=A0 at ../mark.c:1238<br= >#5=C2=A0 0x00007f3e9db92e3c in GC_mark_thread (id=3D<optimized out>)= <br>=C2=A0=C2=A0=C2=A0 at ../pthread_support.c:380<br>#6=C2=A0 0x00007f3e9e= 2ae6ba in start_thread (arg=3D0x7f3e9b794700)<br>=C2=A0=C2=A0=C2=A0 at pthr= ead_create.c:333<br>#7=C2=A0 0x00007f3e9dfdd82d in clone ()<br>=C2=A0=C2=A0= =C2=A0 at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109<br><br></div>(gdb) = step<br><div><br>#0=C2=A0 find_slot_map (cache=3D0x7f3e9b783ab0, ip=3D0x1) = at<br>../../libguile/vm.c:935<br>935=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if= (cache->entries[slot].ip =3D=3D ip)<br>(gdb) print slot<br>$1 =3D 0<br>= (gdb) print cache->entries[slot].ip<br>$2 =3D (scm_t_uint32 *) 0x1<br>(g= db) print cache->entries[slot].map<br>$4 =3D (const scm_t_uint8 *) 0x0<b= r>(gdb) step<br>scm_i_vm_mark_stack (vp=3D0x755c1bd0, mark_stack_ptr=3D0x7f= 3e9b783f40, <br>=C2=A0=C2=A0=C2=A0 mark_stack_limit=3D0x7f3e9b793eb0) at ..= /../libguile/vm.c:1011<br>1011=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 sl= ot_map =3D find_slot_map (SCM_FRAME_RETURN_ADDRESS (fp), &cache);<br>(g= db) print fp<br>$5 =3D (union scm_vm_stack_element *) 0x7f3e94cdee38<br><br= >#define SCM_FRAME_RETURN_ADDRESS(fp)=C2=A0=C2=A0=C2=A0 ((fp)[0].as_ip)<br>= (gdb) print (fp)[0].as_ip<br>$6 =3D (scm_t_uint32 *) 0x1<br><br>OK that loo= ks weird ... is this corrupted ?? but whatever,<br>because the returned slo= t_map is never used ... because ...<br><br>(gdb) step<br>scm_i_vm_mark_stac= k (vp=3D0x755c1bd0, mark_stack_ptr=3D0x7f3e9b783f40, <br>=C2=A0=C2=A0=C2=A0= mark_stack_limit=3D0x7f3e9b793eb0) at ../../libguile/vm.c:975<br>975=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 fp =3D SCM_FRA= ME_DYNAMIC_LINK (fp))<br>(gdb) print fp<br>$7 =3D (union scm_vm_stack_eleme= nt *) 0x7f3e94cdee38<br><br>frames.h:#define SCM_FRAME_DYNAMIC_LINK(fp)=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 ((fp) + (fp)[1].as_uint)<br>(gdb) print (fp)[1]= .as_uint<br>$8 =3D 0<br><br>OK, that seems bad, because now fp never advanc= es, it just repeats<br>over and over with this same value.<br><br>(gdb) <br= >979=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (slot = =3D nlocals - 1; sp < fp; sp++, slot--)<br>(gdb) print nlocals<br>$10 = =3D -2<br>(gdb) print sp<br>$11 =3D (union scm_vm_stack_element *) 0x7f3e94= cdee48<br>#define SCM_FRAME_NUM_LOCALS(fp, sp)=C2=A0=C2=A0=C2=A0 ((fp) - (s= p))<br>(gdb) print fp<br>$12 =3D (union scm_vm_stack_element *) 0x7f3e94cde= e38<br>(gdb) print=C2=A0 ((fp) - (sp))<br>$13 =3D -2<br>Ohh .. its not -16 = because its -2 * sizeof (union scm_vm_stack_element *)<br>so that's OK.= <br>So for loops is skipped, it should go to.<br>=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 sp =3D SCM_FRAME_PREVIOUS_SP (fp);<br>frames.h:#define SCM_FRAME_PRE= VIOUS_SP(fp)=C2=A0=C2=A0=C2=A0 ((fp) + 2)<br><br>and so now it loops around= and repeats.<br>(gdb) print cache<br>$19 =3D {entries =3D {{ip =3D 0x1, ma= p =3D 0x0}, {ip =3D 0x0, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 map =3D 0x0} &l= t;repeats 23 times>, {ip =3D 0x1a1b5e0, map =3D 0x0}, {ip =3D 0x0, <br>= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 map =3D 0x0}, {ip =3D 0x0, map =3D 0x0}, {ip= =3D 0x0, map =3D 0x0}, {ip =3D 0x0, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 map= =3D 0x0}, {ip =3D 0x0, map =3D 0x0}, {ip =3D 0x0, map =3D 0x0}, {ip =3D 0x= 0, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 map =3D 0x0}}}<br>(gdb) print &ca= che<br>$20 =3D (struct slot_map_cache *) 0x7f3e9b783ab0<br><br>and so the l= oop repeates forever, because <br>fp =3D SCM_FRAME_DYNAMIC_LINK (fp) never = advances fp, because<br>(fp)[1].as_uint=C2=A0 is zero.<br><br>So where is f= p pointing to?=C2=A0 recall fp =3D=3D 0x7f3e94cdee38<br><br>(gdb) x/20x 0x7= f3e94cdee00<br>0x7f3e94cdee00: 0x0000000000000904=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0x000000000000200c<br>0x7f3e94cdee10: 0x0000000001a1b7e0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 0x0000000001a1b5e0<br>0x7f3e94cdee20: 0x0000000000000004= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000000000200c<br>0x7f3e94cdee30: 0x0000= 000000169bd6=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000000000001<br>0x7f3e94cd= ee40: 0x0000000000000000=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000000192acd0<b= r>0x7f3e94cdee50: 0x0000000001fa4bc0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000= 0001a1c6d0<br>0x7f3e94cdee60: 0x0000000044507950=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 0x0000000000000002<br>0x7f3e94cdee70: 0x000000000005a6f5=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0x00000000018febd0<br>0x7f3e94cdee80: 0x000000006d490d00=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0x00007f3e9e97241c<br>0x7f3e94cdee90: 0x0000000= 000000002=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x00007f3e9e97241c<br><br><br>(gdb)= x/s 0x7f3e94cdee60<br>0x7f3e94cdee60: "PyPD"=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 <<< ?? is this a meaningul string?<br>(gdb) x/s 0x7f3= e94cdee81<br>0x7f3e94cdee81: "\rIm"=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= << how about this ???<br><br>So this does not look healthy.=C2=A0 Ho= w did we get here?<br><br>(gdb) print vp<br>$21 =3D (struct scm_vm *) 0x755= c1bd0<br>(gdb) print mark_stack_ptr<br>$22 =3D (struct GC_ms_entry *) 0x7f3= e9b783f40<br>(gdb) print mark_stack_limit<br>$23 =3D (struct GC_ms_entry *)= 0x7f3e9b793eb0<br>(gdb) print upper<br>$24 =3D (void *) 0x7ffdd986<br>(gdb= ) print GC_greatest_plausible_heap_addr<br>$25 =3D (void *) 0x7ffdd986<br>(= gdb) print lower<br>$26 =3D (void *) 0x17a1ff8<br><br>(gdb) print vp->fp= <br>$27 =3D (union scm_vm_stack_element *) 0x7f3e94cdee18<br>(gdb) print vp= ->sp<br>$28 =3D (union scm_vm_stack_element *) 0x7f3e94cdee00<br>(gdb) p= rint=C2=A0 vp->stack_top<br>$29 =3D (union scm_vm_stack_element *) 0x7f3= e94cdf000<br><br>So lets walk manually. <br>frames.h:#define SCM_FRAME_DYNA= MIC_LINK(fp)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ((fp) + (fp)[1].as_uint)<br><br>= (gdb) print (vp->fp) + (vp->fp)[1].as_uint<br>$31 =3D (union scm_vm_s= tack_element *) 0x7f3e94cdee38<br>So we are instanly in trouble! once throu= gh the loop, and we've got the broken fp<br><br>So how did we get here?= <br><br>(gdb) print vp<br>$32 =3D (struct scm_vm *) 0x755c1bd0<br>(gdb) pri= nt *vp<br>$33 =3D {ip =3D 0x7f3e9e5a6378 <subr_stub_code+56>, sp =3D = 0x7f3e94cdee00, <br>=C2=A0 fp =3D 0x7f3e94cdee18, stack_limit =3D 0x7f3e94c= de000, trace_level =3D 0, <br>=C2=A0 sp_min_since_gc =3D 0x7f3e94cdee00, st= ack_size =3D 512, <br>=C2=A0 stack_bottom =3D 0x7f3e94cde000, stack_top =3D= 0x7f3e94cdf000, <br>=C2=A0 overflow_handler_stack =3D 0x304, hooks =3D {0x= 4, 0x4, 0x4, 0x4, 0x4}, <br>=C2=A0 resumable_prompt_cookie =3D 0x7f3d397f94= 40, engine =3D 1}<br><br>Looks plausible, not corrupted. Why is engine=3D1 = ?? <br>#define SCM_VM_REGULAR_ENGINE 0<br>#define SCM_VM_DEBUG_ENGINE 1<br>= #define SCM_VM_NUM_ENGINES 2<br>#=C2=A0 define SCM_I_CURRENT_THREAD (scm_i_= current_thread)<br><br>(gdb) print scm_i_current_thread<br>$34 =3D (scm_i_t= hread *) 0x0<br><br>OK, that's not excellent.<br>(gdb) print thread_cou= nt<br>$35 =3D 161<br><br>(gdb) bt<br>#0=C2=A0 scm_i_vm_mark_stack (vp=3D0x7= 55c1bd0, mark_stack_ptr=3D0x7f3e9b783f40, <br>=C2=A0=C2=A0=C2=A0 mark_stack= _limit=3D0x7f3e9b793eb0) at ../../libguile/vm.c:1011<br>#1=C2=A0 0x00007f3e= 9db8835e in GC_mark_from (mark_stack_top=3D0x7f3e9b783ee0, <br>=C2=A0=C2=A0= =C2=A0 mark_stack_top@entry=3D0x7f3e9b783f00, <br>=C2=A0=C2=A0=C2=A0 mark_s= tack=3Dmark_stack@entry=3D0x7f3e9b783eb0, <br>=C2=A0=C2=A0=C2=A0 mark_stack= _limit=3Dmark_stack_limit@entry=3D0x7f3e9b793eb0) at ../mark.c:772<br>#2=C2= =A0 0x00007f3e9db8897e in GC_do_local_mark (local_mark_stack=3D0x7f3e9b783e= b0, <br>=C2=A0=C2=A0=C2=A0 local_top=3D0x7f3e9b783f00) at ../mark.c:1037<br= >#3=C2=A0 0x00007f3e9db88b98 in GC_mark_local (<br>=C2=A0=C2=A0=C2=A0 local= _mark_stack=3Dlocal_mark_stack@entry=3D0x7f3e9b783eb0, id=3Did@entry=3D4)<b= r>=C2=A0=C2=A0=C2=A0 at ../mark.c:1170<br>#4=C2=A0 0x00007f3e9db88eaa in GC= _help_marker (my_mark_no=3Dmy_mark_no@entry=3D80003)<br>=C2=A0=C2=A0=C2=A0 = at ../mark.c:1238<br>#5=C2=A0 0x00007f3e9db92e3c in GC_mark_thread (id=3D&l= t;optimized out>)<br>=C2=A0=C2=A0=C2=A0 at ../pthread_support.c:380<br>#= 6=C2=A0 0x00007f3e9e2ae6ba in start_thread (arg=3D0x7f3e9b794700)<br>=C2=A0= =C2=A0=C2=A0 at pthread_create.c:333<br>#7=C2=A0 0x00007f3e9dfdd82d in clon= e ()<br>=C2=A0=C2=A0=C2=A0 at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109= <br><br>so bdwgc is version gc7_6_0<br><br>So ../mark.c:772 is GET_HDR and = GET_HDR is in<br>include/private/gc_hdrs.h<br><br>define GET_HDR(p, hhdr)= =C2=A0 ... ((hhdr) =3D HDR_INNER(p) <br># define HDR_INNER(p) HDR_FROM_BI(B= I(p),p)<br>#define HDR_FROM_BI(bi, p) \<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ((bi)->inde= x[((word)(p) >> LOG_HBLKSIZE) & (BOTTOM_SZ - 1)])<br><br>This see= ms all wrong.. wtf ....<br><br>is it called by thread_mark ??<br>in libguil= e/thread.c:<br>=C2=A0 thread_gc_kind =3D<br>=C2=A0=C2=A0=C2=A0 GC_new_kind = (GC_new_free_list (),<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GC_MAKE_PROC = (GC_new_proc (thread_mark), 0),<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0, = 1)<br>in bdwgc/misc.c=C2=A0 GC_new_proc<br>=C2=A0=C2=A0=C2=A0 GC_mark_procs= [result] =3D proc<br>#define GC_mark_procs GC_arrays._mark_procs<br>#define= PROC(descr) \<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (GC_mark_procs[((descr) &g= t;> GC_DS_TAG_BITS) & (GC_MAX_MARK_PROCS-1)])<br><br>=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 GC_obj_kinds[result].ok_descriptor =3D descr;=C2=A0 <<= ;< this is where MAKE_PROC goes.<br><br>anyway ... in mark.c line 733<br= >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 case GC_DS_PROC:<br>=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 mark_stack_top--;<br>=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 credit -=3D GC_PROC_BYTES;= <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 mark_stack_top = =3D (*PROC(descr))((word *)current_p, mark_stack_top,<br>=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 mark_stack_limit, ENV(descr));<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 continue;<br>But that's the wrong line number.=C2=A0= line 772 is in <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 case GC_DS_P= ER_OBJECT:<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if ((s= igned_word)descr >=3D 0) {<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 /* Descriptor is in the object.=C2=A0=C2=A0=C2=A0= =C2=A0 */<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 descr =3D *(word *)(current_p + descr - GC_DS_PER_OBJECT);<br><br>Oh= , it goes to retry, which loops around and calls PROC which is thread_mark<= br>which is called with args <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 mark_stack_top =3D (*PROC(descr))((word *)current_p, mark_stac= k_top,<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 mark_stack_limit, ENV(descr));<br><br>(gd= b) print current_p<br>$39 =3D (ptr_t) 0x7225d380 "@\325%r"<br><br= >so back in libguile/threads.c line 84:<br>=C2=A0 const struct scm_i_thread= *t =3D (struct scm_i_thread *) addr;<br><br>(gdb) print *(struct scm_i_thr= ead *) current_p<br>$40 =3D {next_thread =3D 0x7225d540, handle =3D 0x5763f= 3b0, pthread =3D 139900934399744, <br>=C2=A0 result =3D 0x4, exited =3D 0, = guile_mode =3D 1, needs_unregister =3D 1, wake =3D 0x0, <br>=C2=A0 sleep_co= nd =3D {__data =3D {__lock =3D 0, __futex =3D 0, __total_seq =3D 0, <br>=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 __wakeup_seq =3D 0, __woken_seq =3D 0, __mutex = =3D 0x0, __nwaiters =3D 0, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 __broadcast_s= eq =3D 0}, __size =3D '\000' <repeats 47 times>, __align =3D = 0}, <br>=C2=A0 sleep_pipe =3D {151, 197}, freelists =3D 0x71cfe800, <br>=C2= =A0 pointerless_freelists =3D 0x71cfe780, dynamic_state =3D 0x71de7900, dyn= stack =3D {<br>=C2=A0=C2=A0=C2=A0 base =3D 0x698c3800, top =3D 0x698c3940, = limit =3D 0x698c3a00}, <br>=C2=A0 pending_asyncs =3D 0x304, block_asyncs = =3D 0, continuation_root =3D 0x5763f340, <br>=C2=A0 continuation_base =3D 0= x7f3d397f9c90, vp =3D 0x755c1bd0, base =3D 0x7f3d397f9da0, <br>=C2=A0 regs = =3D {{__jmpbuf =3D {139905204221696, 139906923931021, 1, 139894281647232, <= br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 139906913276512, 0, 139906918= 327551, 8388608}, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 __mask_was_saved =3D 9= 64664752, __saved_mask =3D {__val =3D {0, 139900934399744, <br>=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 139900934399744, 139900934397344= , 139906923929400, 139893936840720, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 1804170656, 139906913276512, 139900934399744, 1399009= 34397344, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 139900= 934397504, 139893936840720, 139906910859134, 139906913276484, <br>=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 139906910857112, 27401856}}}}= }<br><br>(gdb) print ((struct scm_i_thread *) current_p)->vp<br>$41 =3D = (struct scm_vm *) 0x755c1bd0<br><br>which is exactly the vp we had before, = so this is the correct thread.<br><br>So=C2=A0 ... all the values in *(stru= ct scm_i_thread *) current_p look more or less OK;<br>its not corrupted. An= d all the values in *vp look more or less OK, its not corrrupted<br>except = that engine=3D1 looks wrong.=C2=A0 So what's up with the weird stack lo= oping?<br>Again: <br>From before, we had:<br><br>(gdb) print *vp<br>$42 =3D= {ip =3D 0x7f3e9e5a6378 <subr_stub_code+56>, sp =3D 0x7f3e94cdee00, <= br>=C2=A0 fp =3D 0x7f3e94cdee18, stack_limit =3D 0x7f3e94cde000, trace_leve= l =3D 0, <br>=C2=A0 sp_min_since_gc =3D 0x7f3e94cdee00, stack_size =3D 512,= <br>=C2=A0 stack_bottom =3D 0x7f3e94cde000, stack_top =3D 0x7f3e94cdf000, = <br>=C2=A0 overflow_handler_stack =3D 0x304, hooks =3D {0x4, 0x4, 0x4, 0x4,= 0x4}, <br>=C2=A0 resumable_prompt_cookie =3D 0x7f3d397f9440, engine =3D 1}= <br><br>so fp, sp, stack_bottom, stack_top all are self-consistent with eac= h other.<br>The problem is that<br>=C2=A0=C2=A0=C2=A0 fp =3D SCM_FRAME_DYNA= MIC_LINK (fp)<br>goes nowhere, after the first iteration.<br><br>Is the fra= me corrupted? How? what does the rest of the stack look like?<br><br>(gdb) = x/32x 0x7f3e94cdee00<br>0x7f3e94cdee00: 0x0000000000000904=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0x000000000000200c<br>0x7f3e94cdee10: 0x0000000001a1b7e0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000001a1b5e0<br>0x7f3e94cdee20: 0x0000000= 000000004=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000000000200c=C2=A0 <<&l= t; theres the 4<br>0x7f3e94cdee30: 0x0000000000169bd6=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 0x0000000000000001 <<< there's the new fp<br>0x7f3e9= 4cdee40: 0x0000000000000000=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000000192acd= 0 <<< there's the zero.<br>0x7f3e94cdee50: 0x0000000001fa4bc0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000001a1c6d0<br>0x7f3e94cdee60: 0x0000= 000044507950=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000000000002<br>0x7f3e94cd= ee70: 0x000000000005a6f5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x00000000018febd0<b= r>0x7f3e94cdee80: 0x000000006d490d00=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x00007f= 3e9e97241c<br>0x7f3e94cdee90: 0x0000000000000002=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 0x00007f3e9e97241c<br>0x7f3e94cdeea0: 0x0000000000000002=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0x00007f3e8d797630<br>0x7f3e94cdeeb0: 0x0000000000000002=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0x00007f3e86effacc<br>0x7f3e94cdeec0: 0x0000000= 000000003=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000006d490d00<br>0x7f3e94cdeed= 0: 0x00007f3e86eb8698=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000000000002<br>0= x7f3e94cdeee0: 0x00007f3e8e51f450=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000000= 0000008<br>0x7f3e94cdeef0: 0x0000000001a37c10=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= 0x000000000192acd0<br><br><br>So... who sets up thread->vp ? <br>/* #de= fine VM_ENABLE_ASSERTIONS */<br>However, defining this breaks the build.<br= ><br>diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c<br>index 6c88= ebf..f0f8164 100644<br>--- a/libguile/vm-engine.c<br>+++ b/libguile/vm-engi= ne.c<br>@@ -2050,11 +2050,11 @@ VM_NAME (scm_i_thread *thread, struct scm_v= m *vp,<br>=C2=A0<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 if (!scm_module_system_booted_p)<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 {<br>-=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ASSERT (scm_is_true<= br>+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 ASSERT (scm_is_true(<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 scm_equal_p (modname,<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 scm_list_2<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (SCM_BOOL_T,<br>-=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 scm_from_utf8_symbol ("guile"))= ));<br>+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 scm_f= rom_utf8_symbol ("guile")))));<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 var =3D scm_lookup (= sym);<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 }<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 el= se if (scm_is_true (SCM_CAR (modname)))<br>diff --git a/libguile/vm.c b/lib= guile/vm.c<br>index 18f2192..c26066e 100644<br>--- a/libguile/vm.c<br>+++ b= /libguile/vm.c<br>@@ -63,7 +63,7 @@ static size_t page_size;<br>=C2=A0<br>= =C2=A0/* The VM has a number of internal assertions that shouldn't norm= ally be<br>=C2=A0=C2=A0=C2=A0 necessary, but might be if you think you foun= d a bug in the VM. */<br>-/* #define VM_ENABLE_ASSERTIONS */<br>+#define VM= _ENABLE_ASSERTIONS<br>=C2=A0<br>=C2=A0static void vm_expand_stack (struct s= cm_vm *vp,<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 union scm_vm_stack_element *new_sp)= SCM_NOINLINE;<br><br><br>=C2=A0GEN=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 guile-pro= cedures.texi<br>/bin/bash: line 1: 24078 Broken pipe <br><br>=C2=A0./meta/g= uile<br>Aborted<br>./libguile/guile<br>Aborted<br>gdb libguile/.libs/lt-gui= le<br><br>#0=C2=A0 0x00007ffff74f7428 in __GI_raise (sig=3Dsig@entry=3D6)<b= r>=C2=A0=C2=A0=C2=A0 at ../sysdeps/unix/sysv/linux/raise.c:54<br>#1=C2=A0 0= x00007ffff74f902a in __GI_abort () at abort.c:89<br>#2=C2=A0 0x00007ffff7b7= 07c4 in vm_regular_engine (thread=3D0x7282, vp=3D0x806f30, <br>=C2=A0=C2=A0= =C2=A0 registers=3D0x6, resume=3D-145787864) at ../../libguile/vm-engine.c:= 2053<br>#3=C2=A0 0x00007ffff7b711d2 in scm_call_n (proc=3D0x832b30, argv=3D= argv@entry=3D0x0, <br>=C2=A0=C2=A0=C2=A0 nargs=3Dnargs@entry=3D0) at ../../= libguile/vm.c:1257<br>#4=C2=A0 0x00007ffff7af14e9 in scm_call_0 (proc=3D<= ;optimized out>)<br>=C2=A0=C2=A0=C2=A0 at ../../libguile/eval.c:481<br>#= 5=C2=A0 0x00007ffff7b10568 in scm_primitive_load_path (args=3D<optimized= out>)<br>=C2=A0=C2=A0=C2=A0 at ../../libguile/load.c:1248<br>#6=C2=A0 0= x00007ffff7b6e976 in vm_regular_engine (thread=3D0x7282, vp=3D0x806f30, <br= >=C2=A0=C2=A0=C2=A0 registers=3D0x6, resume=3D-145787864) at ../../libguile= /vm-engine.c:784<br><br>Oh. wtf. <br><br>(define last-gc (gc-stats))<br>(de= fine start-time (get-internal-real-time))<br>(define run-time (get-internal= -run-time))<br>(define (avg-time-taken) <br>=C2=A0=C2=A0=C2=A0 (define now = (get-internal-real-time))<br>=C2=A0=C2=A0=C2=A0 (define run (get-internal-r= un-time))<br>=C2=A0=C2=A0=C2=A0 (define cur (gc-stats))<br>=C2=A0=C2=A0=C2= =A0 (define gc-time-taken (* 1.0e-9 (- (cdar cur) (cdar last-gc))))<br>=C2= =A0=C2=A0=C2=A0 (define elapsed-time (* 1.0e-9 (- now start-time)))<br>=C2= =A0=C2=A0=C2=A0 (define cpu-time (* 1.0e-9 (- run run-time)))<br>=C2=A0=C2= =A0=C2=A0 (format #t "Elapsed time: ~5f secs. GC-time-taken: ~5f s or = ~5f%=C2=A0=C2=A0 cpu-usage: ~5f%\n"<br>=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0= =C2=A0 elapsed-time gc-time-taken=C2=A0 (* 100 (/ gc-time-taken elapsed-tim= e))<br>=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 (* 100 (/ cpu-time elapsed-tim= e))<br>=C2=A0=C2=A0=C2=A0 )<br>=C2=A0=C2=A0=C2=A0 (set! last-gc cur)<br>=C2= =A0=C2=A0=C2=A0 (set! start-time now)<br>=C2=A0=C2=A0=C2=A0 (set! run-time = run)<br>)<br><br><br>linas@fanny: ~/src/novamente/src/opencog-git/opencog/n= lp/learn $ vi x<br>linas@fanny: ~/src/novamente/src/opencog-git/opencog/nlp= /learn $ cat x<br><br>#0=C2=A0 find_slot_map (cache=3D0x7f3e9b783ab0, ip=3D= 0x1) at<br>../../libguile/vm.c:935<br>935=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 if (cache->entries[slot].ip =3D=3D ip)<br>(gdb) print slot<br>$1 =3D= 0<br>(gdb) print cache->entries[slot].ip<br>$2 =3D (scm_t_uint32 *) 0x1= <br>(gdb) print cache->entries[slot].map<br>$4 =3D (const scm_t_uint8 *)= 0x0<br>(gdb) step<br>scm_i_vm_mark_stack (vp=3D0x755c1bd0, mark_stack_ptr= =3D0x7f3e9b783f40, <br>=C2=A0=C2=A0=C2=A0 mark_stack_limit=3D0x7f3e9b793eb0= ) at ../../libguile/vm.c:1011<br>1011=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 slot_map =3D find_slot_map (SCM_FRAME_RETURN_ADDRESS (fp), &cach= e);<br>(gdb) print fp<br>$5 =3D (union scm_vm_stack_element *) 0x7f3e94cdee= 38<br><br>#define SCM_FRAME_RETURN_ADDRESS(fp)=C2=A0=C2=A0=C2=A0 ((fp)[0].a= s_ip)<br>(gdb) print (fp)[0].as_ip<br>$6 =3D (scm_t_uint32 *) 0x1<br><br>OK= that looks weird ... is this corrupted ?? but whatever,<br>because the ret= urned slot_map is never used ... because ...<br><br>(gdb) step<br>scm_i_vm_= mark_stack (vp=3D0x755c1bd0, mark_stack_ptr=3D0x7f3e9b783f40, <br>=C2=A0=C2= =A0=C2=A0 mark_stack_limit=3D0x7f3e9b793eb0) at ../../libguile/vm.c:975<br>= 975=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 fp = =3D SCM_FRAME_DYNAMIC_LINK (fp))<br>(gdb) print fp<br>$7 =3D (union scm_vm_= stack_element *) 0x7f3e94cdee38<br><br>frames.h:#define SCM_FRAME_DYNAMIC_L= INK(fp)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ((fp) + (fp)[1].as_uint)<br>(gdb) pri= nt (fp)[1].as_uint<br>$8 =3D 0<br><br>OK, that seems bad, because now fp ne= ver advances, it just repeats<br>over and over with this same value.<br><br= >(gdb) <br>979=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = for (slot =3D nlocals - 1; sp < fp; sp++, slot--)<br>(gdb) print nlocals= <br>$10 =3D -2<br>(gdb) print sp<br>$11 =3D (union scm_vm_stack_element *) = 0x7f3e94cdee48<br>#define SCM_FRAME_NUM_LOCALS(fp, sp)=C2=A0=C2=A0=C2=A0 ((= fp) - (sp))<br>(gdb) print fp<br>$12 =3D (union scm_vm_stack_element *) 0x7= f3e94cdee38<br>(gdb) print=C2=A0 ((fp) - (sp))<br>$13 =3D -2<br>Ohh .. its = not -16 because its -2 * sizeof (union scm_vm_stack_element *)<br>so that&#= 39;s OK.<br>So for loops is skipped, it should go to.<br>=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 sp =3D SCM_FRAME_PREVIOUS_SP (fp);<br>frames.h:#define SCM_FRA= ME_PREVIOUS_SP(fp)=C2=A0=C2=A0=C2=A0 ((fp) + 2)<br><br>and so now it loops = around and repeats.<br>(gdb) print cache<br>$19 =3D {entries =3D {{ip =3D 0= x1, map =3D 0x0}, {ip =3D 0x0, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 map =3D 0= x0} <repeats 23 times>, {ip =3D 0x1a1b5e0, map =3D 0x0}, {ip =3D 0x0,= <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 map =3D 0x0}, {ip =3D 0x0, map =3D 0x0}= , {ip =3D 0x0, map =3D 0x0}, {ip =3D 0x0, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 map =3D 0x0}, {ip =3D 0x0, map =3D 0x0}, {ip =3D 0x0, map =3D 0x0}, {ip= =3D 0x0, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 map =3D 0x0}}}<br>(gdb) print = &cache<br>$20 =3D (struct slot_map_cache *) 0x7f3e9b783ab0<br><br>and s= o the loop repeates forever, because <br>fp =3D SCM_FRAME_DYNAMIC_LINK (fp)= never advances fp, because<br>(fp)[1].as_uint=C2=A0 is zero.<br><br>So whe= re is fp pointing to?=C2=A0 recall fp =3D=3D 0x7f3e94cdee38<br><br>(gdb) x/= 20x 0x7f3e94cdee00<br>0x7f3e94cdee00: 0x0000000000000904=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 0x000000000000200c<br>0x7f3e94cdee10: 0x0000000001a1b7e0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0x0000000001a1b5e0<br>0x7f3e94cdee20: 0x0000000000= 000004=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000000000200c<br>0x7f3e94cdee30: = 0x0000000000169bd6=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000000000001<br>0x7f= 3e94cdee40: 0x0000000000000000=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000000192= acd0<br>0x7f3e94cdee50: 0x0000000001fa4bc0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x= 0000000001a1c6d0<br>0x7f3e94cdee60: 0x0000000044507950=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 0x0000000000000002<br>0x7f3e94cdee70: 0x000000000005a6f5=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 0x00000000018febd0<br>0x7f3e94cdee80: 0x000000006d490= d00=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x00007f3e9e97241c<br>0x7f3e94cdee90: 0x0= 000000000000002=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x00007f3e9e97241c<br><br><br= >(gdb) x/s 0x7f3e94cdee60<br>0x7f3e94cdee60: "PyPD"=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 <<< ?? is this a meaningul string?<br>(gdb) x/s= 0x7f3e94cdee81<br>0x7f3e94cdee81: "\rIm"=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 << how about this ???<br><br>So this does not look healthy.=C2= =A0 How did we get here?<br><br>(gdb) print vp<br>$21 =3D (struct scm_vm *)= 0x755c1bd0<br>(gdb) print mark_stack_ptr<br>$22 =3D (struct GC_ms_entry *)= 0x7f3e9b783f40<br>(gdb) print mark_stack_limit<br>$23 =3D (struct GC_ms_en= try *) 0x7f3e9b793eb0<br>(gdb) print upper<br>$24 =3D (void *) 0x7ffdd986<b= r>(gdb) print GC_greatest_plausible_heap_addr<br>$25 =3D (void *) 0x7ffdd98= 6<br>(gdb) print lower<br>$26 =3D (void *) 0x17a1ff8<br><br>(gdb) print vp-= >fp<br>$27 =3D (union scm_vm_stack_element *) 0x7f3e94cdee18<br>(gdb) pr= int vp->sp<br>$28 =3D (union scm_vm_stack_element *) 0x7f3e94cdee00<br>(= gdb) print=C2=A0 vp->stack_top<br>$29 =3D (union scm_vm_stack_element *)= 0x7f3e94cdf000<br><br>So lets walk manually. <br>frames.h:#define SCM_FRAM= E_DYNAMIC_LINK(fp)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ((fp) + (fp)[1].as_uint)<b= r><br>(gdb) print (vp->fp) + (vp->fp)[1].as_uint<br>$31 =3D (union sc= m_vm_stack_element *) 0x7f3e94cdee38<br>So we are instanly in trouble! once= through the loop, and we've got the broken fp<br><br>So how did we get= here?<br><br>(gdb) print vp<br>$32 =3D (struct scm_vm *) 0x755c1bd0<br>(gd= b) print *vp<br>$33 =3D {ip =3D 0x7f3e9e5a6378 <subr_stub_code+56>, s= p =3D 0x7f3e94cdee00, <br>=C2=A0 fp =3D 0x7f3e94cdee18, stack_limit =3D 0x7= f3e94cde000, trace_level =3D 0, <br>=C2=A0 sp_min_since_gc =3D 0x7f3e94cdee= 00, stack_size =3D 512, <br>=C2=A0 stack_bottom =3D 0x7f3e94cde000, stack_t= op =3D 0x7f3e94cdf000, <br>=C2=A0 overflow_handler_stack =3D 0x304, hooks = =3D {0x4, 0x4, 0x4, 0x4, 0x4}, <br>=C2=A0 resumable_prompt_cookie =3D 0x7f3= d397f9440, engine =3D 1}<br><br>Looks plausible, not corrupted. Why is engi= ne=3D1 ?? <br>#define SCM_VM_REGULAR_ENGINE 0<br>#define SCM_VM_DEBUG_ENGIN= E 1<br>#define SCM_VM_NUM_ENGINES 2<br>#=C2=A0 define SCM_I_CURRENT_THREAD = (scm_i_current_thread)<br><br>(gdb) print scm_i_current_thread<br>$34 =3D (= scm_i_thread *) 0x0<br><br>OK, that's not excellent.<br>(gdb) print thr= ead_count<br>$35 =3D 161<br><br>(gdb) bt<br>#0=C2=A0 scm_i_vm_mark_stack (v= p=3D0x755c1bd0, mark_stack_ptr=3D0x7f3e9b783f40, <br>=C2=A0=C2=A0=C2=A0 mar= k_stack_limit=3D0x7f3e9b793eb0) at ../../libguile/vm.c:1011<br>#1=C2=A0 0x0= 0007f3e9db8835e in GC_mark_from (mark_stack_top=3D0x7f3e9b783ee0, <br>=C2= =A0=C2=A0=C2=A0 mark_stack_top@entry=3D0x7f3e9b783f00, <br>=C2=A0=C2=A0=C2= =A0 mark_stack=3Dmark_stack@entry=3D0x7f3e9b783eb0, <br>=C2=A0=C2=A0=C2=A0 = mark_stack_limit=3Dmark_stack_limit@entry=3D0x7f3e9b793eb0) at ../mark.c:77= 2<br>#2=C2=A0 0x00007f3e9db8897e in GC_do_local_mark (local_mark_stack=3D0x= 7f3e9b783eb0, <br>=C2=A0=C2=A0=C2=A0 local_top=3D0x7f3e9b783f00) at ../mark= .c:1037<br>#3=C2=A0 0x00007f3e9db88b98 in GC_mark_local (<br>=C2=A0=C2=A0= =C2=A0 local_mark_stack=3Dlocal_mark_stack@entry=3D0x7f3e9b783eb0, id=3Did@= entry=3D4)<br>=C2=A0=C2=A0=C2=A0 at ../mark.c:1170<br>#4=C2=A0 0x00007f3e9d= b88eaa in GC_help_marker (my_mark_no=3Dmy_mark_no@entry=3D80003)<br>=C2=A0= =C2=A0=C2=A0 at ../mark.c:1238<br>#5=C2=A0 0x00007f3e9db92e3c in GC_mark_th= read (id=3D<optimized out>)<br>=C2=A0=C2=A0=C2=A0 at ../pthread_suppo= rt.c:380<br>#6=C2=A0 0x00007f3e9e2ae6ba in start_thread (arg=3D0x7f3e9b7947= 00)<br>=C2=A0=C2=A0=C2=A0 at pthread_create.c:333<br>#7=C2=A0 0x00007f3e9df= dd82d in clone ()<br>=C2=A0=C2=A0=C2=A0 at ../sysdeps/unix/sysv/linux/x86_6= 4/clone.S:109<br><br>so bdwgc is version gc7_6_0<br><br>So ../mark.c:772 is= GET_HDR and GET_HDR is in<br>include/private/gc_hdrs.h<br><br>define GET_H= DR(p, hhdr)=C2=A0 ... ((hhdr) =3D HDR_INNER(p) <br># define HDR_INNER(p) HD= R_FROM_BI(BI(p),p)<br>#define HDR_FROM_BI(bi, p) \<br>=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ((bi)= ->index[((word)(p) >> LOG_HBLKSIZE) & (BOTTOM_SZ - 1)])<br><br= >This seems all wrong.. wtf ....<br><br>is it called by thread_mark ??<br>i= n libguile/thread.c:<br>=C2=A0 thread_gc_kind =3D<br>=C2=A0=C2=A0=C2=A0 GC_= new_kind (GC_new_free_list (),<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GC_M= AKE_PROC (GC_new_proc (thread_mark), 0),<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0, 1)<br>in bdwgc/misc.c=C2=A0 GC_new_proc<br>=C2=A0=C2=A0=C2=A0 GC_= mark_procs[result] =3D proc<br>#define GC_mark_procs GC_arrays._mark_procs<= br>#define PROC(descr) \<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (GC_mark_procs[(= (descr) >> GC_DS_TAG_BITS) & (GC_MAX_MARK_PROCS-1)])<br><br>=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 GC_obj_kinds[result].ok_descriptor =3D descr;= =C2=A0 <<< this is where MAKE_PROC goes.<br><br>anyway ... in mark= .c line 733<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 case GC_DS_PROC:<= br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 mark_stack_top--;= <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 credit -=3D GC_P= ROC_BYTES;<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 mark_s= tack_top =3D (*PROC(descr))((word *)current_p, mark_stack_top,<br>=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 mark_stack_limit, ENV(descr));<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 continue;<br>But that's the wrong line numb= er.=C2=A0 line 772 is in <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 cas= e GC_DS_PER_OBJECT:<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 if ((signed_word)descr >=3D 0) {<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* Descriptor is in the object.=C2=A0= =C2=A0=C2=A0=C2=A0 */<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 descr =3D *(word *)(current_p + descr - GC_DS_PER_OBJECT= );<br><br>Oh, it goes to retry, which loops around and calls PROC which is = thread_mark<br>which is called with args <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 mark_stack_top =3D (*PROC(descr))((word *)current_= p, mark_stack_top,<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 mark_stack_limit, ENV(descr))= ;<br><br>(gdb) print current_p<br>$39 =3D (ptr_t) 0x7225d380 "@\325%r&= quot;<br><br>so back in libguile/threads.c line 84:<br>=C2=A0 const struct = scm_i_thread *t =3D (struct scm_i_thread *) addr;<br><br>(gdb) print *(stru= ct scm_i_thread *) current_p<br>$40 =3D {next_thread =3D 0x7225d540, handle= =3D 0x5763f3b0, pthread =3D 139900934399744, <br>=C2=A0 result =3D 0x4, ex= ited =3D 0, guile_mode =3D 1, needs_unregister =3D 1, wake =3D 0x0, <br>=C2= =A0 sleep_cond =3D {__data =3D {__lock =3D 0, __futex =3D 0, __total_seq = =3D 0, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 __wakeup_seq =3D 0, __woken_seq = =3D 0, __mutex =3D 0x0, __nwaiters =3D 0, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 __broadcast_seq =3D 0}, __size =3D '\000' <repeats 47 times&= gt;, __align =3D 0}, <br>=C2=A0 sleep_pipe =3D {151, 197}, freelists =3D 0x= 71cfe800, <br>=C2=A0 pointerless_freelists =3D 0x71cfe780, dynamic_state = =3D 0x71de7900, dynstack =3D {<br>=C2=A0=C2=A0=C2=A0 base =3D 0x698c3800, t= op =3D 0x698c3940, limit =3D 0x698c3a00}, <br>=C2=A0 pending_asyncs =3D 0x3= 04, block_asyncs =3D 0, continuation_root =3D 0x5763f340, <br>=C2=A0 contin= uation_base =3D 0x7f3d397f9c90, vp =3D 0x755c1bd0, base =3D 0x7f3d397f9da0,= <br>=C2=A0 regs =3D {{__jmpbuf =3D {139905204221696, 139906923931021, 1, 1= 39894281647232, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 139906913276= 512, 0, 139906918327551, 8388608}, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 __mas= k_was_saved =3D 964664752, __saved_mask =3D {__val =3D {0, 139900934399744,= <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 139900934399744= , 139900934397344, 139906923929400, 139893936840720, <br>=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1804170656, 139906913276512, 139900934= 399744, 139900934397344, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 139900934397504, 139893936840720, 139906910859134, 13990691327648= 4, <br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1399069108571= 12, 27401856}}}}}<br><br>(gdb) print ((struct scm_i_thread *) current_p)-&g= t;vp<br>$41 =3D (struct scm_vm *) 0x755c1bd0<br><br>which is exactly the vp= we had before, so this is the correct thread.<br><br>So=C2=A0 ... all the = values in *(struct scm_i_thread *) current_p look more or less OK;<br>its n= ot corrupted. And all the values in *vp look more or less OK, its not corrr= upted<br>except that engine=3D1 looks wrong.=C2=A0 So what's up with th= e weird stack looping?<br>Again: <br>From before, we had:<br><br>(gdb) prin= t *vp<br>$42 =3D {ip =3D 0x7f3e9e5a6378 <subr_stub_code+56>, sp =3D 0= x7f3e94cdee00, <br>=C2=A0 fp =3D 0x7f3e94cdee18, stack_limit =3D 0x7f3e94cd= e000, trace_level =3D 0, <br>=C2=A0 sp_min_since_gc =3D 0x7f3e94cdee00, sta= ck_size =3D 512, <br>=C2=A0 stack_bottom =3D 0x7f3e94cde000, stack_top =3D = 0x7f3e94cdf000, <br>=C2=A0 overflow_handler_stack =3D 0x304, hooks =3D {0x4= , 0x4, 0x4, 0x4, 0x4}, <br>=C2=A0 resumable_prompt_cookie =3D 0x7f3d397f944= 0, engine =3D 1}<br><br>so fp, sp, stack_bottom, stack_top all are self-con= sistent with each other.<br>The problem is that<br>=C2=A0=C2=A0=C2=A0 fp = =3D SCM_FRAME_DYNAMIC_LINK (fp)<br>goes nowhere, after the first iteration.= <br><br>Is the frame corrupted? How? what does the rest of the stack look l= ike?<br><br>(gdb) x/32x 0x7f3e94cdee00<br>0x7f3e94cdee00: 0x000000000000090= 4=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000000000200c<br>0x7f3e94cdee10: 0x000= 0000001a1b7e0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000001a1b5e0<br>0x7f3e94c= dee20: 0x0000000000000004=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000000000200c= =C2=A0 <<< theres the 4<br>0x7f3e94cdee30: 0x0000000000169bd6=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000000000001 <<< there's the= new fp<br>0x7f3e94cdee40: 0x0000000000000000=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= 0x000000000192acd0 <<< there's the zero.<br>0x7f3e94cdee50: 0= x0000000001fa4bc0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000001a1c6d0<br>0x7f3= e94cdee60: 0x0000000044507950=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0000000000000= 002<br>0x7f3e94cdee70: 0x000000000005a6f5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0= 0000000018febd0<br>0x7f3e94cdee80: 0x000000006d490d00=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 0x00007f3e9e97241c<br>0x7f3e94cdee90: 0x0000000000000002=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 0x00007f3e9e97241c<br>0x7f3e94cdeea0: 0x0000000000000= 002=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x00007f3e8d797630<br>0x7f3e94cdeeb0: 0x0= 000000000000002=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x00007f3e86effacc<br>0x7f3e9= 4cdeec0: 0x0000000000000003=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000000006d490d0= 0<br>0x7f3e94cdeed0: 0x00007f3e86eb8698=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x000= 0000000000002<br>0x7f3e94cdeee0: 0x00007f3e8e51f450=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0x0000000000000008<br>0x7f3e94cdeef0: 0x0000000001a37c10=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 0x000000000192acd0<br><br><br>So... who sets up thread-&= gt;vp ? <br>/* #define VM_ENABLE_ASSERTIONS */<br>However, defining this br= eaks the build.<br><br>diff --git a/libguile/vm-engine.c b/libguile/vm-engi= ne.c<br>index 6c88ebf..f0f8164 100644<br>--- a/libguile/vm-engine.c<br>+++ = b/libguile/vm-engine.c<br>@@ -2050,11 +2050,11 @@ VM_NAME (scm_i_thread *th= read, struct scm_vm *vp,<br>=C2=A0<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 if (!scm_module_system_booted_p)<br>=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 {<br>-=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 AS= SERT (scm_is_true<br>+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 ASSERT (scm_is_true(<br>=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 scm_equal_p (modname,<br>=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 scm_list_2<br>=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 (SCM_BOOL_T,<br>-=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 scm_from_utf8_symbol (&= quot;guile"))));<br>+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 scm_from_utf8_symbol ("guile")))));<br>=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 va= r =3D scm_lookup (sym);<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 }<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 else if (scm_is_true (SCM_CAR (modname)))<br>diff --git a/l= ibguile/vm.c b/libguile/vm.c<br>index 18f2192..c26066e 100644<br>--- a/libg= uile/vm.c<br>+++ b/libguile/vm.c<br>@@ -63,7 +63,7 @@ static size_t page_si= ze;<br>=C2=A0<br>=C2=A0/* The VM has a number of internal assertions that s= houldn't normally be<br>=C2=A0=C2=A0=C2=A0 necessary, but might be if y= ou think you found a bug in the VM. */<br>-/* #define VM_ENABLE_ASSERTIONS = */<br>+#define VM_ENABLE_ASSERTIONS<br>=C2=A0<br>=C2=A0static void vm_expan= d_stack (struct scm_vm *vp,<br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 union scm_vm_stac= k_element *new_sp) SCM_NOINLINE;<br><br><br>=C2=A0GEN=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 guile-procedures.texi<br>/bin/bash: line 1: 24078 Broken pipe <br= ><br>=C2=A0./meta/guile<br>Aborted<br>./libguile/guile<br>Aborted<br>gdb li= bguile/.libs/lt-guile<br><br>#0=C2=A0 0x00007ffff74f7428 in __GI_raise (sig= =3Dsig@entry=3D6)<br>=C2=A0=C2=A0=C2=A0 at ../sysdeps/unix/sysv/linux/raise= .c:54<br>#1=C2=A0 0x00007ffff74f902a in __GI_abort () at abort.c:89<br>#2= =C2=A0 0x00007ffff7b707c4 in vm_regular_engine (thread=3D0x7282, vp=3D0x806= f30, <br>=C2=A0=C2=A0=C2=A0 registers=3D0x6, resume=3D-145787864) at ../../= libguile/vm-engine.c:2053<br>#3=C2=A0 0x00007ffff7b711d2 in scm_call_n (pro= c=3D0x832b30, argv=3Dargv@entry=3D0x0, <br>=C2=A0=C2=A0=C2=A0 nargs=3Dnargs= @entry=3D0) at ../../libguile/vm.c:1257<br>#4=C2=A0 0x00007ffff7af14e9 in s= cm_call_0 (proc=3D<optimized out>)<br>=C2=A0=C2=A0=C2=A0 at ../../lib= guile/eval.c:481<br>#5=C2=A0 0x00007ffff7b10568 in scm_primitive_load_path = (args=3D<optimized out>)<br>=C2=A0=C2=A0=C2=A0 at ../../libguile/load= .c:1248<br>#6=C2=A0 0x00007ffff7b6e976 in vm_regular_engine (thread=3D0x728= 2, vp=3D0x806f30, <br>=C2=A0=C2=A0=C2=A0 registers=3D0x6, resume=3D-1457878= 64) at ../../libguile/vm-engine.c:784<br><br><br></div></div> --f403045ea6d679a79b0551239b33--
linasvepstas@HIDDEN
:bug-guile@HIDDEN
.
Full text available.bug-guile@HIDDEN
:bug#27234
; Package guile
.
Full text available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.