crashanalysis/crashanalyser/com.nokia.s60tools.crashanalyser/src/com/nokia/s60tools/crashanalyser/containers/Stack.java
changeset 4 615035072f7e
parent 0 5ad7ad99af01
child 16 72f198be1c1d
equal deleted inserted replaced
3:431bbaccaec8 4:615035072f7e
    33 public final class Stack {
    33 public final class Stack {
    34 	
    34 	
    35 	// XML tags
    35 	// XML tags
    36 	public static final String TAG_ID = "id";
    36 	public static final String TAG_ID = "id";
    37 	public static final String TAG_RANGE = "range";
    37 	public static final String TAG_RANGE = "range";
       
    38 	public static final String TAG_HASH = "hash";
    38 	public static final String TAG_LINK = "link";
    39 	public static final String TAG_LINK = "link";
    39 	public static final String TAG_STACK_ENTRY = "stack_entry";
    40 	public static final String TAG_STACK_ENTRY = "stack_entry";
    40 	public static final String ATTRIBUTE_SEG = "seg";
    41 	public static final String ATTRIBUTE_SEG = "seg";
    41 	public static final String SEGMENT_REGISTERS = "seg_registers";
    42 	public static final String SEGMENT_REGISTERS = "seg_registers";
    42 	
    43 	
    44 
    45 
    45 	// Data
    46 	// Data
    46 	private final int stackId;
    47 	private final int stackId;
    47 	private final String stackType;
    48 	private final String stackType;
    48 	private final String stackRange;
    49 	private final String stackRange;
       
    50 	private final String stackHash;
    49 	private final String stackLinkRegister;
    51 	private final String stackLinkRegister;
    50 	private final String stackStackPointer;
    52 	private final String stackStackPointer;
    51 	private final String stackProgramCounter;
    53 	private final String stackProgramCounter;
    52 	private final boolean stackContainsAccurateStackEntries;
    54 	private final boolean stackContainsAccurateStackEntries;
    53 	private final boolean stackRegisterContainsCpsr;
    55 	private final boolean stackRegisterContainsCpsr;
    64 	 * @param containsAccurateStackEntries defines if this stack was constructed with accurate (true)
    66 	 * @param containsAccurateStackEntries defines if this stack was constructed with accurate (true)
    65 	 * or heuristic (false) method
    67 	 * or heuristic (false) method
    66 	 * @param data stack entries
    68 	 * @param data stack entries
    67 	 * @param cpsrStack defines whether this stack contains cpsr register
    69 	 * @param cpsrStack defines whether this stack contains cpsr register
    68 	 */
    70 	 */
    69 	private Stack(int id, String type, String range, String linkRegister, String stackPointer, 
    71 	private Stack(int id, String type, String range, String hash, String linkRegister, String stackPointer, 
    70 					String programCounter, boolean containsAccurateStackEntries, List<StackEntry> data,
    72 					String programCounter, boolean containsAccurateStackEntries, List<StackEntry> data,
    71 					boolean cpsrStack) {
    73 					boolean cpsrStack) {
    72 		stackId = id;
    74 		stackId = id;
    73 		stackType = type;
    75 		stackType = type;
    74 		stackRange = range;
    76 		stackRange = range;
       
    77 		stackHash = hash;
    75 		stackLinkRegister = linkRegister;
    78 		stackLinkRegister = linkRegister;
    76 		stackStackPointer = stackPointer;
    79 		stackStackPointer = stackPointer;
    77 		stackProgramCounter = programCounter;
    80 		stackProgramCounter = programCounter;
    78 		stackContainsAccurateStackEntries = containsAccurateStackEntries;
    81 		stackContainsAccurateStackEntries = containsAccurateStackEntries;
    79 		stackData = data;
    82 		stackData = data;
   108 		return stackStackPointer;
   111 		return stackStackPointer;
   109 	}
   112 	}
   110 	
   113 	
   111 	public String getLinkRegister() {
   114 	public String getLinkRegister() {
   112 		return stackLinkRegister;
   115 		return stackLinkRegister;
       
   116 	}
       
   117 	
       
   118 	public String getHash() {
       
   119 		return stackHash;
   113 	}
   120 	}
   114 	
   121 	
   115 	/**
   122 	/**
   116 	 * Writes stack data into given buffer (i.e. text file)
   123 	 * Writes stack data into given buffer (i.e. text file)
   117 	 * @param out buffer to write to
   124 	 * @param out buffer to write to
   123 		writeLine(out,"");
   130 		writeLine(out,"");
   124 		writeLine(out, "STACK:");
   131 		writeLine(out, "STACK:");
   125 		writeLine(out, "--------");
   132 		writeLine(out, "--------");
   126 		writeLine(out, "Stack Type", stackType);
   133 		writeLine(out, "Stack Type", stackType);
   127 		writeLine(out, "Stack Range", stackRange);
   134 		writeLine(out, "Stack Range", stackRange);
       
   135 		writeLine(out, "Stack Hash", stackHash);
   128 		
   136 		
   129 		if (stackData != null && !stackData.isEmpty()) {
   137 		if (stackData != null && !stackData.isEmpty()) {
   130 			writeLine(out, "");
   138 			writeLine(out, "");
   131 			writeLine(out, "**********************************************");
   139 			writeLine(out, "**********************************************");
   132 			for (int i = 0; i < stackData.size(); i++) {
   140 			for (int i = 0; i < stackData.size(); i++) {
   205 			// read range if exists (e.g. 00402000-00407000)
   213 			// read range if exists (e.g. 00402000-00407000)
   206 			String range = XmlUtils.getTextValue(elementThreadStack, TAG_RANGE);
   214 			String range = XmlUtils.getTextValue(elementThreadStack, TAG_RANGE);
   207 			if (range == null)
   215 			if (range == null)
   208 				range = "";
   216 				range = "";
   209 			
   217 			
       
   218 			// read defect hash if exists
       
   219 			String hash = XmlUtils.getTextValue(elementThreadStack, TAG_HASH);
       
   220 			if (hash == null)
       
   221 				hash = "";
       
   222 
   210 			// read stack entries
   223 			// read stack entries
   211 			List<StackEntry> entries = null;
   224 			List<StackEntry> entries = null;
   212 			NodeList stackEntries = elementThreadStack.getElementsByTagName(TAG_STACK_ENTRY);
   225 			NodeList stackEntries = elementThreadStack.getElementsByTagName(TAG_STACK_ENTRY);
   213 			if (stackEntries != null && stackEntries.getLength() > 0) {
   226 			if (stackEntries != null && stackEntries.getLength() > 0) {
   214 				for (int i = 0; i < stackEntries.getLength(); i++) {
   227 				for (int i = 0; i < stackEntries.getLength(); i++) {
   231 						break;
   244 						break;
   232 					}
   245 					}
   233 				}
   246 				}
   234 			}
   247 			}
   235 			
   248 			
   236 			return new Stack(id, type, range, linkRegister, stackPointer, programCounter,
   249 			return new Stack(id, type, range, hash, linkRegister, stackPointer, programCounter,
   237 								containsAccurateStackEntries, entries, cpsrStack);
   250 								containsAccurateStackEntries, entries, cpsrStack);
   238 		} catch (Exception e) {
   251 		} catch (Exception e) {
   239 			return null;
   252 			return null;
   240 		}
   253 		}
   241 	}
   254 	}