diff --git a/cmds/dumpstate/utils.cpp b/cmds/dumpstate/utils.cpp
index 01a60da..8e6ccfc 100644
--- a/cmds/dumpstate/utils.cpp
+++ b/cmds/dumpstate/utils.cpp
@@ -97,9 +97,9 @@
             MYLOGD("Duration of '%s': %.3fs\n", title_.c_str(), (float)elapsed / NANOS_PER_SEC);
         } else {
             // Use "Yoda grammar" to make it easier to grep|sort sections.
-            printf("------ %.3fs was the duration of '%s' ------\n", (float)elapsed / NANOS_PER_SEC,
-                   title_.c_str());
-            fflush(stdout);
+            dprintf(STDOUT_FILENO, "------ %.3fs was the duration of '%s' ------\n",
+                    (float)elapsed / NANOS_PER_SEC, title_.c_str());
+            fsync(STDOUT_FILENO);
         }
     }
 }
@@ -227,16 +227,19 @@
 }
 
 void for_each_userid(void (*func)(int), const char *header) {
+    std::string title = header == nullptr ? "for_each_userid" : android::base::StringPrintf(
+                                                                    "for_each_userid(%s)", header);
+    DurationReporter duration_reporter(title);
     if (PropertiesHelper::IsDryRun()) return;
 
     DIR *d;
     struct dirent *de;
 
-    if (header) printf("\n------ %s ------\n", header);
+    if (header) dprintf(STDOUT_FILENO, "\n------ %s ------\n", header);
     func(0);
 
     if (!(d = opendir("/data/system/users"))) {
-        printf("Failed to open /data/system/users (%s)\n", strerror(errno));
+        dprintf(STDOUT_FILENO, "Failed to open /data/system/users (%s)\n", strerror(errno));
         return;
     }
 
@@ -256,11 +259,11 @@
     struct dirent *de;
 
     if (!(d = opendir("/proc"))) {
-        printf("Failed to open /proc (%s)\n", strerror(errno));
+        dprintf(STDOUT_FILENO, "Failed to open /proc (%s)\n", strerror(errno));
         return;
     }
 
-    if (header) printf("\n------ %s ------\n", header);
+    if (header) dprintf(STDOUT_FILENO, "\n------ %s ------\n", header);
     while ((de = readdir(d))) {
         int pid;
         int fd;
@@ -310,6 +313,9 @@
 }
 
 void for_each_pid(for_each_pid_func func, const char *header) {
+    std::string title = header == nullptr ? "for_each_pid"
+                                          : android::base::StringPrintf("for_each_pid(%s)", header);
+    DurationReporter duration_reporter(title);
     if (PropertiesHelper::IsDryRun()) return;
 
     __for_each_pid(for_each_pid_helper, header, (void *) func);
@@ -324,7 +330,7 @@
     snprintf(taskpath, sizeof(taskpath), "/proc/%d/task", pid);
 
     if (!(d = opendir(taskpath))) {
-        printf("Failed to open %s (%s)\n", taskpath, strerror(errno));
+        dprintf(STDOUT_FILENO, "Failed to open %s (%s)\n", taskpath, strerror(errno));
         return;
     }
 
@@ -364,6 +370,9 @@
 }
 
 void for_each_tid(for_each_tid_func func, const char *header) {
+    std::string title = header == nullptr ? "for_each_tid"
+                                          : android::base::StringPrintf("for_each_tid(%s)", header);
+    DurationReporter duration_reporter(title);
     if (PropertiesHelper::IsDryRun()) return;
 
     __for_each_pid(for_each_tid_helper, header, (void *) func);
@@ -381,7 +390,7 @@
 
     snprintf(path, sizeof(path), "/proc/%d/wchan", tid);
     if ((fd = TEMP_FAILURE_RETRY(open(path, O_RDONLY | O_CLOEXEC))) < 0) {
-        printf("Failed to open '%s' (%s)\n", path, strerror(errno));
+        dprintf(STDOUT_FILENO, "Failed to open '%s' (%s)\n", path, strerror(errno));
         return;
     }
 
@@ -390,14 +399,14 @@
     close(fd);
 
     if (ret < 0) {
-        printf("Failed to read '%s' (%s)\n", path, strerror(save_errno));
+        dprintf(STDOUT_FILENO, "Failed to read '%s' (%s)\n", path, strerror(save_errno));
         return;
     }
 
     snprintf(name_buffer, sizeof(name_buffer), "%*s%s",
              pid == tid ? 0 : 3, "", name);
 
-    printf("%-7d %-32s %s\n", tid, name_buffer, buffer);
+    dprintf(STDOUT_FILENO, "%-7d %-32s %s\n", tid, name_buffer, buffer);
 
     return;
 }
@@ -447,7 +456,7 @@
 
     snprintf(path, sizeof(path), "/proc/%d/stat", pid);
     if ((fd = TEMP_FAILURE_RETRY(open(path, O_RDONLY | O_CLOEXEC))) < 0) {
-        printf("Failed to open '%s' (%s)\n", path, strerror(errno));
+        dprintf(STDOUT_FILENO, "Failed to open '%s' (%s)\n", path, strerror(errno));
         return;
     }
 
@@ -456,7 +465,7 @@
     close(fd);
 
     if (ret < 0) {
-        printf("Failed to read '%s' (%s)\n", path, strerror(save_errno));
+        dprintf(STDOUT_FILENO, "Failed to read '%s' (%s)\n", path, strerror(save_errno));
         return;
     }
 
@@ -495,7 +504,7 @@
     if (iotime) {
         snprdec(buffer, sizeof(buffer), 79, permille);
     }
-    puts(buffer); // adds a trailing newline
+    dprintf(STDOUT_FILENO, "%s\n", buffer);
 
     return;
 }
