| ... | ... | @@ -154,17 +154,29 @@ fn loadDebugInfo(module: *const WindowsModule, gpa: Allocator, di: *DebugInfo) ! |
| 154 | 154 | }; |
| 155 | 155 | defer if (path.ptr != raw_path.ptr) gpa.free(path); |
| 156 | 156 | |
| 157 | | di.pdb = Pdb.init(gpa, path) catch |err| switch (err) { |
| 157 | const pdb_file = std.fs.cwd().openFile(path, .{}) catch |err| switch (err) { |
| 158 | 158 | error.FileNotFound, error.IsDir => break :pdb, |
| 159 | 159 | else => |e| return e, |
| 160 | 160 | }; |
| 161 | | try di.pdb.?.parseInfoStream(); |
| 162 | | try di.pdb.?.parseDbiStream(); |
| 161 | errdefer pdb_file.close(); |
| 163 | 162 | |
| 164 | | if (!mem.eql(u8, &coff_obj.guid, &di.pdb.?.guid) or coff_obj.age != di.pdb.?.age) |
| 163 | const pdb_reader = try gpa.create(std.fs.File.Reader); |
| 164 | errdefer gpa.destroy(pdb_reader); |
| 165 | |
| 166 | pdb_reader.* = pdb_file.reader(try gpa.alloc(u8, 4096)); |
| 167 | errdefer gpa.free(pdb_reader.interface.buffer); |
| 168 | |
| 169 | var pdb: Pdb = try .init(gpa, pdb_reader); |
| 170 | errdefer pdb.deinit(); |
| 171 | try pdb.parseInfoStream(); |
| 172 | try pdb.parseDbiStream(); |
| 173 | |
| 174 | if (!mem.eql(u8, &coff_obj.guid, &pdb.guid) or coff_obj.age != pdb.age) |
| 165 | 175 | return error.InvalidDebugInfo; |
| 166 | 176 | |
| 167 | 177 | di.coff_section_headers = try coff_obj.getSectionHeadersAlloc(gpa); |
| 178 | |
| 179 | di.pdb = pdb; |
| 168 | 180 | } |
| 169 | 181 | |
| 170 | 182 | di.loaded = true; |
| ... | ... | @@ -204,7 +216,12 @@ pub const DebugInfo = struct { |
| 204 | 216 | pub fn deinit(di: *DebugInfo, gpa: Allocator) void { |
| 205 | 217 | if (!di.loaded) return; |
| 206 | 218 | if (di.dwarf) |*dwarf| dwarf.deinit(gpa); |
| 207 | | if (di.pdb) |*pdb| pdb.deinit(); |
| 219 | if (di.pdb) |*pdb| { |
| 220 | pdb.file_reader.file.close(); |
| 221 | gpa.free(pdb.file_reader.interface.buffer); |
| 222 | gpa.destroy(pdb.file_reader); |
| 223 | pdb.deinit(); |
| 224 | } |
| 208 | 225 | gpa.free(di.coff_section_headers); |
| 209 | 226 | if (di.mapped_file) |mapped| { |
| 210 | 227 | const process_handle = windows.GetCurrentProcess(); |