Eric Pouech : winedbg: In 'info proc' command, list hierarchy of processus, and get rid of printing parent pid.

Alexandre Julliard julliard at winehq.org
Wed Jan 2 14:18:38 CST 2013


Module: wine
Branch: master
Commit: 00b6d8ebb129c1bd9090532cbc8beb531f46ec1c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=00b6d8ebb129c1bd9090532cbc8beb531f46ec1c

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Mon Dec 31 15:10:50 2012 +0100

winedbg: In 'info proc' command, list hierarchy of processus, and get rid of printing parent pid.

---

 programs/winedbg/info.c |   95 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 80 insertions(+), 15 deletions(-)

diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c
index bc59eed..fb60afe 100644
--- a/programs/winedbg/info.c
+++ b/programs/winedbg/info.c
@@ -449,30 +449,95 @@ void info_win32_window(HWND hWnd, BOOL detailed)
     dbg_printf("\n");
 }
 
+struct dump_proc_entry
+{
+    PROCESSENTRY32         proc;
+    unsigned               children; /* index in dump_proc.entries of first child */
+    unsigned               sibling;  /* index in dump_proc.entries of next sibling */
+};
+
+struct dump_proc
+{
+    struct dump_proc_entry*entries;
+    unsigned               count;
+    unsigned               alloc;
+};
+
+static unsigned get_parent(const struct dump_proc* dp, unsigned idx)
+{
+    unsigned i;
+
+    for (i = 0; i < dp->count; i++)
+    {
+        if (i != idx && dp->entries[i].proc.th32ProcessID == dp->entries[idx].proc.th32ParentProcessID)
+            return i;
+    }
+    return -1;
+}
+
+static void dump_proc_info(const struct dump_proc* dp, unsigned idx, unsigned depth)
+{
+    struct dump_proc_entry* dpe;
+    for ( ; idx != -1; idx = dp->entries[idx].sibling)
+    {
+        assert(idx < dp->count);
+        dpe = &dp->entries[idx];
+        dbg_printf("%c%08x %-8d ",
+                   (dpe->proc.th32ProcessID == (dbg_curr_process ?
+                                                dbg_curr_process->pid : 0)) ? '>' : ' ',
+                   dpe->proc.th32ProcessID, dpe->proc.cntThreads);
+        if (depth)
+        {
+            unsigned i;
+            for (i = 3 * (depth - 1); i > 0; i--) dbg_printf(" ");
+            dbg_printf("\\_ ");
+        }
+        dbg_printf("'%s'\n", dpe->proc.szExeFile);
+        dump_proc_info(dp, dpe->children, depth + 1);
+    }
+}
+
 void info_win32_processes(void)
 {
     HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     if (snap != INVALID_HANDLE_VALUE)
     {
-        PROCESSENTRY32  entry;
-        DWORD           current = dbg_curr_process ? dbg_curr_process->pid : 0;
-        BOOL            ok;
+        struct dump_proc  dp;
+        unsigned          i, first = -1;
+        BOOL              ok;
 
-        entry.dwSize = sizeof(entry);
-        ok = Process32First(snap, &entry);
+        dp.count   = 0;
+        dp.alloc   = 16;
+        dp.entries = HeapAlloc(GetProcessHeap(), 0, sizeof(*dp.entries) * dp.alloc);
+        if (!dp.entries) return;
+        dp.entries[dp.count].proc.dwSize = sizeof(dp.entries[dp.count].proc);
+        ok = Process32First(snap, &dp.entries[dp.count].proc);
 
-        dbg_printf(" %-8.8s %-8.8s %-8.8s %s (all id:s are in hex)\n",
-                   "pid", "threads", "parent", "executable");
+        /* fetch all process information into dp (skipping this debugger) */
         while (ok)
         {
-            if (entry.th32ProcessID != GetCurrentProcessId())
-                dbg_printf("%c%08x %-8d %08x '%s'\n",
-                           (entry.th32ProcessID == current) ? '>' : ' ',
-                           entry.th32ProcessID, entry.cntThreads,
-                           entry.th32ParentProcessID, entry.szExeFile);
-            ok = Process32Next(snap, &entry);
+            if (dp.entries[dp.count].proc.th32ProcessID != GetCurrentProcessId())
+                dp.entries[dp.count++].children = -1;
+            if (dp.count >= dp.alloc)
+            {
+                dp.entries = HeapReAlloc(GetProcessHeap(), 0, dp.entries, sizeof(*dp.entries) * (dp.alloc *= 2));
+                if (!dp.entries) return;
+            }
+            dp.entries[dp.count].proc.dwSize = sizeof(dp.entries[dp.count].proc);
+            ok = Process32Next(snap, &dp.entries[dp.count].proc);
         }
         CloseHandle(snap);
+        /* chain the siblings wrt. their parent */
+        for (i = 0; i < dp.count; i++)
+        {
+            unsigned parent = get_parent(&dp, i);
+            unsigned *chain = parent == -1 ? &first : &dp.entries[parent].children;
+            dp.entries[i].sibling = *chain;
+            *chain = i;
+        }
+        dbg_printf(" %-8.8s %-8.8s %s (all id:s are in hex)\n", "pid", "threads", "executable");
+        dump_proc_info(&dp, first, 0);
+        HeapFree(GetProcessHeap(), 0, dp.entries);
     }
 }
 




More information about the wine-cvs mailing list