I’ve been working on updating/enhancing the debugger concept code and I’ve run into a situation where a gc fatal report is generated. I’m not exactly sure what it’s trying to say, as I /think/ the data all makes sense (though I’m unclear what 2+0 internal refs vs 2 refs might mean.

The pike in question is based on master from quite a while ago. I tried merging current master (which itself was a surprisingly easy task), but pike fails to compile due to typechecker errors. I tried building straight from master, but the build similarly fails with --with-debug and without that, pike compiles but fails to start. I’m hoping that doesn’t prevent coming up with an explanation for the problem.

I believe the “thing” in question is the main program, which comes from a file called file.pike. I’ve created a breakpoint object( for a line in this program), which is a PIKECLASS defined in _Debug/debug.cmod. The breakpoint object /does/ hold a reference to the program containing the breakpoint, but at this point, the breakpoint object hasn’t been destroyed. 

Can anyone detect a problem from this report?

Bill

---CUT HERE ---

/Users/hww3/pikedbg/src/gc.c:1938: GC fatal:
Thing is getting more internal refs (2 + 0) than refs (2).
(Could be an extra free somewhere, or a pointer might have been checked more than once.)
**Block: 0x10dd303f0  Type: program  Refs: 2
**Got gc marker at 0x10dd303f0: flags=0x00002 refs=2 weak=0 xrefs=0 saved=2 frame=0x0
**Program id: 65669, flags: f, parent id: -1
**Location: /Users/hww3/pikedbg/file.pike:0
**Identifiers:
** 0   fun:               name: main                  addr: 0x24
** 1   fun: use           name: f                     addr: 0x360
*******************
**Looking for references to 0x10dd303f0:
***One ref found as mapping index. -> from mapping 0x7faf328004d0 offset -8362904
  **In index program(/Users/hww3/pikedbg/file.pike)
  **Block: 0x7faf328004d0  Type: mapping  Refs: 1
Refs=1, next=0x7faf32800490, prev=0x7faf32800510, flags=0x0, size=33, hashsize=16
Indices type field = program
Values type field = string
([ /* 33 elements */
  master: "/master",
  object_program(Getopt): "/Users/hww3/pikedbg/lib/modules/Getopt.pmod",
  /main: "/main",
  object_program(Debug): "/Users/hww3/pikedbg/lib/modules/Debug.pmod/module.pmod",
  object_program(Debug.Debugger): "/Users/hww3/pikedbg/lib/modules/Debug.pmod/Debugger.pmod/module.pmod",
  Debug.Debugger.Breakpoint: "/Users/hww3/pikedbg/lib/modules/Debug.pmod/Debugger.pmod/Breakpoint.pike",
  Debug.Debugger.DebugServer: "/Users/hww3/pikedbg/lib/modules/Debug.pmod/Debugger.pmod/DebugServer.pike",
  object_program(Debug.Debugger.DebugAdapterProtocol): "/Users/hww3/pikedbg/lib/modules/Debug.pmod/Debugger.pmod/DebugAdapterProtocol.pmod",
- - - trimmed for brevity

])
  *******************
----------end------------
***One ref found as mapping value. -> from mapping 0x7faf328003d0 offset 537720
  **In value with index "/main"
  **Block: 0x7faf328003d0  Type: mapping  Refs: 1
Refs=1, next=0x7faf32800290, prev=0x7faf32800350, flags=0x0, size=33, hashsize=16
Indices type field = string
Values type field = program
([ /* 33 elements */
  "/Users/hww3/pikedbg/lib/modules/Debug.pmod/Debugger.pmod/Breakpoint.pike": Debug.Debugger.Breakpoint,
  "/Users/hww3/pikedbg/lib/modules/Debug.pmod/Debugger.pmod/DebugAdapterProtocol.pmod": object_program(Debug.Debugger.DebugAdapterProtocol),
  "/Users/hww3/pikedbg/lib/modules/Debug.pmod/Debugger.pmod/DebugServer.pike": Debug.Debugger.DebugServer,
  "/Users/hww3/pikedbg/lib/modules/Debug.pmod/Debugger.pmod/module.pmod": object_program(Debug.Debugger),
  "/Users/hww3/pikedbg/lib/modules/Debug.pmod/module.pmod": object_program(Debug),
  "/Users/hww3/pikedbg/lib/modules/Pike.pmod/module.pmod": object_program(Pike),
- - - trimmed for brevity
  "/main": /main,
  "/master": master
])
  *******************
----------end------------
***One ref found. -> from object 0x7faf3286eaa0 offset 10033200
  **In storage for inherit 0
  **In variable prog
  **In storage for inherit 1 (debug_breakpoint)
  **Block: 0x7faf3286eaa0  Type: object  Refs: 1
  **Got gc marker at 0x7faf3286eaa0: flags=0x00002 refs=1 weak=0 xrefs=0 saved=1 frame=0x0
  **Program id: 65699
  **Object variables:
  **  === In inherit "debug_breakpoint", program 65626:
  **  rtt: program   name: prog                  off:    0  value: program(/Users/hww3/pikedbg/file.pike)
  **  rtt: string    name: programs_fname        off:    8  value: "/Users/hww3/pikedbg/file.pike"
  **  rtt: string    name: real_path             off:   16  value: "/Users/hww3/pikedbg/file.pike"
  **  rtt: string    name: within_fname          off:   24  value: "/Users/hww3/pikedbg/file.pike"
  **  rtt: int       name: line_number           off:   32  value: 18
  **  rtt: int       name: enabled               off:   40  value: 1
  **  rtt: int       name: want_enabled          off:   48  value: 0
  **Describing program 0x10dd33000 of object:
  **Got gc marker at 0x10dd33000: flags=0x00002 refs=4 weak=0 xrefs=0 saved=4 frame=0x0
  **Program id: 65699, flags: 202f, parent id: -1
  **The program was written in C.
  **Location: /Users/hww3/pikedbg/lib/modules/Debug.pmod/Debugger.pmod/Breakpoint.pike:0
  **There is no parent (any longer?)
  *******************
----------end------------
***One ref found as the program of an object. 
**Block: 0x7faf3286ea50  Type: object  Refs: 5
**Program id: 65669
**Object variables:
** (none)
**Describing program 0x10dd303f0 of object:
**Got gc marker at 0x10dd303f0: flags=0x00002 refs=2 weak=0 xrefs=0 saved=2 frame=0x0
**Program id: 65669, flags: f, parent id: -1
**Location: /Users/hww3/pikedbg/file.pike:0
**There is no parent (any longer?)
*******************
----------end------------
***One ref found in current_program in frame on stack. 
**Block: 0x7faf32821b38  Type: pike_frame  Refs: 1
**Function f at /Users/hww3/pikedbg/file.pike:14
*******************
----------end------------
***One ref found in current_program in frame on stack. 
**Block: 0x7faf32821aa0  Type: pike_frame  Refs: 1
**Function main at /Users/hww3/pikedbg/file.pike:2
*******************
----------end------------
***One ref found on svalue stack. -> from pike_frame 0x7faf32821a08 offset -140385920272696
  **At position 12 among locals
  **Block: 0x7faf32821a08  Type: pike_frame  Refs: 1
  **Function _main at /Users/hww3/pikedbg/build/darwin-18.7.0-x86_64/master.pike:4069
  *******************
----------end------------
**Done looking for references to 0x10dd303f0, found 7 refs.
Pike was in GC stage 100 when this fatal occurred.
Backtrace at time of fatal:
src/modules/_Debug/debug.cmod:652: lib/modules/Debug.pmod/Debugger.pmod/Breakpoint.pike()
-:1:
    Stdio.FILE(2, "w", 777 /* fd=2 */)->write("\nSending response: \nContent-Length: 228\r\n\r\n{\"request_seq\":16,\"seq\":0,\"body\":{\"threads\":[{\"name\":\"Thread.Thread(4541273536)\",\"id\":4541273536},{\"nam"+[80]+"\"message\":null,\"success\":1,\"type\":\"response\"}\n")
lib/modules/Stdio.pmod/module.pmod:1105:
    Stdio.FILE(2, "w", 777 /* fd=2 */)->write("\nSending response: \nContent-Length: 228\r\n\r\n{\"request_seq\":16,\"seq\":0,\"body\":{\"threads\":[{\"name\":\"Thread.Thread(4541273536)\",\"id\":4541273536},{\"nam"+[80]+"\"message\":null,\"success\":1,\"type\":\"response\"}\n")
lib/modules/Stdio.pmod/module.pmod:2239:
    Stdio.FILE(2, "w", 777 /* fd=2 */)->write("\nSending response: \nContent-Length: 228\r\n\r\n{\"request_seq\":16,\"seq\":0,\"b"+[180]+"1,\"type\":\"response\"}\n","Content-Length: 228\r\n\r\n{\"request_seq\":16,\"seq\":0,\"body\":{\"threads\":[{\"n"+[159]+":1,\"type\":\"response\"}")
build/darwin-18.7.0-x86_64/master.pike:6576:
    werror("\nSending response: \n%s\n","Content-Length: 228\r\n\r\n{\"request_seq\":16,\"seq\":0,\"body\":{\"threads\":[{\"name\":\"Thread.Thread(4541273536)\",\"id\":4541273536},{\"na"+[87]+"ge\":null,\"success\":1,\"type\":\"response\"}")
lib/modules/Debug.pmod/Debugger.pmod/DebugServer.pike:31: Debug.Debugger.DebugServer()->write_response(Debug.Debugger.DebugAdapterProtocol.ThreadsResponse())
lib/modules/Debug.pmod/Debugger.pmod/DebugServer.pike:145: Debug.Debugger.DebugServer()->handle_threads_request(mapping[3])
lib/modules/Debug.pmod/Debugger.pmod/DebugServer.pike:678:
    Debug.Debugger.DebugServer()->breakpoint_read(Stdio.File("socket", "127.0.0.1 51892", 777 /* fd=10 */),"Content-Length: 47\r\n\r\n{\"command\":\"threads\",\"type\":\"request\",\"seq\":16}")
lib/modules/Stdio.pmod/module.pmod:1165: Stdio.File("socket", "127.0.0.1 51892", 777 /* fd=10 */)->__stdio_read_callback()
-:1: Pike.Backend(1)->`()(1000.0)
lib/modules/Debug.pmod/Debugger.pmod/DebugServer.pike:540: Debug.Debugger.DebugServer()->__lambda_65700_0_line_540()
Abort trap: 6