public override void Handle(DkmProcess process) { var pythonRuntime = process.GetPythonRuntimeInstance(); if (pythonRuntime == null) { return; } string moduleName; if (ModuleId == Guids.UnknownPythonModuleGuid) { moduleName = "<unknown>"; } else { try { moduleName = Path.GetFileName(FileName); } catch (ArgumentException) { moduleName = FileName; } } var module = DkmModule.Create(new DkmModuleId(ModuleId, Guids.PythonSymbolProviderGuid), FileName, new DkmCompilerId(Guids.MicrosoftVendorGuid, Guids.PythonLanguageGuid), process.Connection, null); var moduleInstance = DkmCustomModuleInstance.Create(moduleName, FileName, 0, pythonRuntime, null, null, DkmModuleFlags.None, DkmModuleMemoryLayout.Unknown, 0, 0, 0, "Python", false, null, null, null); moduleInstance.SetModule(module, true); }
public InspectionScope(DkmClrInstructionAddress address, InspectionSession session) { InstructionAddress = address; SymModule = address.ModuleInstance.Module; CurrentMethodToken = address.MethodId.Token; Session = session; }
public DkmClrModuleInstance( DkmClrRuntimeInstance runtimeInstance, Assembly assembly, DkmModule module ) : base(module) { _runtimeInstance = runtimeInstance; this.Assembly = assembly; }
DkmResolvedDocument[] IDkmSymbolDocumentCollectionQuery.FindDocuments(DkmModule module, DkmSourceFileId sourceFileId) { if (module.CompilerId.LanguageId != Guids.PythonLanguageGuid) { Debug.Fail("Non-Python module passed to FindDocuments."); throw new NotSupportedException(); } return(ModuleManager.FindDocuments(module, sourceFileId)); }
void IDkmModuleSymbolsLoadedNotification.OnModuleSymbolsLoaded( DkmModuleInstance moduleInstance, DkmModule module, bool isReload, DkmWorkList workList, DkmEventDescriptor eventDescriptor ) { OnModuleLoad(moduleInstance, workList); }
public static ComPtr <IDiaSymbol> GetRootSymbol(DkmModule module) { ComPtr <IDiaSession> session; Guid diaSessionGuid = typeof(IDiaSession).GUID; using (session = ComPtr.Create((IDiaSession)module.GetSymbolInterface(diaSessionGuid))) { IDiaEnumSymbols enumerator; session.Ptr.findChildren(null, SymTagEnum.SymTagExe, null, 0, out enumerator); if (enumerator.count == 0) { return(new ComPtr <IDiaSymbol>()); } return(ComPtr.Create(enumerator.Item(0))); } }
public static DkmResolvedDocument[] FindDocuments(DkmModule module, DkmSourceFileId sourceFileId) { DkmDocumentMatchStrength matchStrength; // Shortcut invalid modules. if (module.Name.Contains("<")) { return(new DkmResolvedDocument[0]); } if (string.Equals(module.Name, sourceFileId.DocumentName, StringComparison.OrdinalIgnoreCase)) { matchStrength = DkmDocumentMatchStrength.FullPath; } else { // Either the module path is relative, or it's absolute but on a different filesystem (i.e. remote debugging). // Walk the local filesystem up starting from source file path, matching it against the module path component // by component, stopping once __init__.py is no longer seen on the same level. The intent is to approximate // a match on module names by matching the tails of the two paths that contribute to the fully qualified names // of the modules. string sourcePath = sourceFileId.DocumentName; string modulePath = module.Name; int levels = 0; do { try { string sourceFile = Path.GetFileName(sourcePath); string moduleFile = Path.GetFileName(modulePath); if (!string.Equals(sourceFile, moduleFile, StringComparison.OrdinalIgnoreCase)) { return(new DkmResolvedDocument[0]); } sourcePath = Path.GetDirectoryName(sourcePath); modulePath = Path.GetDirectoryName(modulePath); } catch (ArgumentException) { return(new DkmResolvedDocument[0]); } ++levels; } while (File.Exists(Path.Combine(sourcePath, "__init__.py"))); matchStrength = (levels == 1) ? DkmDocumentMatchStrength.FileName : DkmDocumentMatchStrength.SubPath; } return(new[] { DkmResolvedDocument.Create(module, module.Name, null, matchStrength, DkmResolvedDocumentWarning.None, false, null) }); }
internal DkmModuleInstance(DkmModule module) { this.Module = module; }
object IDkmSymbolQuery.GetSymbolInterface(DkmModule module, Guid interfaceID) { throw new NotImplementedException(); }
void IDkmModuleSymbolsLoadedNotification.OnModuleSymbolsLoaded(DkmModuleInstance moduleInstance, DkmModule module, bool isReload, DkmWorkList workList, DkmEventDescriptor eventDescriptor) { var process = moduleInstance.Process; var engines = process.DebugLaunchSettings.EngineFilter; if (engines == null || !engines.Contains(AD7Engine.DebugEngineGuid)) { return; } var pyrtInfo = process.GetPythonRuntimeInfo(); var nativeModuleInstance = moduleInstance as DkmNativeModuleInstance; if (nativeModuleInstance != null) { if (PythonDLLs.CTypesNames.Contains(moduleInstance.Name)) { pyrtInfo.DLLs.CTypes = nativeModuleInstance; var traceHelper = process.GetDataItem <TraceManagerLocalHelper>(); if (traceHelper != null) { traceHelper.OnCTypesLoaded(nativeModuleInstance); } } else if (PythonDLLs.GetPythonLanguageVersion(nativeModuleInstance) != PythonLanguageVersion.None) { if (IsModuleCompiledWithPGO(moduleInstance)) { pyrtInfo.DLLs.Python = null; var pgoWarnMsg = DkmCustomMessage.Create(process.Connection, process, Guid.Empty, (int)VsPackageMessage.WarnAboutPGO, moduleInstance.Name, null); pgoWarnMsg.SendToVsService(Guids.CustomDebuggerEventHandlerGuid, IsBlocking: true); return; } } } if (process.GetPythonRuntimeInstance() != null) { return; } if (pyrtInfo.DLLs.Python != null && pyrtInfo.DLLs.Python.HasSymbols()) { if (process.LivePart == null || pyrtInfo.DLLs.DebuggerHelper != null) { CreatePythonRuntimeInstance(process); } else { InjectHelperDll(process); } } }
DkmCustomMessage IDkmCustomMessageForwardReceiver.SendLower(DkmCustomMessage customMessage) { var process = customMessage.Process; var processData = DebugHelpers.GetOrCreateDataItem <LuaRemoteProcessData>(process); if (customMessage.MessageCode == MessageToRemote.createRuntime) { if (processData.language == null) { processData.compilerId = new DkmCompilerId(Guids.luaCompilerGuid, Guids.luaLanguageGuid); processData.language = DkmLanguage.Create("Lua", processData.compilerId); } if (processData.runtimeInstance == null) { DkmRuntimeInstanceId runtimeId = new DkmRuntimeInstanceId(Guids.luaRuntimeGuid, 0); processData.runtimeInstance = DkmCustomRuntimeInstance.Create(process, runtimeId, null); } if (processData.module == null) { DkmModuleId moduleId = new DkmModuleId(Guid.NewGuid(), Guids.luaSymbolProviderGuid); processData.module = DkmModule.Create(moduleId, "lua.vm.code", processData.compilerId, process.Connection, null); } if (processData.moduleInstance == null) { DkmDynamicSymbolFileId symbolFileId = DkmDynamicSymbolFileId.Create(Guids.luaSymbolProviderGuid); processData.moduleInstance = DkmCustomModuleInstance.Create("lua_vm", "lua.vm.code", 0, processData.runtimeInstance, null, symbolFileId, DkmModuleFlags.None, DkmModuleMemoryLayout.Unknown, 0, 1, 0, "Lua vm code", false, null, null, null); processData.moduleInstance.SetModule(processData.module, true); // Can use reload? } } else if (customMessage.MessageCode == MessageToRemote.luaHelperDataLocations) { var data = new HelperLocationsMessage(); data.ReadFrom(customMessage.Parameter1 as byte[]); processData.locations = data; } else if (customMessage.MessageCode == MessageToRemote.pauseBreakpoints) { processData.pauseBreakpoints = true; } else if (customMessage.MessageCode == MessageToRemote.resumeBreakpoints) { processData.pauseBreakpoints = false; } else if (customMessage.MessageCode == MessageToRemote.luaVersionInfo) { processData.luaVersion = (customMessage.Parameter1 as int?).GetValueOrDefault(0); LuaHelpers.luaVersion = processData.luaVersion; } else if (customMessage.MessageCode == MessageToRemote.registerLuaState) { var data = new RegisterStateMessage(); data.ReadFrom(customMessage.Parameter1 as byte[]); Debug.Assert(processData.knownStates.ContainsKey(data.stateAddress) == false); if (processData.knownStates.ContainsKey(data.stateAddress)) { Debug.WriteLine("IDkmCustomMessageForwardReceiver.SendLower() Duplicate Lua state registration, destruction was probably missed!"); } else { processData.knownStates.Add(data.stateAddress, data); if (processData.hooksEnabled) { SetupHooks(process, processData); } } } else if (customMessage.MessageCode == MessageToRemote.unregisterLuaState) { var data = new UnregisterStateMessage(); data.ReadFrom(customMessage.Parameter1 as byte[]); // Registration is called only for states that can be hooked, unregistration is always called if (processData.knownStates.ContainsKey(data.stateAddress)) { processData.knownStates.Remove(data.stateAddress); } } return(null); }
void IDkmModuleSymbolsLoadedNotification.OnModuleSymbolsLoaded(DkmModuleInstance moduleInstance, DkmModule module, bool isReload, DkmWorkList workList, DkmEventDescriptor eventDescriptor) { var process = moduleInstance.Process; var engines = process.DebugLaunchSettings.EngineFilter; if (engines == null || !engines.Contains(Guids.PythonDebugEngineGuid)) { return; } var pyrtInfo = process.GetPythonRuntimeInfo(); var nativeModuleInstance = moduleInstance as DkmNativeModuleInstance; if (nativeModuleInstance != null) { if (PythonDLLs.CTypesNames.Contains(moduleInstance.Name)) { pyrtInfo.DLLs.CTypes = nativeModuleInstance; var traceHelper = process.GetDataItem <TraceManagerLocalHelper>(); if (traceHelper != null) { traceHelper.OnCTypesLoaded(nativeModuleInstance); } } } if (process.GetPythonRuntimeInstance() != null) { return; } if (pyrtInfo.DLLs.Python != null && pyrtInfo.DLLs.Python.HasSymbols()) { if (process.LivePart == null || pyrtInfo.DLLs.DebuggerHelper != null) { CreatePythonRuntimeInstance(process); } else { InjectHelperDll(process); } } }
void IDkmProcessExecutionNotification.OnProcessPause(DkmProcess process, DkmProcessExecutionCounters processCounters) { try { ulong?moduleBaseOpt = DebugHelpers.ReadPointerVariable(process, "nullcModuleStartAddress"); // Check if nullc is available if (moduleBaseOpt == null) { return; } var processData = DebugHelpers.GetOrCreateDataItem <NullcRemoteProcessDataItem>(process); if (processData.language == null) { processData.compilerId = new DkmCompilerId(DebugHelpers.NullcCompilerGuid, DebugHelpers.NullcLanguageGuid); processData.language = DkmLanguage.Create("nullc", processData.compilerId); } // Create VM runtime and module if (processData.vmRuntimeInstance == null) { DkmRuntimeInstanceId runtimeId = new DkmRuntimeInstanceId(DebugHelpers.NullcVmRuntimeGuid, 0); processData.vmRuntimeInstance = DkmCustomRuntimeInstance.Create(process, runtimeId, null); } if (processData.vmModule == null) { DkmModuleId moduleId = new DkmModuleId(Guid.NewGuid(), DebugHelpers.NullcSymbolProviderGuid); processData.vmModule = DkmModule.Create(moduleId, "nullc.vm.code", processData.compilerId, process.Connection, null); } if (processData.vmModuleInstance == null) { DkmDynamicSymbolFileId symbolFileId = DkmDynamicSymbolFileId.Create(DebugHelpers.NullcSymbolProviderGuid); processData.vmModuleInstance = DkmCustomModuleInstance.Create("nullc_vm", "nullc.vm.code", 0, processData.vmRuntimeInstance, null, symbolFileId, DkmModuleFlags.None, DkmModuleMemoryLayout.Unknown, 0, 1, 0, "nullc vm code", false, null, null, null); processData.vmModuleInstance.SetModule(processData.vmModule, true); // Can use reload? } ulong moduleBase = moduleBaseOpt.GetValueOrDefault(0); uint moduleSize = (uint)(DebugHelpers.ReadPointerVariable(process, "nullcModuleEndAddress").GetValueOrDefault(0) - moduleBase); // Create JiT runtime and module if (moduleBase != 0 && moduleSize != 0) { if (processData.runtimeInstance == null && processData.nativeRuntimeInstance == null) { DkmRuntimeInstanceId runtimeId = new DkmRuntimeInstanceId(DebugHelpers.NullcRuntimeGuid, 0); if (DebugHelpers.useNativeInterfaces) { processData.nativeRuntimeInstance = DebugHelpers.useDefaultRuntimeInstance ? process.GetNativeRuntimeInstance() : DkmNativeRuntimeInstance.Create(process, runtimeId, DkmRuntimeCapabilities.None, process.GetNativeRuntimeInstance(), null); } else { processData.runtimeInstance = DkmCustomRuntimeInstance.Create(process, runtimeId, null); } } if (processData.module == null) { DkmModuleId moduleId = new DkmModuleId(Guid.NewGuid(), DebugHelpers.NullcSymbolProviderGuid); processData.module = DkmModule.Create(moduleId, "nullc.embedded.code", processData.compilerId, process.Connection, null); } if (processData.moduleInstance == null && processData.nativeModuleInstance == null) { DkmDynamicSymbolFileId symbolFileId = DkmDynamicSymbolFileId.Create(DebugHelpers.NullcSymbolProviderGuid); if (DebugHelpers.useNativeInterfaces) { processData.nativeModuleInstance = DkmNativeModuleInstance.Create("nullc", "nullc.embedded.code", 0, null, symbolFileId, DkmModuleFlags.None, DkmModuleMemoryLayout.Unknown, 1, "nullc embedded code", processData.nativeRuntimeInstance, moduleBase, moduleSize, Microsoft.VisualStudio.Debugger.Clr.DkmClrHeaderStatus.NativeBinary, false, null, null, null); processData.nativeModuleInstance.SetModule(processData.module, true); // Can use reload? } else { processData.moduleInstance = DkmCustomModuleInstance.Create("nullc", "nullc.embedded.code", 0, processData.runtimeInstance, null, symbolFileId, DkmModuleFlags.None, DkmModuleMemoryLayout.Unknown, moduleBase, 1, moduleSize, "nullc embedded code", false, null, null, null); processData.moduleInstance.SetModule(processData.module, true); // Can use reload? } } } // Update bytecode var moduleBytecodeVersion = DebugHelpers.ReadPointerVariable(process, "nullcModuleBytecodeVersion").GetValueOrDefault(0); if (processData.moduleBytecodeLocation != 0 && moduleBytecodeVersion != processData.moduleBytecodeVersion) { processData.moduleBytecodeLocation = 0; processData.moduleBytecodeSize = 0; processData.moduleBytecodeRaw = null; processData.bytecode = null; } if (processData.moduleBytecodeLocation == 0) { processData.moduleBytecodeLocation = DebugHelpers.ReadPointerVariable(process, "nullcModuleBytecodeLocation").GetValueOrDefault(0); processData.moduleBytecodeSize = DebugHelpers.ReadPointerVariable(process, "nullcModuleBytecodeSize").GetValueOrDefault(0); processData.moduleBytecodeVersion = moduleBytecodeVersion; if (processData.moduleBytecodeLocation != 0) { processData.moduleBytecodeRaw = new byte[processData.moduleBytecodeSize]; process.ReadMemory(processData.moduleBytecodeLocation, DkmReadMemoryFlags.None, processData.moduleBytecodeRaw); processData.bytecode = new NullcBytecode(); processData.bytecode.ReadFrom(processData.moduleBytecodeRaw, DebugHelpers.Is64Bit(process)); // Notify local component about bytecode update var message = DkmCustomMessage.Create(process.Connection, process, DebugHelpers.NullcReloadSymbolsMessageGuid, 1, null, null); message.SendHigher(); } } } catch (Exception ex) { Console.WriteLine("OnProcessPause failed with: " + ex.ToString()); } }