auto import from //depot/cupcake/@135843
diff --git a/emulator/qtools/read_pid.cpp b/emulator/qtools/read_pid.cpp
new file mode 100644
index 0000000..a2d69d4
--- /dev/null
+++ b/emulator/qtools/read_pid.cpp
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include "trace_reader.h"
+
+int main(int argc, char **argv) {
+  if (argc != 2) {
+    fprintf(stderr, "Usage: %s trace_file\n", argv[0]);
+    exit(1);
+  }
+
+  char *trace_filename = argv[1];
+  TraceReaderBase *trace = new TraceReaderBase;
+  trace->Open(trace_filename);
+
+  while (1) {
+    PidEvent event;
+    if (trace->ReadPidEvent(&event))
+      break;
+    switch (event.rec_type) {
+      case kPidFork:
+        printf("t%lld fork tgid %d pid %d\n", event.time, event.tgid, event.pid);
+        break;
+      case kPidClone:
+        printf("t%lld clone tgid %d pid %d\n", event.time, event.tgid, event.pid);
+        break;
+      case kPidSwitch:
+        printf("t%lld switch %d\n", event.time, event.pid);
+        break;
+      case kPidExit:
+        printf("t%lld exit %d\n", event.time, event.pid);
+        break;
+      case kPidMmap:
+        printf("t%lld mmap %08x - %08x, offset %08x '%s'\n",
+               event.time, event.vstart, event.vend, event.offset, event.path);
+        delete[] event.path;
+        break;
+      case kPidMunmap:
+        printf("t%lld munmap %08x - %08x\n",
+               event.time, event.vstart, event.vend);
+        break;
+      case kPidSymbolAdd:
+        printf("t%lld add sym %08x '%s'\n",
+               event.time, event.vstart, event.path);
+        delete[] event.path;
+        break;
+      case kPidSymbolRemove:
+        printf("t%lld remove %08x\n", event.time, event.vstart);
+        break;
+      case kPidExec:
+        printf("t%lld argc: %d\n", event.time, event.argc);
+        for (int ii = 0; ii < event.argc; ++ii) {
+          printf("  argv[%d]: %s\n", ii, event.argv[ii]);
+          delete[] event.argv[ii];
+        }
+        delete[] event.argv;
+        break;
+      case kPidKthreadName:
+        printf("t%lld kthread tgid %d pid %d %s\n",
+               event.time, event.tgid, event.pid, event.path);
+        delete[] event.path;
+        break;
+      case kPidName:
+        printf("t%lld name %d %s\n",
+               event.time, event.pid, event.path);
+        delete[] event.path;
+        break;
+    }
+  }
+  return 0;
+}