private void contextMenu_Opening(object sender, CancelEventArgs e) { setIPToolStripMenuItem.Visible = false; if (NuGenDebugEventHandler.Instance.EventObjects.Frame != null && NuGenDebugEventHandler.Instance.EventObjects.Frame.IsActiveFrame && CurrentLine != null) { NuGenMethodDefinition displayedMethod = CodeObject as NuGenMethodDefinition; if (displayedMethod != null) { FunctionWrapper currentFunction = NuGenDebugEventHandler.Instance.EventObjects.Frame.GetFunction(); uint currentFunctionToken = currentFunction.GetToken(); if (displayedMethod.Token == currentFunctionToken) { ModuleWrapper currentModule = currentFunction.GetModule(); bool isInMemoryCurrentModule = currentModule.IsInMemory(); string currentModuleName = string.Empty; if (isInMemoryCurrentModule) { currentModuleName = currentModule.GetNameFromMetaData(); } else { currentModuleName = currentModule.GetName(); try { currentModuleName = Path.GetFileNameWithoutExtension(currentModuleName); } catch { } } currentModuleName = currentModuleName.ToLower(); if ((isInMemoryCurrentModule && displayedMethod.BaseTypeDefinition.ModuleScope.Name.ToLower() == currentModuleName) || (!isInMemoryCurrentModule && Path.GetFileNameWithoutExtension(displayedMethod.BaseTypeDefinition.ModuleScope.Assembly.FullPath).ToLower() == currentModuleName)) { NuGenBaseILCode currentILCode = ilEditor.GetILCodeAtMouseCursor(); setIPToolStripMenuItem.Visible = true; if (currentILCode != null) { int hResult = NuGenDebugEventHandler.Instance.EventObjects.Frame.CanSetIP(Convert.ToUInt32(currentILCode.Offset)); if (hResult == 0) { setIPToolStripMenuItem.Enabled = true; setIPToolStripMenuItem.Tag = currentILCode; } else { COMException comException = Marshal.GetExceptionForHR(hResult) as COMException; if (comException != null) { NuGenUIHandler.Instance.DisplayUserWarning(Marshal.GetExceptionForHR(hResult).Message); } setIPToolStripMenuItem.Enabled = false; } } else { setIPToolStripMenuItem.Enabled = false; } } } } } }
public void DisplayCallStack(List <FrameWrapper> callStack) { if (callStack != null) { callStackView.BeginUpdate(); callStackView.Items.Clear(); for (int index = 0; index < callStack.Count; index++) { FrameWrapper frame = callStack[index]; ListViewItem item = new ListViewItem(); bool isCodeAvailable = false; FunctionWrapper function = null; try { function = frame.GetFunction(); isCodeAvailable = true; } catch (COMException comException) { //0x80131309 == CORDBG_E_CODE_NOT_AVAILABLE if ((uint)comException.ErrorCode == 0x80131309) { isCodeAvailable = false; } else { throw; } } if (isCodeAvailable) { ModuleWrapper module = function.GetModule(); uint functionToken = function.GetToken(); NuGenTokenBase tokenObject = NuGenHelperFunctions.FindObjectByToken(functionToken, module); NuGenMethodDefinition methodDefinition = tokenObject as NuGenMethodDefinition; if (methodDefinition != null) { bool activeFrame = (index == 0); NuGenFrameInformation frameInformation = new NuGenFrameInformation(NuGenDebugEventHandler.Instance.EventObjects.Thread, methodDefinition, activeFrame, frame); item.Tag = frameInformation; item.Text = string.Format("{0}::{1}", methodDefinition.BaseTypeDefinition.FullName, methodDefinition.DisplayName); if (!frameInformation.IsExactLocation) { item.Text += " - not exact offset"; } } else { string moduleName = module.GetName(); if (module.IsInMemory()) { item.Tag = new NuGenMissingModule(module); } else { item.Tag = new NuGenMissingModule(moduleName); } item.Text = "Unknown method (perhaps a reference is not loaded). Module name: " + moduleName; } } if (!frame.IsILFrame()) { if (isCodeAvailable) { item.Text = "Native frame, IP offset is not available (" + item.Text + ")"; } else { item.Text = "Native frame, IP offset is not available (code is unavailable)."; } } item.ToolTipText = item.Text; callStackView.Items.Add(item); } callStackView.EndUpdate(); } }