// Extended low level break information public static void appendBreakInfo(DebugCLI cli, System.Text.StringBuilder sb, bool includeFault) { Session session = cli.Session; FileInfoCache fileInfo = cli.FileCache; int reason = session.suspendReason(); int offset = ((PlayerSession)session).SuspendOffset; int index = ((PlayerSession)session).SuspendActionIndex; SwfInfo info = null; try { info = fileInfo.Swfs[index]; } catch (IndexOutOfRangeException) { } if (info != null) { System.Collections.IDictionary args = new System.Collections.Hashtable(); args["swfName"] = FileInfoCache.nameOfSwf(info); //$NON-NLS-1$ sb.Append(LocalizationManager.getLocalizedTextString("key35", args)); //$NON-NLS-1$ sb.Append(' '); } System.Collections.IDictionary args2 = new System.Collections.Hashtable(); System.Text.StringBuilder sb2 = new System.Text.StringBuilder(); args2["address"] = "0x" + FieldFormat.formatLongToHex(sb2, offset, 8) + " (" + offset + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ sb.Append(LocalizationManager.getLocalizedTextString("atAddress", args2)); //$NON-NLS-1$ if (includeFault) { args2 = new System.Collections.Hashtable(); System.Text.StringBuilder reasonBuffer = new System.Text.StringBuilder(); cli.appendReason(reasonBuffer, reason); args2["fault"] = reasonBuffer.ToString(); //$NON-NLS-1$ sb.Append(' '); sb.Append(LocalizationManager.getLocalizedTextString("haltedDueToFault", args2)); //$NON-NLS-1$ } }
internal virtual void initSession(Session s) { s.SourceLocator = this; m_fileInfo = new FileInfoCache(); m_exprCache.clear(); m_fileInfo.bind(s); m_exprCache.bind(s); // bind catching a version problem bool correctVersion = true; try { s.bind(); } catch (VersionException) { correctVersion = false; } // reset session properties propertyPut(LIST_LINE, 1); propertyPut(LIST_MODULE, 1); // default to module #1 propertyPut(BPNUM, 0); // set current breakpoint number as something bad propertyPut(LAST_FRAME_DEPTH, 0); propertyPut(CURRENT_FRAME_DEPTH, 0); propertyPut(DISPLAY_FRAME_NUMBER, 0); propertyPut(METADATA_ATTEMPTS_PERIOD, 250); // 1/4s per attempt propertyPut(METADATA_NOT_AVAILABLE, 0); // counter for failures propertyPut(METADATA_ATTEMPTS, METADATA_RETRIES); propertyPut(PLAYER_FULL_SUPPORT, correctVersion?1:0); String previousURI = m_mruURI; m_mruURI = m_session.URI; // try to reapply the breakpoint's if (previousURI != null && m_mruURI != null && previousURI.ToUpper().Equals(m_mruURI.ToUpper())) reapplyBreakpoints(); else { while (m_breakpoints.Count > 0) m_breakpoints.RemoveAt(0); } m_requestResume = false; m_stepResume = false; }
/// <summary> If we still have a socket try to send an exit message /// Doesn't seem to work ?!? /// </summary> internal virtual void exitSession() { // clear out our watchpoint list and displays // keep breakpoints around so that we can try to reapply them if we reconnect m_displays.Clear(); m_watchpoints.Clear(); if (m_fileInfo != null) m_fileInfo.unbind(); if (m_session != null) m_session.terminate(); m_session = null; m_fileInfo = null; }
public static void doShowFuncs(DebugCLI cli) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); String arg = null; FileInfoCache fileInfo = cli.FileCache; // we take an optional single arg which specifies a module try { // let's wait a bit for the background load to complete cli.waitForMetaData(); if (cli.hasMoreTokens()) { arg = cli.nextToken(); int id = arg.Equals(".")?cli.propertyGet(DebugCLI.LIST_MODULE):cli.parseFileArg(-1, arg); //$NON-NLS-1$ DModule m = (DModule)fileInfo.getFile(id); m.lineMapping(sb); } else { SourceFile[] ar = fileInfo.FileList; if (ar == null) { cli.err(LocalizationManager.getLocalizedTextString("key18")); } //$NON-NLS-1$ else { for (int i = 0; ar != null && i < ar.Length; i++) { DModule m = (DModule)ar[i]; m.lineMapping(sb); } } } cli.output(sb.ToString()); } catch (NullReferenceException) { cli.err(LocalizationManager.getLocalizedTextString("key19")); //$NON-NLS-1$ } catch (FormatException pe) { cli.err(pe.Message); } catch (AmbiguousException ae) { cli.err(ae.Message); } catch (NoMatchException nme) { cli.err(nme.Message); } catch (InProgressException) { cli.err(LocalizationManager.getLocalizedTextString("key20")); //$NON-NLS-1$ } }
public static void doDisassemble(DebugCLI cli) { /* currentXXX may NOT be invalid! */ int currentModule = cli.propertyGet(DebugCLI.LIST_MODULE); int currentLine = cli.propertyGet(DebugCLI.LIST_LINE); String arg1 = null; int module1 = currentModule; int line1 = currentLine; String arg2 = null; int line2 = currentLine; bool functionNamed = false; int numLines = 0; try { FileInfoCache fileInfo = cli.FileCache; Session session = cli.Session; if (cli.hasMoreTokens()) { arg1 = cli.nextToken(); if (arg1.Equals("-")) //$NON-NLS-1$ { // move back one line line1 = line2 = line1 - 1; } else { int[] result = cli.parseLocationArg(currentModule, currentLine, arg1); module1 = result[0]; line2 = line1 = result[1]; functionNamed = (result[2] == 0)?false:true; if (cli.hasMoreTokens()) { arg2 = cli.nextToken(); line2 = cli.parseLineArg(module1, arg2); } } } else { // since no parms test for valid location if none use players concept of where we stopped if (fileInfo.getFile(currentModule) == null) { //here we simply use the players concept of suspsend DSuspendInfo info = ((PlayerSession)session).SuspendInfo; int at = info.Offset; int which = info.ActionIndex; int until = info.NextOffset; if (info.Reason == SuspendReason.Unknown) { throw new SuspendedException(); } SwfInfo swf = fileInfo.Swfs[which]; outputAssembly(cli, (DSwfInfo)swf, at, until); throw new AmbiguousException(LocalizationManager.getLocalizedTextString("key27")); //$NON-NLS-1$ } } /* * Check for a few error conditions, otherwise we'll write a listing! */ if (cli.hasMoreTokens()) { cli.err(LocalizationManager.getLocalizedTextString("key28")); //$NON-NLS-1$ } else { SourceFile file = fileInfo.getFile(module1); numLines = file.LineCount; // pressing return is ok, otherwise throw the exception if (line1 > numLines && arg1 != null) { throw new IndexOutOfRangeException(); } /* if no arg2 then user list a single line */ if (arg2 == null) { line2 = line1; } /* adjust our range of lines to ensure we conform */ if (line1 < 1) { /* shrink line 1, grow line2 */ line2 += -(line1 - 1); line1 = 1; } if (line2 > numLines) { line2 = numLines; } // System.out.println("1="+module1+":"+line1+",2="+module2+":"+line2+",num="+numLines+",half="+half); /* nothing to display */ if (line1 > line2) { throw new IndexOutOfRangeException(); } /* now dump the mixed source / assembly */ // now lets find which swf this in DSwfInfo swf = (DSwfInfo)fileInfo.swfForFile(file); ActionLocation lStart = null; ActionLocation lEnd = null; if (swf == null) { System.Collections.IDictionary args = new System.Collections.Hashtable(); args["arg3"] = file.Name; //$NON-NLS-1$ cli.err(LocalizationManager.getLocalizedTextString("key29", args)); //$NON-NLS-1$ } else if (functionNamed) { // if we name a function just dump the whole thing without source. int offset = file.getOffsetForLine(line1); lStart = swf.locate(offset); if (lStart.function == null) { cli.err(LocalizationManager.getLocalizedTextString("key30")); } //$NON-NLS-1$ else { // create a psudeo action list from which to disasemble the function ActionList al = new ActionList(true); al.setActionOffset(0, lStart.function); lStart.actions = al; lStart.at = 0; lEnd = new ActionLocation(); lEnd.actions = al; lEnd.at = 0; outputAssembly(cli, swf, lStart, lEnd); } } else { ActionLocation lastEnd = null; for (int i = line1; i <= line2; i++) { int offset = file.getOffsetForLine(i); // locate the action list associated with this of the swf if (offset != 0) { // get the starting point and try to locate a nice ending lStart = swf.locate(offset); lEnd = swf.locateSourceLineEnd(lStart); // now see if we skipped some assembly between source lines if (lastEnd != null) { lastEnd.at++; // point our pseudo start to the next action // new actions list so attempt to find the end of source in the old actions list if (lastEnd.actions != lStart.actions && lastEnd.actions.size() != lastEnd.at) { String atString = lastEnd.actions.getOffset(lastEnd.at).ToString("X"); System.Collections.IDictionary args = new System.Collections.Hashtable(); args["arg4"] = atString; //$NON-NLS-1$ cli.output(LocalizationManager.getLocalizedTextString("key31", args)); //$NON-NLS-1$ // we are missing some of the dissassembly, so back up a bit and dump it out ActionLocation gapEnd = swf.locateSourceLineEnd(lastEnd); outputAssembly(cli, swf, lastEnd, gapEnd); } else if (lastEnd.at < lStart.at) { // same action list but we skipped some instructions ActionLocation gapEnd = new ActionLocation(lStart); gapEnd.at--; outputAssembly(cli, swf, lastEnd, gapEnd); } } lastEnd = lEnd; } // dump source cli.outputSource(module1, i, file.getLine(i)); // obtain the offset, locate it in the swf if (offset != 0) { outputAssembly(cli, swf, lStart, lEnd); } } /* save away valid context */ cli.propertyPut(DebugCLI.LIST_MODULE, module1); cli.propertyPut(DebugCLI.LIST_LINE, line2 + 1); // add one cli.m_repeatLine = "disassemble"; /* allow repeated listing by typing CR */ //$NON-NLS-1$ } } } catch (IndexOutOfRangeException) { String name = "#" + module1; //$NON-NLS-1$ System.Collections.IDictionary args = new System.Collections.Hashtable(); args["arg5"] = Convert.ToString(line1); //$NON-NLS-1$ args["arg6"] = name; //$NON-NLS-1$ args["arg7"] = Convert.ToString(numLines); //$NON-NLS-1$ cli.err(LocalizationManager.getLocalizedTextString("key32", args)); //$NON-NLS-1$ } catch (AmbiguousException ae) { cli.err(ae.Message); } catch (NullReferenceException) { cli.err(LocalizationManager.getLocalizedTextString("key33")); //$NON-NLS-1$ } catch (FormatException pe) { cli.err(pe.Message); } catch (NoMatchException nme) { cli.err(nme.Message); } catch (SuspendedException) { cli.err(LocalizationManager.getLocalizedTextString("key34")); //$NON-NLS-1$ } }