@@ -503,29 +512,29 @@
 void do_dmesg() {
     const char *title = "KERNEL LOG (dmesg)";
     DurationReporter duration_reporter(title);
-    printf("------ %s ------\n", title);
+    dprintf(STDOUT_FILENO, "------ %s ------\n", title);
 
     if (PropertiesHelper::IsDryRun()) return;
 
     /* Get size of kernel buffer */
     int size = klogctl(KLOG_SIZE_BUFFER, NULL, 0);
     if (size <= 0) {
-        printf("Unexpected klogctl return value: %d\n\n", size);
+        dprintf(STDOUT_FILENO, "Unexpected klogctl return value: %d\n\n", size);
         return;
     }
     char *buf = (char *) malloc(size + 1);
     if (buf == NULL) {
-        printf("memory allocation failed\n\n");
+        dprintf(STDOUT_FILENO, "memory allocation failed\n\n");
         return;
     }
     int retval = klogctl(KLOG_READ_ALL, buf, size);
     if (retval < 0) {
-        printf("klogctl failure\n\n");
+        dprintf(STDOUT_FILENO, "klogctl failure\n\n");
         free(buf);
         return;
     }
     buf[retval] = '\0';
-    printf("%s\n\n", buf);
+    dprintf(STDOUT_FILENO, "%s\n\n", buf);
     free(buf);
     return;
 }
@@ -546,7 +555,7 @@
 
     UpdateProgress(WEIGHT_FILE);
 
-    fflush(stdout);
+    fsync(STDOUT_FILENO);
 
     return status;
 }
@@ -588,7 +597,7 @@
     int fd, retval = 0;
 
     if (!title.empty()) {
-        printf("------ %s (%s) ------\n", title.c_str(), dir);
+        dprintf(STDOUT_FILENO, "------ %s (%s) ------\n", title.c_str(), dir);
     }
     if (PropertiesHelper::IsDryRun()) return 0;
 
@@ -630,14 +639,14 @@
         fd = TEMP_FAILURE_RETRY(open(newpath, O_RDONLY | O_NONBLOCK | O_CLOEXEC));
         if (fd < 0) {
             retval = fd;
-            printf("*** %s: %s\n", newpath, strerror(errno));
+            dprintf(STDOUT_FILENO, "*** %s: %s\n", newpath, strerror(errno));
             continue;
         }
         (*dump_from_fd)(NULL, newpath, fd);
     }
     closedir(dirp);
     if (!title.empty()) {
-        printf("\n");
+        dprintf(STDOUT_FILENO, "\n");
     }
     return retval;
 }
