more information… i added some std.log.debug
calls inside of ArrayList.ensureTotalCapacityPrecise
which suggest the fault might be occurring on the return from this function – and not from within…
first, the baseline stacktrace without the debug calls:
debug: self = em.core.em.lang.em.Table_H([]const u8,.RO){ ._dname = { }, ._is_virgin = true, ._list = array_list.ArrayListAligned([]const u8,null){ .items = { }, .capacity = 0, .allocator = mem.Allocator{ .ptr = anyopaque@57e028, .vtable = mem.Allocator.VTable{ ... } } } }
debug: add { 78, 77, 73 }
Segmentation fault at address 0x533618
C:\tools\zig-windows-x86_64-0.14.0-dev.367+a57479afc\lib\std\array_list.zig:434:51: 0x4f5352 in ensureTotalCapacity (host-main.exe.obj)
return self.ensureTotalCapacityPrecise(better_capacity);
^
C:\tools\zig-windows-x86_64-0.14.0-dev.367+a57479afc\lib\std\array_list.zig:491:41: 0x4e5bc3 in addOne (host-main.exe.obj)
try self.ensureTotalCapacity(newlen);
^
C:\tools\zig-windows-x86_64-0.14.0-dev.367+a57479afc\lib\std\array_list.zig:262:49: 0x4d8494 in append (host-main.exe.obj)
const new_item_ptr = try self.addOne();
^
C:\Users\biosb\zig\zig-em-dev\work\em.core\em.lang\em.zig:391:30: 0x4c9ba0 in add (host-main.exe.obj)
self._list.append(item) catch fail();
^
C:\Users\biosb\zig\zig-em-dev\work\em.arch\em.arch.arm\IntrVec.em.zig:23:21: 0x4854a6 in addIntrH (host-main.exe.obj)
name_tab.add(name);
^
C:\Users\biosb\zig\zig-em-dev\work\em.arch\em.arch.arm\IntrVec.em.zig:48:21: 0x48348c in em__initH (host-main.exe.obj)
addIntrH(n);
^
C:\Users\biosb\zig\zig-em-dev\work\em.core\em.lang\host-main.zig:22:12: 0x4832af in exec__anon_3104 (host-main.exe.obj)
callAll("em__initH", ulist_bot, false);
^
C:\Users\biosb\zig\zig-em-dev\work\.gen\host.zig:4:53: 0x461177 in exec (host-main.exe.obj)
@import("../em.core/em.lang/host-main.zig").exec(em.import.@"em.examples.basic/EmptyP".em__U) catch em.fail();
^
C:\Users\biosb\zig\zig-em-dev\work\.main-host.zig:1:51: 0x46106e in main (host-main.exe.obj)
pub fn main() void { @import(".gen/host.zig").exec(); }
^
C:\tools\zig-windows-x86_64-0.14.0-dev.367+a57479afc\lib\std\start.zig:373:53: 0x461017 in WinStartup (host-main.exe.obj)
std.os.windows.ntdll.RtlExitUserProcess(callMain());
^
???:?:?: 0x7ff84da67373 in ??? (KERNEL32.DLL)
???:?:?: 0x7ff84f95cc90 in ??? (ntdll.dll)
and here’s some debug added to array_list.zig
beginning at line 440:
/// If the current capacity is less than `new_capacity`, this function will
/// modify the array so that it can hold at least `new_capacity` items.
/// Invalidates element pointers if additional memory is needed.
pub fn ensureTotalCapacity(self: *Self, new_capacity: usize) Allocator.Error!void {
if (@sizeOf(T) == 0) {
self.capacity = math.maxInt(usize);
return;
}
if (self.capacity >= new_capacity) return;
const better_capacity = growCapacity(self.capacity, new_capacity);
return self.ensureTotalCapacityPrecise(better_capacity);
}
/// If the current capacity is less than `new_capacity`, this function will
/// modify the array so that it can hold exactly `new_capacity` items.
/// Invalidates element pointers if additional memory is needed.
pub fn ensureTotalCapacityPrecise(self: *Self, new_capacity: usize) Allocator.Error!void {
if (@sizeOf(T) == 0) {
self.capacity = math.maxInt(usize);
return;
}
if (self.capacity >= new_capacity) return;
std.log.debug("self.capacity = {d}, new_capacity = {}", .{self.capacity, new_capacity});
// Here we avoid copying allocated but unused bytes by
// attempting a resize in place, and falling back to allocating
// a new buffer and doing our own copy. With a realloc() call,
// the allocator implementation would pointlessly copy our
// extra capacity.
const old_memory = self.allocatedSlice();
std.log.debug("old_memory = {d} {any}", .{old_memory.len, old_memory.ptr});
std.log.debug("resize = {any}", .{self.allocator.resize(old_memory, new_capacity)});
if (self.allocator.resize(old_memory, new_capacity)) {
self.capacity = new_capacity;
} else {
const new_memory = try self.allocator.alignedAlloc(T, alignment, new_capacity);
std.log.debug("new_memory = {d} {any}", .{new_memory.len, new_memory.ptr});
@memcpy(new_memory[0..self.items.len], self.items);
std.log.debug("after memcpy", .{});
self.allocator.free(old_memory);
std.log.debug("after free", .{});
self.items.ptr = new_memory.ptr;
self.capacity = new_memory.len;
std.process.exit(0);
}
}
if i now run the same test, the debug output looks completely sane; and the program gracefully exits after the first call to this code:
debug: self = em.core.em.lang.em.Table_H([]const u8,.RO){ ._dname = { }, ._is_virgin = true, ._list = array_list.ArrayListAligned([]const u8,null){ .items = { }, .capacity = 0, .allocator = mem.Allocator{ .ptr = anyopaque@2fa028, .vtable = mem.Allocator.VTable{ ... } } } }
debug: add { 78, 77, 73 }
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 []const u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 []const u8@1e2c8760010
debug: after memcpy
debug: after free
if a remove the std.process.exit
, however, i do see the original fault – with looks like MANY additional calls to the same code above:
debug: self = em.core.em.lang.em.Table_H([]const u8,.RO){ ._dname = { }, ._is_virgin = true, ._list = array_list.ArrayListAligned([]const u8,null){ .items = { }, .capacity = 0, .allocator = mem.Allocator{ .ptr = anyopaque@dda028, .vtable = mem.Allocator.VTable{ ... } } } }
debug: add { 78, 77, 73 }
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 []const u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 []const u8@18a38cf0010
debug: after memcpy
debug: after free
Segmentation fault at address 0xd8c618
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u32@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u32@18a38d10584
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d10584
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d10584
debug: resize = true
debug: new_memory = 20 u8@18a38d10598
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a38d10598
debug: resize = true
debug: new_memory = 38 u8@18a38d105be
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a38d105be
debug: resize = true
debug: new_memory = 65 u8@18a38d105ff
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d10638
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d10638
debug: resize = true
debug: new_memory = 20 u8@18a38d1064c
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a38d1064c
debug: resize = true
debug: new_memory = 38 u8@18a38d10672
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a38d10672
debug: resize = true
debug: new_memory = 65 u8@18a38d106b3
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 pdb.Pdb.Module@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 pdb.Pdb.Module@18a38d106f0
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d10bb0
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d10bb0
debug: resize = true
debug: new_memory = 20 u8@18a38d10bc4
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a38d10bc4
debug: resize = true
debug: new_memory = 38 u8@18a38d10bea
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a38d10bea
debug: resize = true
debug: new_memory = 65 u8@18a38d10c2b
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a38d10c2b
debug: resize = true
debug: new_memory = 105 u8@18a38d10c94
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d10ceb
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d10ceb
debug: resize = true
debug: new_memory = 20 u8@18a38d10cff
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a38d10cff
debug: resize = true
debug: new_memory = 38 u8@18a38d10d25
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a38d10d25
debug: resize = true
debug: new_memory = 65 u8@18a38d10d66
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a38d10d66
debug: resize = true
debug: new_memory = 105 u8@18a38d10dcf
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d10e22
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d10e22
debug: resize = true
debug: new_memory = 20 u8@18a38d10e36
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d10e3f
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d10e3f
debug: resize = true
debug: new_memory = 20 u8@18a38d10e53
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a38d10e53
debug: resize = true
debug: new_memory = 38 u8@18a38d10e79
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a38d10e79
debug: resize = true
debug: new_memory = 65 u8@18a38d10eba
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a38d10eba
debug: resize = true
debug: new_memory = 105 u8@18a38d10f23
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d10f70
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d10f70
debug: resize = true
debug: new_memory = 20 u8@18a38d10f84
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d10f94
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d10f94
debug: resize = true
debug: new_memory = 20 u8@18a38d10fa8
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a38d10fa8
debug: resize = true
debug: new_memory = 38 u8@18a38d10fce
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a38d10fce
debug: resize = true
debug: new_memory = 65 u8@18a38d1100f
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a38d1100f
debug: resize = true
debug: new_memory = 105 u8@18a38d11078
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d110c5
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d110c5
debug: resize = true
debug: new_memory = 20 u8@18a38d110d9
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d110e5
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d110e5
debug: resize = true
debug: new_memory = 20 u8@18a38d110f9
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a38d110f9
debug: resize = true
debug: new_memory = 38 u8@18a38d1111f
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a38d1111f
debug: resize = true
debug: new_memory = 65 u8@18a38d11160
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a38d11160
debug: resize = true
debug: new_memory = 105 u8@18a38d111c9
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d11219
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d11219
debug: resize = true
debug: new_memory = 20 u8@18a38d1122d
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d11240
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d11240
debug: resize = true
debug: new_memory = 20 u8@18a38d11254
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a38d11254
debug: resize = true
debug: new_memory = 38 u8@18a38d1127a
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a38d1127a
debug: resize = true
debug: new_memory = 65 u8@18a38d112bb
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a38d112bb
debug: resize = true
debug: new_memory = 105 u8@18a38d11324
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a38d11374
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a38d11374
debug: resize = true
debug: new_memory = 20 u8@18a38d11388
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 pdb.SectionContribEntry@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 pdb.SectionContribEntry@18a38d11394
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 pdb.SectionContribEntry@18a38d11394
debug: resize = true
debug: new_memory = 20 pdb.SectionContribEntry@18a38d115c4
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 pdb.SectionContribEntry@18a38d115c4
debug: resize = false
debug: new_memory = 38 pdb.SectionContribEntry@18a38d117f4
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 pdb.SectionContribEntry@18a38d117f4
debug: resize = false
debug: new_memory = 65 pdb.SectionContribEntry@18a38d20010
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 pdb.SectionContribEntry@18a38d20010
debug: resize = true
debug: new_memory = 105 pdb.SectionContribEntry@18a38d20b8c
debug: after memcpy
debug: after free
debug: self.capacity = 105, new_capacity = 165
debug: old_memory = 105 pdb.SectionContribEntry@18a38d20b8c
debug: resize = true
debug: new_memory = 165 pdb.SectionContribEntry@18a38d21d98
debug: after memcpy
debug: after free
debug: self.capacity = 165, new_capacity = 255
debug: old_memory = 165 pdb.SectionContribEntry@18a38d21d98
debug: resize = false
debug: new_memory = 255 pdb.SectionContribEntry@18a38f00010
debug: after memcpy
debug: after free
debug: self.capacity = 255, new_capacity = 390
debug: old_memory = 255 pdb.SectionContribEntry@18a38f00010
debug: resize = true
debug: new_memory = 390 pdb.SectionContribEntry@18a38f02ab8
debug: after memcpy
debug: after free
debug: self.capacity = 390, new_capacity = 593
debug: old_memory = 390 pdb.SectionContribEntry@18a38f02ab8
debug: resize = true
debug: new_memory = 593 pdb.SectionContribEntry@18a38f10010
debug: after memcpy
debug: after free
debug: self.capacity = 593, new_capacity = 897
debug: old_memory = 593 pdb.SectionContribEntry@18a38f10010
debug: resize = true
debug: new_memory = 897 pdb.SectionContribEntry@18a38f1622c
debug: after memcpy
debug: after free
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907cc40
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907cc40
debug: resize = true
debug: new_memory = 20 u8@18a3907cc54
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907cc54
debug: resize = true
debug: new_memory = 38 u8@18a3907cc7a
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907cc7a
debug: resize = true
debug: new_memory = 65 u8@18a3907ccbb
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a3907ccbb
debug: resize = true
debug: new_memory = 105 u8@18a3907cd24
debug: after memcpy
debug: after free
C:\tools\zig-windows-x86_64-0.14.0-dev.367+a57479afc\lib\std\array_list.zig:434:51: 0xd45962 in ensureTotalCapacity (host-main.exe.obj)
return self.ensureTotalCapacityPrecise(better_capacity);
^
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907cd24
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907cd24
debug: resize = true
debug: new_memory = 20 u8@18a3907cd38
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907cd38
debug: resize = true
debug: new_memory = 38 u8@18a3907cd5e
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907cd5e
debug: resize = true
debug: new_memory = 65 u8@18a3907cd9f
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a3907cd9f
debug: resize = true
debug: new_memory = 105 u8@18a3907ce08
debug: after memcpy
debug: after free
C:\tools\zig-windows-x86_64-0.14.0-dev.367+a57479afc\lib\std\array_list.zig:491:41: 0xd35dd3 in addOne (host-main.exe.obj)
try self.ensureTotalCapacity(newlen);
^
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907ce08
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907ce08
debug: resize = true
debug: new_memory = 20 u8@18a3907ce1c
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907ce1c
debug: resize = true
debug: new_memory = 38 u8@18a3907ce42
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907ce42
debug: resize = true
debug: new_memory = 65 u8@18a3907ce83
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a3907ce83
debug: resize = true
debug: new_memory = 105 u8@18a3907ceec
debug: after memcpy
debug: after free
C:\tools\zig-windows-x86_64-0.14.0-dev.367+a57479afc\lib\std\array_list.zig:262:49: 0xd28494 in append (host-main.exe.obj)
const new_item_ptr = try self.addOne();
^
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907ceec
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907ceec
debug: resize = true
debug: new_memory = 20 u8@18a3907cf00
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907cf00
debug: resize = true
debug: new_memory = 38 u8@18a3907cf26
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907cf26
debug: resize = true
debug: new_memory = 65 u8@18a3907cf67
debug: after memcpy
debug: after free
C:\Users\biosb\zig\zig-em-dev\work\em.core\em.lang\em.zig:391:30: 0xd19ba0 in add (host-main.exe.obj)
self._list.append(item) catch fail();
^
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907cf67
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907cf67
debug: resize = true
debug: new_memory = 20 u8@18a3907cf7b
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907cf7b
debug: resize = true
debug: new_memory = 38 u8@18a3907cfa1
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907cfa1
debug: resize = true
debug: new_memory = 65 u8@18a3907cfe2
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a3907cfe2
debug: resize = true
debug: new_memory = 105 u8@18a3907d04b
debug: after memcpy
debug: after free
C:\Users\biosb\zig\zig-em-dev\work\em.arch\em.arch.arm\IntrVec.em.zig:23:21: 0xcd54a6 in addIntrH (host-main.exe.obj)
name_tab.add(name);
^
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907d04b
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907d04b
debug: resize = true
debug: new_memory = 20 u8@18a3907d05f
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907d05f
debug: resize = true
debug: new_memory = 38 u8@18a3907d085
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907d085
debug: resize = true
debug: new_memory = 65 u8@18a3907d0c6
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a3907d0c6
debug: resize = true
debug: new_memory = 105 u8@18a3907d12f
debug: after memcpy
debug: after free
C:\Users\biosb\zig\zig-em-dev\work\em.arch\em.arch.arm\IntrVec.em.zig:48:21: 0xcd348c in em__initH (host-main.exe.obj)
addIntrH(n);
^
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907d12f
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907d12f
debug: resize = true
debug: new_memory = 20 u8@18a3907d143
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907d143
debug: resize = true
debug: new_memory = 38 u8@18a3907d169
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907d169
debug: resize = true
debug: new_memory = 65 u8@18a3907d1aa
debug: after memcpy
debug: after free
C:\Users\biosb\zig\zig-em-dev\work\em.core\em.lang\host-main.zig:22:12: 0xcd32af in exec__anon_3104 (host-main.exe.obj)
callAll("em__initH", ulist_bot, false);
^
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907d1aa
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907d1aa
debug: resize = true
debug: new_memory = 20 u8@18a3907d1be
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907d1be
debug: resize = true
debug: new_memory = 38 u8@18a3907d1e4
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907d1e4
debug: resize = true
debug: new_memory = 65 u8@18a3907d225
debug: after memcpy
debug: after free
C:\Users\biosb\zig\zig-em-dev\work\.gen\host.zig:4:53: 0xcb1177 in exec (host-main.exe.obj)
@import("../em.core/em.lang/host-main.zig").exec(em.import.@"em.examples.basic/EmptyP".em__U) catch em.fail();
^
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907d225
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907d225
debug: resize = true
debug: new_memory = 20 u8@18a3907d239
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907d239
debug: resize = true
debug: new_memory = 38 u8@18a3907d25f
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907d25f
debug: resize = true
debug: new_memory = 65 u8@18a3907d2a0
debug: after memcpy
debug: after free
C:\Users\biosb\zig\zig-em-dev\work\.main-host.zig:1:51: 0xcb106e in main (host-main.exe.obj)
pub fn main() void { @import(".gen/host.zig").exec(); }
^
debug: self.capacity = 0, new_capacity = 8
debug: old_memory = 0 u8@aaaaaaaaaaaaaaaa
debug: resize = false
debug: new_memory = 8 u8@18a3907d2a0
debug: after memcpy
debug: after free
debug: self.capacity = 8, new_capacity = 20
debug: old_memory = 8 u8@18a3907d2a0
debug: resize = true
debug: new_memory = 20 u8@18a3907d2b4
debug: after memcpy
debug: after free
debug: self.capacity = 20, new_capacity = 38
debug: old_memory = 20 u8@18a3907d2b4
debug: resize = true
debug: new_memory = 38 u8@18a3907d2da
debug: after memcpy
debug: after free
debug: self.capacity = 38, new_capacity = 65
debug: old_memory = 38 u8@18a3907d2da
debug: resize = true
debug: new_memory = 65 u8@18a3907d31b
debug: after memcpy
debug: after free
debug: self.capacity = 65, new_capacity = 105
debug: old_memory = 65 u8@18a3907d31b
debug: resize = true
debug: new_memory = 105 u8@18a3907d384
debug: after memcpy
debug: after free
C:\tools\zig-windows-x86_64-0.14.0-dev.367+a57479afc\lib\std\start.zig:373:53: 0xcb1017 in WinStartup (host-main.exe.obj)
std.os.windows.ntdll.RtlExitUserProcess(callMain());
^
???:?:?: 0x7ff84da67373 in ??? (KERNEL32.DLL)
???:?:?: 0x7ff84f95cc90 in ??? (ntdll.dll)
haven’t checked, but is it possible that my ArenaAllocator
is itself using an ArrayList
internally??? but if so, why wouldn’t i have seen output in my FIRST-AND-ONLY case when capacity was expanded from 0 to 8???