diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 9a4902f..3c11c8b 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -30,6 +30,7 @@
     results += input.canned_checks.CheckGNFormatted(input, output)
     results += CheckIncludeGuards(input, output)
     results += CheckAndroidBlueprint(input, output)
+    results += CheckBinaryDescriptors(input, output)
     results += CheckMergedTraceConfigProto(input, output)
     results += CheckWhitelist(input, output)
     return results
@@ -85,7 +86,7 @@
     tool = 'tools/gen_binary_descriptors'
     file_filter = lambda x: input_api.FilterSourceFile(
           x,
-          white_list=('.*[.]h$', '.*[.]proto$', tool))
+          white_list=('protos/perfetto/.*[.]proto$', '.*[.]h', tool))
     if not input_api.AffectedSourceFiles(file_filter):
         return []
     if subprocess.call([tool, '--check-only']):
diff --git a/src/base/android_task_runner.cc b/src/base/android_task_runner.cc
index 23697c8..f9673dd 100644
--- a/src/base/android_task_runner.cc
+++ b/src/base/android_task_runner.cc
@@ -55,7 +55,7 @@
 
 void AndroidTaskRunner::Run() {
   quit_ = false;
-  while (true) {
+  for (;;) {
     {
       std::lock_guard<std::mutex> lock(lock_);
       if (quit_)
diff --git a/src/base/unix_task_runner.cc b/src/base/unix_task_runner.cc
index da5c023..be59f9b 100644
--- a/src/base/unix_task_runner.cc
+++ b/src/base/unix_task_runner.cc
@@ -43,7 +43,7 @@
 void UnixTaskRunner::Run() {
   PERFETTO_DCHECK_THREAD(thread_checker_);
   quit_ = false;
-  while (true) {
+  for (;;) {
     int poll_timeout_ms;
     {
       std::lock_guard<std::mutex> lock(lock_);
diff --git a/src/base/watchdog_unittest.cc b/src/base/watchdog_unittest.cc
index 6088733..866f19e 100644
--- a/src/base/watchdog_unittest.cc
+++ b/src/base/watchdog_unittest.cc
@@ -96,7 +96,7 @@
         watchdog.SetCpuLimit(10, 25);
         watchdog.Start();
         volatile int x = 0;
-        while (true) {
+        for (;;) {
           x++;
         }
       },
diff --git a/src/perfetto_cmd/perfetto_config.descriptor.h b/src/perfetto_cmd/perfetto_config.descriptor.h
index 74bbfac..5f0361b 100644
--- a/src/perfetto_cmd/perfetto_config.descriptor.h
+++ b/src/perfetto_cmd/perfetto_config.descriptor.h
@@ -10,7 +10,7 @@
 // This file was autogenerated by tools/gen_binary_descriptors. Do not edit.
 
 // SHA1(tools/gen_binary_descriptors)
-// 39b24672017b75f5e5ac590c4dc03b2c41bf3eea
+// 2aabce73a7c0d2527e9cb33b9c3c05aeca7a9534
 // SHA1(protos/perfetto/config/perfetto_config.proto)
 // 91af0d676a39daa199e00b09a1b1e13670c0bea1
 
diff --git a/src/trace_processor/sqlite_utils.h b/src/trace_processor/sqlite_utils.h
index 0d3dc94..53d1e19 100644
--- a/src/trace_processor/sqlite_utils.h
+++ b/src/trace_processor/sqlite_utils.h
@@ -203,7 +203,7 @@
   PERFETTO_DCHECK(sqlite3_column_count(*stmt) == 2);
 
   std::vector<Table::Column> columns;
-  while (true) {
+  for (;;) {
     err = sqlite3_step(raw_stmt);
     if (err == SQLITE_DONE)
       break;
diff --git a/src/traced/probes/ftrace/cpu_reader.cc b/src/traced/probes/ftrace/cpu_reader.cc
index 5acb2a1..e607cf7 100644
--- a/src/traced/probes/ftrace/cpu_reader.cc
+++ b/src/traced/probes/ftrace/cpu_reader.cc
@@ -206,7 +206,7 @@
   snprintf(thread_name, sizeof(thread_name), "traced_probes%zu", cpu);
   pthread_setname_np(pthread_self(), thread_name);
 
-  while (true) {
+  for (;;) {
     // First do a blocking splice which sleeps until there is at least one
     // page of data available and enough space to write it into the staging
     // pipe.
@@ -238,7 +238,7 @@
     // Then do as many non-blocking splices as we can. This moves any full
     // pages from the trace pipe into the staging pipe as long as there is
     // data in the former and space in the latter.
-    while (true) {
+    for (;;) {
       {
         PERFETTO_METATRACE("splice_nonblocking", cpu);
         splice_res = splice(trace_fd, nullptr, staging_write_fd, nullptr,
@@ -268,7 +268,7 @@
 
 bool CpuReader::Drain(const std::set<FtraceDataSource*>& data_sources) {
   PERFETTO_DCHECK_THREAD(thread_checker_);
-  while (true) {
+  for (;;) {
     uint8_t* buffer = GetBuffer();
     long bytes =
         PERFETTO_EINTR(read(*staging_read_fd_, buffer, base::kPageSize));
diff --git a/src/traced/probes/ftrace/ftrace_controller_unittest.cc b/src/traced/probes/ftrace/ftrace_controller_unittest.cc
index aa059f8..1f5d28e 100644
--- a/src/traced/probes/ftrace/ftrace_controller_unittest.cc
+++ b/src/traced/probes/ftrace/ftrace_controller_unittest.cc
@@ -215,7 +215,7 @@
   }
 
   void WaitForData(size_t cpu) {
-    while (true) {
+    for (;;) {
       {
         std::unique_lock<std::mutex> lock(lock_);
         if (cpus_to_drain_[cpu])
diff --git a/src/traced/probes/ftrace/ftrace_procfs.cc b/src/traced/probes/ftrace/ftrace_procfs.cc
index cb84dd7..105b678 100644
--- a/src/traced/probes/ftrace/ftrace_procfs.cc
+++ b/src/traced/probes/ftrace/ftrace_procfs.cc
@@ -185,7 +185,7 @@
   size_t start = 0;
   size_t end = 0;
 
-  while (true) {
+  for (;;) {
     end = s.find(' ', start);
     if (end == std::string::npos)
       end = s.size();
diff --git a/tools/gen_binary_descriptors b/tools/gen_binary_descriptors
index 513ef95..d608095 100755
--- a/tools/gen_binary_descriptors
+++ b/tools/gen_binary_descriptors
@@ -34,6 +34,7 @@
 
 SCRIPT_PATH = 'tools/gen_binary_descriptors'
 
+
 def hash_path(path):
   hash = hashlib.sha1()
   with open(os.path.join(ROOT_DIR, path)) as f:
@@ -41,8 +42,19 @@
   return hash.hexdigest()
 
 
+def find_protoc():
+  for root, dirs, files in os.walk(ROOT_DIR):
+    if 'protoc' in files:
+      return os.path.join(root, 'protoc')
+    for name in ('src', 'buildtools'):
+      if name in dirs:
+        dirs.remove(name)
+  return None
+
+
 def check(source, target):
-  assert os.path.exists(os.path.join(ROOT_DIR, target))
+  assert os.path.exists(os.path.join(ROOT_DIR, target)), \
+      'Output file {} does not exist and so cannot be checked'.format(target)
 
   with open(target, 'rb') as f:
     s = f.read()
@@ -52,7 +64,7 @@
   for path, expected_sha1 in hashes:
     actual_sha1 = hash_path(os.path.join(ROOT_DIR, path))
     assert actual_sha1 == expected_sha1, \
-        'Hash for path {} did not match'.format(path)
+        'In {} hash given for {} did not match'.format(target, path)
 
 
 def generate(source, target, protoc_path):
@@ -123,13 +135,21 @@
   parser.add_argument('--protoc')
   args = parser.parse_args()
 
-  for source, target in SOURCE_TARGET.iteritems():
-    if args.check_only:
-        check(source, target)
-    else:
-      protoc = args.protoc
-      assert os.path.exists(protoc)
-      generate(source, target, args.protoc)
+  try:
+    for source, target in SOURCE_TARGET.iteritems():
+      if args.check_only:
+          check(source, target)
+      else:
+        protoc = args.protoc or find_protoc()
+        assert protoc, 'protoc not found specific (--protoc PROTOC_PATH)'
+        assert os.path.exists(protoc), '{} does not exist'.format(protoc)
+        if protoc is not args.protoc:
+          print('Using protoc: {}'.format(protoc))
+        generate(source, target, protoc)
+  except AssertionError as e:
+    if not str(e):
+      raise
+    print('Error: {}'.format(e))
 
 if __name__ == '__main__':
   exit(main())
diff --git a/tools/pipestats.cc b/tools/pipestats.cc
index 15fbe27..6279efc 100644
--- a/tools/pipestats.cc
+++ b/tools/pipestats.cc
@@ -40,7 +40,7 @@
 
 __attribute__((__noreturn__)) void ReadLoop(int fd) {
   char buf[4096];
-  while (true) {
+  for (;;) {
     base::ignore_result(read(fd, &buf, sizeof(buf)));
   }
 }
@@ -67,7 +67,7 @@
   // SPLICE_F_NONBLOCK flag passed to splice().
   SetBlocking(*staging_write_fd, false);
 
-  while (true) {
+  for (;;) {
     ssize_t splice_res = splice(*trace_fd, nullptr, *staging_write_fd, nullptr,
                                 base::kPageSize, SPLICE_F_MOVE);
     if (splice_res > 0) {