@@ -651,11 +660,12 @@
 
     int flags = fcntl(fd, F_GETFL);
     if (flags == -1) {
-        printf("*** %s: failed to get flags on fd %d: %s\n", path, fd, strerror(errno));
+        dprintf(STDOUT_FILENO, "*** %s: failed to get flags on fd %d: %s\n", path, fd,
+                strerror(errno));
         close(fd);
         return -1;
     } else if (!(flags & O_NONBLOCK)) {
-        printf("*** %s: fd must have O_NONBLOCK set.\n", path);
+        dprintf(STDOUT_FILENO, "*** %s: fd must have O_NONBLOCK set.\n", path);
         close(fd);
         return -1;
     }
@@ -674,7 +684,7 @@
      * Ideally, it should use a options.EstimatedDuration() instead...*/
     UpdateProgress(options.Timeout());
 
-    fflush(stdout);
+    fsync(STDOUT_FILENO);
 
     return status;
 }
@@ -720,7 +730,7 @@
 void print_properties() {
     const char* title = "SYSTEM PROPERTIES";
     DurationReporter duration_reporter(title);
-    printf("------ %s ------\n", title);
+    dprintf(STDOUT_FILENO, "------ %s ------\n", title);
     if (PropertiesHelper::IsDryRun()) return;
     size_t i;
     num_props = 0;
@@ -731,7 +741,7 @@
         fputs(props[i], stdout);
         free(props[i]);
     }
-    printf("\n");
+    dprintf(STDOUT_FILENO, "\n");
 }
 
 int open_socket(const char *service) {
@@ -985,7 +995,7 @@
     ds.DumpFile("RT_TABLES", RT_TABLES_PATH);
     FILE* fp = fopen(RT_TABLES_PATH, "re");
     if (!fp) {
-        printf("*** %s: %s\n", RT_TABLES_PATH, strerror(errno));
+        dprintf(STDOUT_FILENO, "*** %s: %s\n", RT_TABLES_PATH, strerror(errno));
         return;
     }
     char table[16];
@@ -1092,44 +1102,42 @@
         return;
     }
 
-    printf("------ %s Extended CSD ------\n", ext_csd_path);
+    dprintf(STDOUT_FILENO, "------ %s Extended CSD ------\n", ext_csd_path);
 
     if (buffer.length() < (EXT_CSD_REV + sizeof(hex))) {
-        printf("*** %s: truncated content %zu\n\n", ext_csd_path, buffer.length());
+        dprintf(STDOUT_FILENO, "*** %s: truncated content %zu\n\n", ext_csd_path, buffer.length());
         return;
     }
 
     int ext_csd_rev = 0;
     std::string sub = buffer.substr(EXT_CSD_REV, sizeof(hex));
     if (sscanf(sub.c_str(), "%2x", &ext_csd_rev) != 1) {
-        printf("*** %s: EXT_CSD_REV parse error \"%s\"\n\n",
-               ext_csd_path, sub.c_str());
+        dprintf(STDOUT_FILENO, "*** %s: EXT_CSD_REV parse error \"%s\"\n\n", ext_csd_path,
+                sub.c_str());
         return;
     }
 
     static const char *ver_str[] = {
         "4.0", "4.1", "4.2", "4.3", "Obsolete", "4.41", "4.5", "5.0"
     };
