string symname(libr raw) { var s = namemaps.Find(x => x.Key == raw.name).Value; if (s != null && s != raw.name) { return(s + " (" + raw.name + ")"); } else { return(raw.name + "(" + raw.lower + ")"); } }
void reprof_load(string file) { space = new libr(); space.name = "[Unknown addresses]"; space.lower = 0x00000000; space.upper = 0xFFFFFFFF; string[] sections = File.ReadAllText(file).Split(new string[] { "==xx==xx==\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (string sect in sections) { string[] txt = sect.Split('\n'); string type = txt[0].Split(':')[0]; switch (type) { case "vaddr": parse_vaddr(txt); break; case ".map": if (checkBox2.Checked) { parsesym_map(txt); } break; case "libsym": if (checkBox3.Checked) { parsesym_lib(txt); } break; case "jitsym": if (checkBox1.Checked) { parsesym_jit(txt); } break; case "samples": parse_samples(txt); break; } } }
private void parsesym_jit(string[] txt) { string name = txt[0].Split(':')[1].Trim(); for (int i = 1; i < txt.Length; i++) { string l = txt[i]; string[] o = l.Split(new char[] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries); libr lbr = new libr(); if (o.Length == 3) { lbr.name = name + "_" + o[2]; lbr.lower = Convert.ToUInt32(o[0], 16); lbr.upper = lbr.lower + Convert.ToUInt32(o[1], 10); var aex = space.drill(lbr.lower).Key; if (aex != null) { var sm = space.sym.find(lbr.lower); if (sm != aex) { lbr.lower -= sm.lower - sm.offset; lbr.upper -= sm.lower - sm.offset; } lbr.lower -= aex.lower - aex.offset; lbr.upper -= aex.lower - aex.offset; aex.sym.Add(lbr); } } } //liby.sym.Sort(libr.CompareLower); /* * * for (int i = 1; i < (liby.sym.Count - 1); i++) * { * if (liby.sym[i].upper == liby.sym[i].lower) * liby.sym[i].upper = liby.sym[i + 1].lower; * } */ }
public libr find(string symname) { if (name == symname) { return(this); } libr rv = null; foreach (var p in sym) { if ((rv = p.find(symname)) != null) { break; } } return(rv); }
void parsesym_lib(string[] txt) { string name = txt[0].Split(':')[1].Trim(); var liby = space.sym.Find(p => p.name.EndsWith(name)); if (liby == null) { return; } for (int i = 1; i < txt.Length; i++) { string l = txt[i]; string[] o = l.Split(new char[] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries); libr lbr = new libr(); if (o.Length == 3) { lbr.name = o[2]; lbr.lower = Convert.ToUInt32(o[0], 16); lbr.upper = lbr.lower + Convert.ToUInt32(o[1], 10); var aex = liby.sym.find(lbr.lower); if (aex == null) { liby.sym.Add(lbr); } } } liby.sym.Sort(libr.CompareLower); for (int i = 1; i < (liby.sym.Count - 1); i++) { if (liby.sym[i].upper == liby.sym[i].lower) { liby.sym[i].upper = liby.sym[i + 1].lower; } } }
void parse_vaddr(string[] txt) { for (int i = 1; i < txt.Length; i++) { string l = txt[i]; string[] o = l.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); libr lbr = new libr(); if (o.Length >= 6) { var range = o[0].Split('-'); lbr.name = o[5]; /* * if (lbr.name.EndsWith(".so")) * lbr.name = "lib://" + lbr.name.Split('/').Last(); */ lbr.lower = Convert.ToUInt32(range[0], 16); lbr.upper = Convert.ToUInt32(range[1], 16); if (o[2].Length < 10) { lbr.offset = Convert.ToUInt32(o[2], 16); } var lalias = space.find(lbr.name); if (lalias != null) { lbr.sym = lalias.sym; } space.Add(lbr); } } }
public sample_point(libr l, int cnt) { this.l = l; percent = l.hits * 100.0 / cnt; hits = l.hits; }
public void parsesym_map(string[] txt) { var sym = space.sym.Find(p => p.name.EndsWith("libnullDC_Core.so")).sym; //override any other defined symbols (eg, dynlib) sym.Clear(); int i = 1; for (; i < txt.Length; i++) { var l = txt[i]; if (l.StartsWith(".text")) { break; } } List <string> uln = new List <string>(); for (i++; i < txt.Length; i++) { var l = txt[i]; if (l.StartsWith(" .text") || l.StartsWith(" ")) { uln.Add(l); } else if (l.StartsWith(" *")) { continue; } else { break; } } libr csym = null; List <libr> sort_addr = new List <libr>(); for (i = 0; i < uln.Count; i++) { var l = uln[i]; if (l == "==xx==xx==") { break; } else { var o = l.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (l.StartsWith(" .text.")) { csym = new libr(); csym.name = o[0].Substring(6); if ((/*csym.name[0] != '_' &&*/ o.Length >= 4) || (o.Length == 4 && l.EndsWith(".o")) ) { csym.lower = Convert.ToUInt32(o[1], 16); csym.upper = csym.lower + Convert.ToUInt32(o[2], 16); } if (sym.find(csym.lower) == null) { sym.Add(csym); } } else if (l.StartsWith(" .text ") && Convert.ToUInt32(o[2], 16) > 0) { csym = new libr(); csym.name = "<unnamed>"; csym.lower = Convert.ToUInt32(o[1], 16); csym.upper = csym.lower + Convert.ToUInt32(o[2], 16); if (sym.find(csym.lower) != null) { sym.Add(csym); } } else if (l.StartsWith(" ")) { if (csym != null) { if (csym.lower == 0) { csym.lower = Convert.ToUInt32(o[0], 16); csym.upper = csym.lower + Convert.ToUInt32(o[1], 16); } else { var s = l.Trim().Split(new char[] { ' ' }, 2)[1].Trim(); var a = Convert.ToUInt32(l.Trim().Split(new char[] { ' ' }, 2)[0].Trim(), 16); if (csym.name == "<unnamed>") { if (csym.lower == a) { csym.name = s; } else { csym.name = "<unnamed> around " + s; } } /* * if (csym.lower == a && csym.sym.Count == 0) * namemaps.Add(new KeyValuePair<string, string>(csym.name, s)); * else*/ { var xsym = new libr(); xsym.name = s; xsym.lower = a; xsym.upper = csym.upper; csym.Add(xsym); if (!sort_addr.Contains(csym)) { sort_addr.Add(csym); } } } } } } } foreach (var s in sort_addr) { if (s.sym.Count == 1 && s.lower == s.sym[0].lower) { namemaps.Add(new KeyValuePair <string, string>(s.name, s.sym[0].name)); s.sym.Clear(); } else { var al = s.sym.OrderBy(p => p.lower).ToList(); al[0].lower = al[0].lower - s.lower; //al[0].upper = s.upper; for (int k = 1; k < al.Count(); k++) { al[k - 1].upper = al[k].lower - s.lower; al[k].lower = al[k - 1].upper; al[k].upper = s.upper - s.lower; } } } }
public static int CompareLower(libr a, libr b) { // Return result of CompareTo with lengths of both strings. return(a.lower.CompareTo(b.lower)); }
public void Add(libr subsym) { sym.Add(subsym); }