Skip to content

Commit 366a73b

Browse files
[Java.Interop.Tools.Cecil] Fix retry logic in ReadAssembly to skip symbol loading
The retry in ReadAssembly sets reader_parameters.ReadSymbols = false, but LoadFromMemoryMappedFile checks the instance field loadDebugSymbols instead, so the retry re-opens the same locked PDB file and throws the same IOException. Fix by passing an explicit loadSymbols parameter to LoadFromMemoryMappedFile so the retry can actually skip symbol loading. Also skip the try/catch entirely when loadDebugSymbols is false, since there is nothing to retry in that case. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent c7b4ea6 commit 366a73b

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/DirectoryAssemblyResolver.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,35 +161,38 @@ protected virtual AssemblyDefinition ReadAssembly (string file)
161161
ReflectionImporterProvider = loadReaderParameters.ReflectionImporterProvider,
162162
SymbolReaderProvider = loadReaderParameters.SymbolReaderProvider,
163163
};
164+
if (!loadDebugSymbols) {
165+
return LoadFromMemoryMappedFile (file, reader_parameters, loadSymbols: false);
166+
}
164167
try {
165-
return LoadFromMemoryMappedFile (file, reader_parameters);
168+
return LoadFromMemoryMappedFile (file, reader_parameters, loadSymbols: true);
166169
} catch (Exception ex) {
167170
logger (
168171
TraceLevel.Verbose,
169172
$"Failed to read '{file}' with debugging symbols. Retrying to load it without it. Error details are logged below.");
170173
logger (TraceLevel.Verbose, ex.ToString ());
171174
reader_parameters.ReadSymbols = false;
172-
return LoadFromMemoryMappedFile (file, reader_parameters);
175+
return LoadFromMemoryMappedFile (file, reader_parameters, loadSymbols: false);
173176
} finally {
174177
reader_parameters.SymbolStream?.Dispose ();
175178
}
176179
}
177180

178-
AssemblyDefinition LoadFromMemoryMappedFile (string file, ReaderParameters options)
181+
AssemblyDefinition LoadFromMemoryMappedFile (string file, ReaderParameters options, bool loadSymbols)
179182
{
180183
// We can't use MemoryMappedFile when ReadWrite is true
181184
if (options.ReadWrite) {
182-
if (loadDebugSymbols) {
185+
if (loadSymbols) {
183186
LoadSymbols (file, options, File.OpenRead);
184187
}
185188
return AssemblyDefinition.ReadAssembly (file, options);
186189
}
187190

188191
// We know the capacity for disposables
189192
var disposables = new List<IDisposable> (
190-
(1 + (loadDebugSymbols ? 1 : 0)) * OpenMemoryMappedViewStream_disposables_Add_calls);
193+
(1 + (loadSymbols ? 1 : 0)) * OpenMemoryMappedViewStream_disposables_Add_calls);
191194
try {
192-
if (loadDebugSymbols) {
195+
if (loadSymbols) {
193196
LoadSymbols (file, options, f => OpenMemoryMappedViewStream (f, disposables));
194197
}
195198

0 commit comments

Comments
 (0)