-    printf("rev 1.%d (MMC %s)\n",
-           ext_csd_rev,
-           (ext_csd_rev < (int)(sizeof(ver_str) / sizeof(ver_str[0]))) ?
-               ver_str[ext_csd_rev] :
-               "Unknown");
+    dprintf(STDOUT_FILENO, "rev 1.%d (MMC %s)\n", ext_csd_rev,
+            (ext_csd_rev < (int)(sizeof(ver_str) / sizeof(ver_str[0]))) ? ver_str[ext_csd_rev]
+                                                                        : "Unknown");
     if (ext_csd_rev < 7) {
-        printf("\n");
+        dprintf(STDOUT_FILENO, "\n");
         return;
     }
 
     if (buffer.length() < (EXT_PRE_EOL_INFO + sizeof(hex))) {
-        printf("*** %s: truncated content %zu\n\n", ext_csd_path, buffer.length());
+        dprintf(STDOUT_FILENO, "*** %s: truncated content %zu\n\n", ext_csd_path, buffer.length());
         return;
     }
 
     int ext_pre_eol_info = 0;
     sub = buffer.substr(EXT_PRE_EOL_INFO, sizeof(hex));
     if (sscanf(sub.c_str(), "%2x", &ext_pre_eol_info) != 1) {
-        printf("*** %s: PRE_EOL_INFO parse error \"%s\"\n\n",
-               ext_csd_path, sub.c_str());
+        dprintf(STDOUT_FILENO, "*** %s: PRE_EOL_INFO parse error \"%s\"\n\n", ext_csd_path,
+                sub.c_str());
         return;
     }
 
@@ -1139,11 +1147,10 @@
         "Warning (consumed 80% of reserve)",
         "Urgent (consumed 90% of reserve)"
     };
-    printf("PRE_EOL_INFO %d (MMC %s)\n",
-           ext_pre_eol_info,
-           eol_str[(ext_pre_eol_info < (int)
-                       (sizeof(eol_str) / sizeof(eol_str[0]))) ?
-                           ext_pre_eol_info : 0]);
+    dprintf(
+        STDOUT_FILENO, "PRE_EOL_INFO %d (MMC %s)\n", ext_pre_eol_info,
+        eol_str[(ext_pre_eol_info < (int)(sizeof(eol_str) / sizeof(eol_str[0]))) ? ext_pre_eol_info
+                                                                                 : 0]);
 
     for (size_t lifetime = EXT_DEVICE_LIFE_TIME_EST_TYP_A;
             lifetime <= EXT_DEVICE_LIFE_TIME_EST_TYP_B;
@@ -1165,28 +1172,26 @@
         };
 
         if (buffer.length() < (lifetime + sizeof(hex))) {
-            printf("*** %s: truncated content %zu\n", ext_csd_path, buffer.length());
+            dprintf(STDOUT_FILENO, "*** %s: truncated content %zu\n", ext_csd_path, buffer.length());
             break;
         }
 
         ext_device_life_time_est = 0;
         sub = buffer.substr(lifetime, sizeof(hex));
         if (sscanf(sub.c_str(), "%2x", &ext_device_life_time_est) != 1) {
-            printf("*** %s: DEVICE_LIFE_TIME_EST_TYP_%c parse error \"%s\"\n",
-                   ext_csd_path,
-                   (unsigned)((lifetime - EXT_DEVICE_LIFE_TIME_EST_TYP_A) /
-                              sizeof(hex)) + 'A',
-                   sub.c_str());
+            dprintf(STDOUT_FILENO, "*** %s: DEVICE_LIFE_TIME_EST_TYP_%c parse error \"%s\"\n",
+                    ext_csd_path,
+                    (unsigned)((lifetime - EXT_DEVICE_LIFE_TIME_EST_TYP_A) / sizeof(hex)) + 'A',
+                    sub.c_str());
             continue;
         }
-        printf("DEVICE_LIFE_TIME_EST_TYP_%c %d (MMC %s)\n",
-               (unsigned)((lifetime - EXT_DEVICE_LIFE_TIME_EST_TYP_A) /
-                          sizeof(hex)) + 'A',
-               ext_device_life_time_est,
-               est_str[(ext_device_life_time_est < (int)
-                           (sizeof(est_str) / sizeof(est_str[0]))) ?
-                               ext_device_life_time_est : 0]);
+        dprintf(STDOUT_FILENO, "DEVICE_LIFE_TIME_EST_TYP_%c %d (MMC %s)\n",
+                (unsigned)((lifetime - EXT_DEVICE_LIFE_TIME_EST_TYP_A) / sizeof(hex)) + 'A',
+                ext_device_life_time_est,
+                est_str[(ext_device_life_time_est < (int)(sizeof(est_str) / sizeof(est_str[0])))
+                            ? ext_device_life_time_est
+                            : 0]);
     }
 
-    printf("\n");
+    dprintf(STDOUT_FILENO, "\n");
 }
