tools/map.cpp |   91 +++++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 71 insertions(+), 20 deletions(-)

New commits:
commit 886a8a7ab8d7a259a0a6af8e85f27f2ec413b1ad
Author: Michael Meeks <michael.me...@collabora.com>
Date:   Fri Dec 1 17:37:46 2017 +0000

    loolmap - improve page annotation, and page diffs, count dirty bytes.
    
    Change-Id: Iaaae8fca2bdd11961682d6f8dafa38e4ca51c44c

diff --git a/tools/map.cpp b/tools/map.cpp
index 1e1b4de6..5ef1b00a 100644
--- a/tools/map.cpp
+++ b/tools/map.cpp
@@ -30,6 +30,7 @@
 typedef unsigned long long addr_t;
 
 bool DumpHex = false;
+bool DumpAll = false;
 
 #define MAP_SIZE 20
 #define PATH_SIZE 1000 // No harm in having it much larger than strictly 
necessary. Avoids compiler warning.
@@ -105,12 +106,6 @@ static std::vector<std::string> lineBreak(std::string str)
 
 static void dumpDiff(const std::string &pageStr, const std::string &parentStr)
 {
-    if (pageStr == parentStr)
-    {
-        printf ("unusual: page identical to parent\n");
-        printf ("%s", pageStr.c_str());
-        return;
-    }
     std::vector<std::string> page = lineBreak(pageStr);
     std::vector<std::string> parent = lineBreak(parentStr);
     assert(page.size() == parent.size());
@@ -125,14 +120,23 @@ static void dumpDiff(const std::string &pageStr, const 
std::string &parentStr)
             {
                 if (page[i][j] == parent[i][j])
                     printf(" ");
-                else
+                else {
                     printf("%c", parent[i][j]);
+                }
             }
             printf("\n");
         }
     }
 }
 
+static bool pageIsZero(const std::vector<char> &page)
+{
+    for (char c : page)
+        if (c != 0)
+            return false;
+    return true;
+}
+
 static void dumpPages(unsigned proc_id, unsigned parent_id, const char *type, 
const std::vector<addr_t> &pages)
 {
     char path_proc[PATH_SIZE];
@@ -146,7 +150,11 @@ static void dumpPages(unsigned proc_id, unsigned 
parent_id, const char *type, co
     if (parent_fd < 0)
         error(EXIT_FAILURE, errno, "Failed to open %s", path_proc);
 
+    if (DumpHex)
+        printf ("\nUn-shared data dump\n");
+
     size_t cnt = 0;
+    long long int bytesTouched = 0;
     for (auto page : pages)
     {
         std::vector<char> pageData, parentData;
@@ -169,18 +177,59 @@ static void dumpPages(unsigned proc_id, unsigned 
parent_id, const char *type, co
         std::stringstream parentStr;
         Util::dumpHex(parentStr, "", "", parentData, false);
 
-        printf ("%s page: 0x%.8llx (%d/%d) %s\n",
-                type, page, (int)++cnt, (int)pages.size(),
-                parentData.size() == 0 ? "- unique" : "- was shared");
-
-        if (parentData.size() == 0)
-            printf("%s", pageStr.str().c_str());
+        bool matchesParent = pageStr == parentStr;
+        const char *style;
+        if (parentData.size() > 0)
+        {
+            if (pageIsZero(parentData))
+            {
+                style = "was shared with zeros";
+                parentData.resize(0);
+            }
+            if (matchesParent)
+            {
+                if (DumpAll)
+                    style = "dump unchanged";
+                else
+                    style = "un-shared but matches parent";
+                parentData.resize(0);
+            }
+            else
+                style = "was shared";
+        }
         else
-            dumpDiff(pageStr.str(), parentStr.str());
+            style = "unique";
+
+        int touched = 0;
+        if (parentData.size() > 0)
+        {
+            for (size_t i = 0; i < pageData.size(); ++i)
+            {
+                if (pageData[i] != parentData[i])
+                    touched++;
+            }
+        }
+
+        if (DumpHex)
+        {
+            printf ("%s page: 0x%.8llx (%d/%d) - touched: %d - %s\n",
+                    type, page, (int)++cnt, (int)pages.size(), touched,
+                    style);
+
+            if (parentData.size() == 0)
+                printf("%s", pageStr.str().c_str());
+            else
+                dumpDiff(pageStr.str(), parentStr.str());
+        }
+
+        bytesTouched += touched;
     }
 
     close (mem_fd);
     close (parent_fd);
+
+    printf ("\tdirtied bytes touched %5lld per page %.2f\n\n",
+            bytesTouched, (double)bytesTouched / pages.size());
 }
 
 static std::vector<char> compressBitmap(const std::vector<char> &bitmap)
@@ -244,6 +293,8 @@ static void dump_unshared(unsigned proc_id, unsigned 
parent_id,
             {
                 numShared++;
                 bitmap.push_back('.');
+                if (DumpAll)
+                    vunshared.push_back(p);
             }
         }
     }
@@ -254,13 +305,9 @@ static void dump_unshared(unsigned proc_id, unsigned 
parent_id,
     printf ("\tunshared %5lld (%lldkB)\n", numOwn, numOwn * 4);
 
     std::vector<char> compressed = compressBitmap(bitmap);
-    printf ("RLE sharing bitmap:\n%s\n\n", &compressed[0]);
+    printf ("\tRLE sharing bitmap:\n%s\n", &compressed[0]);
 
-    if (DumpHex)
-    {
-        printf ("Un-shared data dump\n");
-        dumpPages(proc_id, parent_id, type, vunshared);
-    }
+    dumpPages(proc_id, parent_id, type, vunshared);
 }
 
 static void total_smaps(unsigned proc_id, unsigned parent_id,
@@ -403,6 +450,8 @@ int main(int argc, char **argv)
             help = true;
         else if (strstr(arg, "--hex"))
             DumpHex = true;
+        else if (strstr(arg, "--all"))
+            DumpAll = true;
         else
             appOrPid = arg;
     }
@@ -413,6 +462,8 @@ int main(int argc, char **argv)
     {
         fprintf(stderr, "Usage: loolmap --hex <name of process|pid>\n");
         fprintf(stderr, "Dump memory map information for a given process\n");
+        fprintf(stderr, "    --hex    Hex dump relevant page contents and diff 
to parent process\n");
+        fprintf(stderr, "    --all    Hex dump all writable pages whether 
touched or not\n");
         return 0;
     }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to