Esempio n. 1
0
        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 + ")");
            }
        }
Esempio n. 2
0
        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;
                }
            }
        }
Esempio n. 3
0
        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;
             * }
             */
        }
Esempio n. 4
0
            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);
            }
Esempio n. 5
0
        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;
                }
            }
        }
Esempio n. 6
0
        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);
                }
            }
        }
Esempio n. 7
0
 public sample_point(libr l, int cnt)
 {
     this.l = l; percent = l.hits * 100.0 / cnt; hits = l.hits;
 }
Esempio n. 8
0
        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;
                    }
                }
            }
        }
Esempio n. 9
0
 public static int CompareLower(libr a, libr b)
 {
     // Return result of CompareTo with lengths of both strings.
     return(a.lower.CompareTo(b.lower));
 }
Esempio n. 10
0
 public void Add(libr subsym)
 {
     sym.Add(subsym);
 }