| ... | ... | @@ -84,7 +84,7 @@ const builtin = @import("builtin"); |
| 84 | 84 | const StackTrace = std.builtin.StackTrace; |
| 85 | 85 | |
| 86 | 86 | const std = @import("std"); |
| 87 | | const log = std.log.scoped(.gpa); |
| 87 | const log = std.log.scoped(.DebugAllocator); |
| 88 | 88 | const math = std.math; |
| 89 | 89 | const assert = std.debug.assert; |
| 90 | 90 | const mem = std.mem; |
| ... | ... | @@ -441,7 +441,11 @@ pub fn DebugAllocator(comptime config: Config) type { |
| 441 | 441 | const page_addr = @intFromPtr(bucket) & ~(page_size - 1); |
| 442 | 442 | const addr = page_addr + slot_index * size_class; |
| 443 | 443 | log.err("memory address 0x{x} leaked: {f}", .{ |
| 444 | | addr, std.debug.FormatStackTrace{ .stack_trace = stack_trace }, |
| 444 | addr, |
| 445 | std.debug.FormatStackTrace{ |
| 446 | .stack_trace = stack_trace, |
| 447 | .terminal_mode = std.log.terminalMode(), |
| 448 | }, |
| 445 | 449 | }); |
| 446 | 450 | leaks += 1; |
| 447 | 451 | } |
| ... | ... | @@ -471,7 +475,10 @@ pub fn DebugAllocator(comptime config: Config) type { |
| 471 | 475 | const stack_trace = large_alloc.getStackTrace(.alloc); |
| 472 | 476 | log.err("memory address 0x{x} leaked: {f}", .{ |
| 473 | 477 | @intFromPtr(large_alloc.bytes.ptr), |
| 474 | | std.debug.FormatStackTrace{ .stack_trace = stack_trace }, |
| 478 | std.debug.FormatStackTrace{ |
| 479 | .stack_trace = stack_trace, |
| 480 | .terminal_mode = std.log.terminalMode(), |
| 481 | }, |
| 475 | 482 | }); |
| 476 | 483 | leaks += 1; |
| 477 | 484 | } |
| ... | ... | @@ -528,9 +535,18 @@ pub fn DebugAllocator(comptime config: Config) type { |
| 528 | 535 | var addr_buf: [stack_n]usize = undefined; |
| 529 | 536 | const second_free_stack_trace = std.debug.captureCurrentStackTrace(.{ .first_address = ret_addr }, &addr_buf); |
| 530 | 537 | log.err("Double free detected. Allocation: {f} First free: {f} Second free: {f}", .{ |
| 531 | | std.debug.FormatStackTrace{ .stack_trace = alloc_stack_trace }, |
| 532 | | std.debug.FormatStackTrace{ .stack_trace = free_stack_trace }, |
| 533 | | std.debug.FormatStackTrace{ .stack_trace = second_free_stack_trace }, |
| 538 | std.debug.FormatStackTrace{ |
| 539 | .stack_trace = alloc_stack_trace, |
| 540 | .terminal_mode = std.log.terminalMode(), |
| 541 | }, |
| 542 | std.debug.FormatStackTrace{ |
| 543 | .stack_trace = free_stack_trace, |
| 544 | .terminal_mode = std.log.terminalMode(), |
| 545 | }, |
| 546 | std.debug.FormatStackTrace{ |
| 547 | .stack_trace = second_free_stack_trace, |
| 548 | .terminal_mode = std.log.terminalMode(), |
| 549 | }, |
| 534 | 550 | }); |
| 535 | 551 | } |
| 536 | 552 | |
| ... | ... | @@ -575,8 +591,14 @@ pub fn DebugAllocator(comptime config: Config) type { |
| 575 | 591 | log.err("Allocation size {d} bytes does not match free size {d}. Allocation: {f} Free: {f}", .{ |
| 576 | 592 | entry.value_ptr.bytes.len, |
| 577 | 593 | old_mem.len, |
| 578 | | std.debug.FormatStackTrace{ .stack_trace = entry.value_ptr.getStackTrace(.alloc) }, |
| 579 | | std.debug.FormatStackTrace{ .stack_trace = free_stack_trace }, |
| 594 | std.debug.FormatStackTrace{ |
| 595 | .stack_trace = entry.value_ptr.getStackTrace(.alloc), |
| 596 | .terminal_mode = std.log.terminalMode(), |
| 597 | }, |
| 598 | std.debug.FormatStackTrace{ |
| 599 | .stack_trace = free_stack_trace, |
| 600 | .terminal_mode = std.log.terminalMode(), |
| 601 | }, |
| 580 | 602 | }); |
| 581 | 603 | } |
| 582 | 604 | |
| ... | ... | @@ -682,8 +704,14 @@ pub fn DebugAllocator(comptime config: Config) type { |
| 682 | 704 | log.err("Allocation size {d} bytes does not match free size {d}. Allocation: {f} Free: {f}", .{ |
| 683 | 705 | entry.value_ptr.bytes.len, |
| 684 | 706 | old_mem.len, |
| 685 | | std.debug.FormatStackTrace{ .stack_trace = entry.value_ptr.getStackTrace(.alloc) }, |
| 686 | | std.debug.FormatStackTrace{ .stack_trace = free_stack_trace }, |
| 707 | std.debug.FormatStackTrace{ |
| 708 | .stack_trace = entry.value_ptr.getStackTrace(.alloc), |
| 709 | .terminal_mode = std.log.terminalMode(), |
| 710 | }, |
| 711 | std.debug.FormatStackTrace{ |
| 712 | .stack_trace = free_stack_trace, |
| 713 | .terminal_mode = std.log.terminalMode(), |
| 714 | }, |
| 687 | 715 | }); |
| 688 | 716 | } |
| 689 | 717 | |
| ... | ... | @@ -910,8 +938,12 @@ pub fn DebugAllocator(comptime config: Config) type { |
| 910 | 938 | old_memory.len, |
| 911 | 939 | std.debug.FormatStackTrace{ |
| 912 | 940 | .stack_trace = bucketStackTrace(bucket, slot_count, slot_index, .alloc), |
| 941 | .terminal_mode = std.log.terminalMode(), |
| 942 | }, |
| 943 | std.debug.FormatStackTrace{ |
| 944 | .stack_trace = free_stack_trace, |
| 945 | .terminal_mode = std.log.terminalMode(), |
| 913 | 946 | }, |
| 914 | | std.debug.FormatStackTrace{ .stack_trace = free_stack_trace }, |
| 915 | 947 | }); |
| 916 | 948 | } |
| 917 | 949 | if (alignment != slot_alignment) { |
| ... | ... | @@ -921,8 +953,12 @@ pub fn DebugAllocator(comptime config: Config) type { |
| 921 | 953 | alignment.toByteUnits(), |
| 922 | 954 | std.debug.FormatStackTrace{ |
| 923 | 955 | .stack_trace = bucketStackTrace(bucket, slot_count, slot_index, .alloc), |
| 956 | .terminal_mode = std.log.terminalMode(), |
| 957 | }, |
| 958 | std.debug.FormatStackTrace{ |
| 959 | .stack_trace = free_stack_trace, |
| 960 | .terminal_mode = std.log.terminalMode(), |
| 924 | 961 | }, |
| 925 | | std.debug.FormatStackTrace{ .stack_trace = free_stack_trace }, |
| 926 | 962 | }); |
| 927 | 963 | } |
| 928 | 964 | } |
| ... | ... | @@ -1011,8 +1047,12 @@ pub fn DebugAllocator(comptime config: Config) type { |
| 1011 | 1047 | memory.len, |
| 1012 | 1048 | std.debug.FormatStackTrace{ |
| 1013 | 1049 | .stack_trace = bucketStackTrace(bucket, slot_count, slot_index, .alloc), |
| 1050 | .terminal_mode = std.log.terminalMode(), |
| 1051 | }, |
| 1052 | std.debug.FormatStackTrace{ |
| 1053 | .stack_trace = free_stack_trace, |
| 1054 | .terminal_mode = std.log.terminalMode(), |
| 1014 | 1055 | }, |
| 1015 | | std.debug.FormatStackTrace{ .stack_trace = free_stack_trace }, |
| 1016 | 1056 | }); |
| 1017 | 1057 | } |
| 1018 | 1058 | if (alignment != slot_alignment) { |
| ... | ... | @@ -1022,8 +1062,12 @@ pub fn DebugAllocator(comptime config: Config) type { |
| 1022 | 1062 | alignment.toByteUnits(), |
| 1023 | 1063 | std.debug.FormatStackTrace{ |
| 1024 | 1064 | .stack_trace = bucketStackTrace(bucket, slot_count, slot_index, .alloc), |
| 1065 | .terminal_mode = std.log.terminalMode(), |
| 1066 | }, |
| 1067 | std.debug.FormatStackTrace{ |
| 1068 | .stack_trace = free_stack_trace, |
| 1069 | .terminal_mode = std.log.terminalMode(), |
| 1025 | 1070 | }, |
| 1026 | | std.debug.FormatStackTrace{ .stack_trace = free_stack_trace }, |
| 1027 | 1071 | }); |
| 1028 | 1072 | } |
| 1029 | 1073 | } |