| ... | ... | @@ -253,11 +253,11 @@ fn machoSearchSymbols(symbols: []const MachoSymbol, address: usize) ?*const Mach |
| 253 | 253 | return null; |
| 254 | 254 | } |
| 255 | 255 | |
| 256 | | fn printSourceAtAddressMacOs(debug_info: *DebugInfo, out_stream: var, address: usize, tty_color: bool) !void { |
| 256 | fn printSourceAtAddressMacOs(di: *DebugInfo, out_stream: var, address: usize, tty_color: bool) !void { |
| 257 | 257 | const base_addr = @ptrToInt(&std.c._mh_execute_header); |
| 258 | 258 | const adjusted_addr = 0x100000000 + (address - base_addr); |
| 259 | 259 | |
| 260 | | const symbol = machoSearchSymbols(debug_info.symbols, adjusted_addr) orelse { |
| 260 | const symbol = machoSearchSymbols(di.symbols, adjusted_addr) orelse { |
| 261 | 261 | if (tty_color) { |
| 262 | 262 | try out_stream.print("???:?:?: " ++ DIM ++ "0x{x} in ??? (???)" ++ RESET ++ "\n\n\n", address); |
| 263 | 263 | } else { |
| ... | ... | @@ -266,16 +266,19 @@ fn printSourceAtAddressMacOs(debug_info: *DebugInfo, out_stream: var, address: u |
| 266 | 266 | return; |
| 267 | 267 | }; |
| 268 | 268 | |
| 269 | | const symbol_name = mem.toSliceConst(u8, debug_info.strings.ptr + symbol.nlist.n_strx); |
| 270 | | if (getLineNumberInfoMacOs(debug_info, symbol.*, address)) |line_info| { |
| 271 | | const compile_unit_name = "???"; |
| 272 | | try printLineInfo(debug_info, out_stream, line_info, address, symbol_name, compile_unit_name, tty_color); |
| 269 | const symbol_name = mem.toSliceConst(u8, di.strings.ptr + symbol.nlist.n_strx); |
| 270 | const compile_unit_name = if (symbol.ofile) |ofile| blk: { |
| 271 | const ofile_path = mem.toSliceConst(u8, di.strings.ptr + ofile.n_strx); |
| 272 | break :blk os.path.basename(ofile_path); |
| 273 | } else "???"; |
| 274 | if (getLineNumberInfoMacOs(di, symbol.*, address)) |line_info| { |
| 275 | try printLineInfo(di, out_stream, line_info, address, symbol_name, compile_unit_name, tty_color); |
| 273 | 276 | } else |err| switch (err) { |
| 274 | 277 | error.MissingDebugInfo => { |
| 275 | 278 | if (tty_color) { |
| 276 | | try out_stream.print("???:?:?: " ++ DIM ++ "0x{x} in {} (???)" ++ RESET ++ "\n\n\n", address, symbol_name); |
| 279 | try out_stream.print("???:?:?: " ++ DIM ++ "0x{x} in {} ({})" ++ RESET ++ "\n\n\n", address, symbol_name, compile_unit_name); |
| 277 | 280 | } else { |
| 278 | | try out_stream.print("???:?:?: 0x{x} in {} (???)\n\n\n", address, symbol_name); |
| 281 | try out_stream.print("???:?:?: 0x{x} in {} ({})\n\n\n", address, symbol_name, compile_unit_name); |
| 279 | 282 | } |
| 280 | 283 | }, |
| 281 | 284 | else => return err, |
| ... | ... | @@ -516,6 +519,8 @@ const MachoSymbol = struct { |
| 516 | 519 | |
| 517 | 520 | const MachOFile = struct { |
| 518 | 521 | bytes: []align(@alignOf(std.c.mach_header_64)) const u8, |
| 522 | sect_debug_info: ?*const std.c.section_64, |
| 523 | sect_debug_line: ?*const std.c.section_64, |
| 519 | 524 | }; |
| 520 | 525 | |
| 521 | 526 | pub const DebugInfo = switch (builtin.os) { |
| ... | ... | @@ -964,6 +969,8 @@ fn getLineNumberInfoMacOs(di: *DebugInfo, symbol: MachoSymbol, target_address: u |
| 964 | 969 | |
| 965 | 970 | gop.kv.value = MachOFile{ |
| 966 | 971 | .bytes = try std.io.readFileAllocAligned(di.ofiles.allocator, ofile_path, @alignOf(std.c.mach_header_64)), |
| 972 | .sect_debug_info = null, |
| 973 | .sect_debug_line = null, |
| 967 | 974 | }; |
| 968 | 975 | const hdr = @ptrCast(*const std.c.mach_header_64, gop.kv.value.bytes.ptr); |
| 969 | 976 | assert(hdr.magic == std.c.MH_MAGIC_64); |
| ... | ... | @@ -981,11 +988,16 @@ fn getLineNumberInfoMacOs(di: *DebugInfo, symbol: MachoSymbol, target_address: u |
| 981 | 988 | } else { |
| 982 | 989 | return error.MissingDebugInfo; |
| 983 | 990 | }; |
| 984 | | const sections = @ptrCast([*]const std.c.section_64, ptr + @sizeOf(std.c.segment_command_64))[0..segcmd.nsects]; |
| 985 | | for (sections) |sect| { |
| 991 | const sections = @alignCast(@alignOf(std.c.section_64), @ptrCast([*]const std.c.section_64, ptr + @sizeOf(std.c.segment_command_64)))[0..segcmd.nsects]; |
| 992 | for (sections) |*sect| { |
| 986 | 993 | if (sect.flags & std.c.SECTION_TYPE == std.c.S_REGULAR and |
| 987 | 994 | (sect.flags & std.c.SECTION_ATTRIBUTES) & std.c.S_ATTR_DEBUG == std.c.S_ATTR_DEBUG) { |
| 988 | 995 | const sect_name = mem.toSliceConst(u8, &sect.sectname); |
| 996 | if (mem.eql(u8, sect_name, "__debug_line")) { |
| 997 | gop.kv.value.sect_debug_line = sect; |
| 998 | } else if (mem.eql(u8, sect_name, "__debug_info")) { |
| 999 | gop.kv.value.sect_debug_info = sect; |
| 1000 | } |
| 989 | 1001 | std.debug.warn("sect: {}\n", sect_name); |
| 990 | 1002 | } |
| 991 | 1003 | } |