Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 68 additions & 62 deletions LuaDkmDebuggerComponent/LocalComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2531,103 +2531,109 @@ DkmResolvedDocument[] IDkmSymbolDocumentCollectionQuery.FindDocuments(DkmModule
{
DkmCustomModuleInstance moduleInstance = module.GetModuleInstances().OfType<DkmCustomModuleInstance>().FirstOrDefault(el => el.Module.CompilerId.VendorId == Guids.luaCompilerGuid);

if (moduleInstance == null)
return module.FindDocuments(sourceFileId);

log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments begin ({sourceFileId.DocumentName})");
if (moduleInstance != null)
{
log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments begin ({sourceFileId.DocumentName})");

var process = moduleInstance.Process;
var processData = process.GetDataItem<LuaLocalProcessData>();
var process = moduleInstance.Process;
var processData = process.GetDataItem<LuaLocalProcessData>();

lock (processData.symbolStore)
{
foreach (var state in processData.symbolStore.knownStates)
lock (processData.symbolStore)
{
foreach (var source in state.Value.knownSources)
foreach (var state in processData.symbolStore.knownStates)
{
// Resolve script path if it's not resolved yet
if (source.Value.resolvedFileName == null)
foreach (var source in state.Value.knownSources)
{
var scriptSource = processData.symbolStore.FetchScriptSource(source.Key);
// Resolve script path if it's not resolved yet
if (source.Value.resolvedFileName == null)
{
var scriptSource = processData.symbolStore.FetchScriptSource(source.Key);

if (scriptSource?.resolvedFileName != null)
source.Value.resolvedFileName = scriptSource.resolvedFileName;
else
source.Value.resolvedFileName = TryFindSourcePath(process.Path, processData, source.Key, scriptSource?.scriptContent, true, out string loadStatus);
if (scriptSource?.resolvedFileName != null)
source.Value.resolvedFileName = scriptSource.resolvedFileName;
else
source.Value.resolvedFileName = TryFindSourcePath(process.Path, processData, source.Key, scriptSource?.scriptContent, true, out string loadStatus);

if (source.Value.resolvedFileName != null)
log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments Resolved {source.Value.sourceFileName} to {source.Value.resolvedFileName}");
}
if (source.Value.resolvedFileName != null)
log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments Resolved {source.Value.sourceFileName} to {source.Value.resolvedFileName}");
}

var fileName = source.Value.resolvedFileName;
var fileName = source.Value.resolvedFileName;

if (sourceFileId.DocumentName == fileName)
{
var dataItem = new LuaResolvedDocumentItem
if (sourceFileId.DocumentName == fileName)
{
source = source.Value
};
var dataItem = new LuaResolvedDocumentItem
{
source = source.Value
};

log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments success (known source '{source}')");
log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments success (known source '{source}')");

return new DkmResolvedDocument[1] { DkmResolvedDocument.Create(module, sourceFileId.DocumentName, null, DkmDocumentMatchStrength.FullPath, DkmResolvedDocumentWarning.None, false, dataItem) };
return new DkmResolvedDocument[1] { DkmResolvedDocument.Create(module, sourceFileId.DocumentName, null, DkmDocumentMatchStrength.FullPath, DkmResolvedDocumentWarning.None, false, dataItem) };
}
}
}
}

foreach (var state in processData.symbolStore.knownStates)
{
foreach (var script in state.Value.knownScripts)
foreach (var state in processData.symbolStore.knownStates)
{
// Resolve script path if it's not resolved yet
if (script.Value.resolvedFileName == null)
foreach (var script in state.Value.knownScripts)
{
// Check match based on hash
if (sourceFileId.SHA1HashPart != null && script.Value.sha1Hash != null)
// Resolve script path if it's not resolved yet
if (script.Value.resolvedFileName == null)
{
int value0 = (int)(((uint)script.Value.sha1Hash[3] << 24) | ((uint)script.Value.sha1Hash[2] << 16) | ((uint)script.Value.sha1Hash[1] << 8) | (uint)script.Value.sha1Hash[0]);
int value1 = (int)(((uint)script.Value.sha1Hash[7] << 24) | ((uint)script.Value.sha1Hash[6] << 16) | ((uint)script.Value.sha1Hash[5] << 8) | (uint)script.Value.sha1Hash[4]);
int value2 = (int)(((uint)script.Value.sha1Hash[11] << 24) | ((uint)script.Value.sha1Hash[10] << 16) | ((uint)script.Value.sha1Hash[9] << 8) | (uint)script.Value.sha1Hash[8]);
int value3 = (int)(((uint)script.Value.sha1Hash[15] << 24) | ((uint)script.Value.sha1Hash[14] << 16) | ((uint)script.Value.sha1Hash[13] << 8) | (uint)script.Value.sha1Hash[12]);
int value4 = (int)(((uint)script.Value.sha1Hash[19] << 24) | ((uint)script.Value.sha1Hash[18] << 16) | ((uint)script.Value.sha1Hash[17] << 8) | (uint)script.Value.sha1Hash[16]);

if (sourceFileId.SHA1HashPart.Value.Value0 == value0 && sourceFileId.SHA1HashPart.Value.Value1 == value1 && sourceFileId.SHA1HashPart.Value.Value2 == value2 && sourceFileId.SHA1HashPart.Value.Value3 == value3 && sourceFileId.SHA1HashPart.Value.Value4 == value4)
// Check match based on hash
if (sourceFileId.SHA1HashPart != null && script.Value.sha1Hash != null)
{
log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments Resolved {script.Value.sourceFileName} to {sourceFileId.DocumentName} based on SHA-1 hash");
int value0 = (int)(((uint)script.Value.sha1Hash[3] << 24) | ((uint)script.Value.sha1Hash[2] << 16) | ((uint)script.Value.sha1Hash[1] << 8) | (uint)script.Value.sha1Hash[0]);
int value1 = (int)(((uint)script.Value.sha1Hash[7] << 24) | ((uint)script.Value.sha1Hash[6] << 16) | ((uint)script.Value.sha1Hash[5] << 8) | (uint)script.Value.sha1Hash[4]);
int value2 = (int)(((uint)script.Value.sha1Hash[11] << 24) | ((uint)script.Value.sha1Hash[10] << 16) | ((uint)script.Value.sha1Hash[9] << 8) | (uint)script.Value.sha1Hash[8]);
int value3 = (int)(((uint)script.Value.sha1Hash[15] << 24) | ((uint)script.Value.sha1Hash[14] << 16) | ((uint)script.Value.sha1Hash[13] << 8) | (uint)script.Value.sha1Hash[12]);
int value4 = (int)(((uint)script.Value.sha1Hash[19] << 24) | ((uint)script.Value.sha1Hash[18] << 16) | ((uint)script.Value.sha1Hash[17] << 8) | (uint)script.Value.sha1Hash[16]);

if (sourceFileId.SHA1HashPart.Value.Value0 == value0 && sourceFileId.SHA1HashPart.Value.Value1 == value1 && sourceFileId.SHA1HashPart.Value.Value2 == value2 && sourceFileId.SHA1HashPart.Value.Value3 == value3 && sourceFileId.SHA1HashPart.Value.Value4 == value4)
{
log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments Resolved {script.Value.sourceFileName} to {sourceFileId.DocumentName} based on SHA-1 hash");

script.Value.resolvedFileName = sourceFileId.DocumentName;
script.Value.resolvedFileName = sourceFileId.DocumentName;
}
}
}

if (script.Value.resolvedFileName == null)
{
script.Value.resolvedFileName = TryFindSourcePath(process.Path, processData, script.Key, script.Value.scriptContent, true, out string loadStatus);
if (script.Value.resolvedFileName == null)
{
script.Value.resolvedFileName = TryFindSourcePath(process.Path, processData, script.Key, script.Value.scriptContent, true, out string loadStatus);

if (script.Value.resolvedFileName != null)
log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments Resolved {script.Value.sourceFileName} to {script.Value.resolvedFileName}");
if (script.Value.resolvedFileName != null)
log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments Resolved {script.Value.sourceFileName} to {script.Value.resolvedFileName}");
}
}
}

var fileName = script.Value.resolvedFileName;
var fileName = script.Value.resolvedFileName;

if (sourceFileId.DocumentName == fileName)
{
var dataItem = new LuaResolvedDocumentItem
if (sourceFileId.DocumentName == fileName)
{
script = script.Value
};
var dataItem = new LuaResolvedDocumentItem
{
script = script.Value
};

log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments success (known script '{script}')");
log.Debug($"IDkmSymbolDocumentCollectionQuery.FindDocuments success (known script '{script}')");

return new DkmResolvedDocument[1] { DkmResolvedDocument.Create(module, sourceFileId.DocumentName, null, DkmDocumentMatchStrength.FullPath, DkmResolvedDocumentWarning.None, false, dataItem) };
return new DkmResolvedDocument[1] { DkmResolvedDocument.Create(module, sourceFileId.DocumentName, null, DkmDocumentMatchStrength.FullPath, DkmResolvedDocumentWarning.None, false, dataItem) };
}
}
}
}
}

log.Error($"IDkmSymbolDocumentCollectionQuery.FindDocuments failure {sourceFileId.DocumentName}");

return module.FindDocuments(sourceFileId);
try
{
return module.FindDocuments(sourceFileId);
}
catch
{
return null;
}
}

bool FindFunctionInstructionForLine(DkmProcess process, LuaFunctionData function, int startLine, int endLine, out LuaFunctionData targetFunction, out int targetInstructionPointer, out int targetLine)
Expand Down