[Lldb-commits] [lldb] r355958 - Rework how lldb warngs about kexts that failed to load in a

Jason Molenda via lldb-commits lldb-commits at lists.llvm.org
Tue Mar 12 12:42:35 PDT 2019


Author: jmolenda
Date: Tue Mar 12 12:42:34 2019
New Revision: 355958

URL: http://llvm.org/viewvc/llvm-project?rev=355958&view=rev
Log:
Rework how lldb warngs about kexts that failed to load in a 
darwin kernel debug session.

Originally, the kext name & uuid were emitted in the middle of the
kext-loading period's.  Last week I decided to try not printing
any details about kexts that failed to load, only printing a summary
of how many failed to load.  

This time I'm print different progress characters depending on whether
the kext loaded or not ("-" for not), then at the end I will print a 
summary of how many kexts failed to load and a sorted list of the
kexts with the bundle ID and the uuid.  It's a lot more readable.

<rdar://problem/48654569> 


Modified:
    lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp

Modified: lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp?rev=355958&r1=355957&r2=355958&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp (original)
+++ lldb/trunk/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp Tue Mar 12 12:42:34 2019
@@ -32,6 +32,7 @@
 #include "DynamicLoaderDarwinKernel.h"
 
 #include <memory>
+#include <algorithm>
 
 //#define ENABLE_DEBUG_PRINTF // COMMENT THIS LINE OUT PRIOR TO CHECKIN
 #ifdef ENABLE_DEBUG_PRINTF
@@ -1288,7 +1289,8 @@ bool DynamicLoaderDarwinKernel::ParseKex
     }
   }
 
-  int failed_to_load_kexts = 0;
+  // Build up a list of <kext-name, uuid> for any kexts that fail to load
+  std::vector<std::pair<std::string, UUID>> kexts_failed_to_load;
   if (number_of_new_kexts_being_added > 0) {
     ModuleList loaded_module_list;
 
@@ -1296,10 +1298,15 @@ bool DynamicLoaderDarwinKernel::ParseKex
     for (uint32_t new_kext = 0; new_kext < num_of_new_kexts; new_kext++) {
       if (to_be_added[new_kext]) {
         KextImageInfo &image_info = kext_summaries[new_kext];
+        bool kext_successfully_added = true;
         if (load_kexts) {
           if (!image_info.LoadImageUsingMemoryModule(m_process)) {
-            failed_to_load_kexts++;
+            kexts_failed_to_load.push_back(
+                 std::pair<std::string, UUID>(
+                     kext_summaries[new_kext].GetName(), 
+                     kext_summaries[new_kext].GetUUID()));
             image_info.LoadImageAtFileAddress(m_process);
+            kext_successfully_added = false;
           }
         }
 
@@ -1309,8 +1316,12 @@ bool DynamicLoaderDarwinKernel::ParseKex
             m_process->GetStopID() == image_info.GetProcessStopId())
           loaded_module_list.AppendIfNeeded(image_info.GetModule());
 
-        if (s && load_kexts)
-          s->Printf(".");
+        if (s && load_kexts) {
+          if (kext_successfully_added)
+            s->Printf(".");
+          else
+            s->Printf("-");
+        }
 
         if (log)
           kext_summaries[new_kext].PutToLog(log);
@@ -1344,11 +1355,25 @@ bool DynamicLoaderDarwinKernel::ParseKex
   }
 
   if (s && load_kexts) {
-    s->Printf(" done.");
-    if (failed_to_load_kexts > 0 && number_of_new_kexts_being_added > 0)
-      s->Printf("  Failed to load %d of %d kexts.", failed_to_load_kexts,
+    s->Printf(" done.\n");
+    if (kexts_failed_to_load.size() > 0 && number_of_new_kexts_being_added > 0) {
+      s->Printf("Failed to load %d of %d kexts:\n", 
+                (int) kexts_failed_to_load.size(),
                 number_of_new_kexts_being_added);
-    s->Printf("\n");
+      // print a sorted list of <kext-name, uuid> kexts which failed to load
+      int longest_name = 0;
+      std::sort(kexts_failed_to_load.begin(), kexts_failed_to_load.end());
+      for (const auto &ku : kexts_failed_to_load) {
+        if (ku.first.size() > longest_name)
+          longest_name = ku.first.size();
+      }
+      for (const auto &ku : kexts_failed_to_load) {
+        std::string uuid;
+        if (ku.second.IsValid())
+          uuid = ku.second.GetAsString();
+        s->Printf (" %-*s %s\n", longest_name, ku.first.c_str(), uuid.c_str());
+      }
+    }
     s->Flush();
   }
 




More information about the lldb-commits mailing list