[Lldb-commits] [lldb] r270588 - Improve wording in TSan reports involving global variables. Don't repeat hex addresses that are the same.

Kuba Brecka via lldb-commits lldb-commits at lists.llvm.org
Tue May 24 10:47:23 PDT 2016


Author: kuba.brecka
Date: Tue May 24 12:47:23 2016
New Revision: 270588

URL: http://llvm.org/viewvc/llvm-project?rev=270588&view=rev
Log:
Improve wording in TSan reports involving global variables.  Don't repeat hex addresses that are the same.


Modified:
    lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp
    lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.h

Modified: lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp?rev=270588&r1=270587&r2=270588&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp (original)
+++ lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp Tue May 24 12:47:23 2016
@@ -583,7 +583,12 @@ ThreadSanitizerRuntime::GenerateSummary(
             addr = loc->GetAsDictionary()->GetValueForKey("start")->GetAsInteger()->GetValue();
         
         if (addr != 0) {
-            summary = summary + " at " + Sprintf("0x%llx", addr);
+            std::string global_name = GetSymbolNameFromAddress(process_sp, addr);
+            if (!global_name.empty()) {
+                summary = summary + " at " + global_name;
+            } else {
+                summary = summary + " at " + Sprintf("0x%llx", addr);
+            }
         } else {
             int fd = loc->GetAsDictionary()->GetValueForKey("file_descriptor")->GetAsInteger()->GetValue();
             if (fd != 0) {
@@ -610,7 +615,7 @@ ThreadSanitizerRuntime::GetMainRacyAddre
 }
 
 std::string
-ThreadSanitizerRuntime::GetLocationDescription(StructuredData::ObjectSP report, std::string &filename, uint32_t &line)
+ThreadSanitizerRuntime::GetLocationDescription(StructuredData::ObjectSP report, addr_t &global_addr, std::string &global_name, std::string &filename, uint32_t &line)
 {
     std::string result = "";
     
@@ -620,12 +625,16 @@ ThreadSanitizerRuntime::GetLocationDescr
         StructuredData::ObjectSP loc = report->GetAsDictionary()->GetValueForKey("locs")->GetAsArray()->GetItemAtIndex(0);
         std::string type = loc->GetAsDictionary()->GetValueForKey("type")->GetStringValue();
         if (type == "global") {
-            addr_t addr = loc->GetAsDictionary()->GetValueForKey("address")->GetAsInteger()->GetValue();
-            std::string global_name = GetSymbolNameFromAddress(process_sp, addr);
-            result = Sprintf("Location is a global '%s'", global_name.c_str());
+            global_addr = loc->GetAsDictionary()->GetValueForKey("address")->GetAsInteger()->GetValue();
+            global_name = GetSymbolNameFromAddress(process_sp, global_addr);
+            if (!global_name.empty()) {
+                result = Sprintf("'%s' is a global variable (0x%llx)", global_name.c_str(), global_addr);
+            } else {
+                result = Sprintf("0x%llx is a global variable", global_addr);
+            }
             
             Declaration decl;
-            GetSymbolDeclarationFromAddress(process_sp, addr, decl);
+            GetSymbolDeclarationFromAddress(process_sp, global_addr, decl);
             if (decl.GetFile()) {
                 filename = decl.GetFile().GetPath();
                 line = decl.GetLine();
@@ -670,14 +679,30 @@ ThreadSanitizerRuntime::NotifyBreakpoint
         addr_t main_address = instance->GetMainRacyAddress(report);
         report->GetAsDictionary()->AddIntegerItem("memory_address", main_address);
         
+        addr_t global_addr = 0;
+        std::string global_name = "";
         std::string location_filename = "";
         uint32_t location_line = 0;
-        std::string location_description = instance->GetLocationDescription(report, location_filename, location_line);
+        std::string location_description = instance->GetLocationDescription(report, global_addr, global_name, location_filename, location_line);
         report->GetAsDictionary()->AddStringItem("location_description", location_description);
+        if (global_addr != 0) {
+            report->GetAsDictionary()->AddIntegerItem("global_address", global_addr);
+        }
+        if (!global_name.empty()) {
+            report->GetAsDictionary()->AddStringItem("global_name", global_name);
+        }
         if (location_filename != "") {
             report->GetAsDictionary()->AddStringItem("location_filename", location_filename);
             report->GetAsDictionary()->AddIntegerItem("location_line", location_line);
         }
+        
+        bool all_addresses_are_same = true;
+        report->GetObjectForDotSeparatedPath("mops")->GetAsArray()->ForEach([&all_addresses_are_same, main_address] (StructuredData::Object *o) -> bool {
+            addr_t addr = o->GetObjectForDotSeparatedPath("address")->GetIntegerValue();
+            if (main_address != addr) all_addresses_are_same = false;
+            return true;
+        });
+        report->GetAsDictionary()->AddBooleanItem("all_addresses_are_same", all_addresses_are_same);
     }
     
     ProcessSP process_sp = instance->GetProcessSP();
@@ -756,7 +781,7 @@ ThreadSanitizerRuntime::Deactivate()
 }
 
 static std::string
-GenerateThreadName(std::string path, StructuredData::Object *o) {
+GenerateThreadName(std::string path, StructuredData::Object *o, StructuredData::ObjectSP main_info) {
     std::string result = "additional information";
     
     if (path == "mops") {
@@ -766,7 +791,13 @@ GenerateThreadName(std::string path, Str
         bool is_atomic = o->GetObjectForDotSeparatedPath("is_atomic")->GetBooleanValue();
         addr_t addr = o->GetObjectForDotSeparatedPath("address")->GetIntegerValue();
         
-        result = Sprintf("%s%s of size %d at 0x%llx by thread %d", is_atomic ? "atomic " : "", is_write ? "write" : "read", size, addr, thread_id);
+        std::string addr_string = Sprintf(" at 0x%llx", addr);
+        
+        if (main_info->GetObjectForDotSeparatedPath("all_addresses_are_same")->GetBooleanValue()){
+            addr_string = "";
+        }
+        
+        result = Sprintf("%s%s of size %d%s by thread %d", is_atomic ? "atomic " : "", is_write ? "write" : "read", size, addr_string.c_str(), thread_id);
     }
     
     if (path == "threads") {
@@ -803,7 +834,7 @@ GenerateThreadName(std::string path, Str
 static void
 AddThreadsForPath(std::string path, ThreadCollectionSP threads, ProcessSP process_sp, StructuredData::ObjectSP info)
 {
-    info->GetObjectForDotSeparatedPath(path)->GetAsArray()->ForEach([process_sp, threads, path] (StructuredData::Object *o) -> bool {
+    info->GetObjectForDotSeparatedPath(path)->GetAsArray()->ForEach([process_sp, threads, path, info] (StructuredData::Object *o) -> bool {
         std::vector<lldb::addr_t> pcs;
         o->GetObjectForDotSeparatedPath("trace")->GetAsArray()->ForEach([&pcs] (StructuredData::Object *pc) -> bool {
             pcs.push_back(pc->GetAsInteger()->GetValue());
@@ -820,7 +851,7 @@ AddThreadsForPath(std::string path, Thre
         bool stop_id_is_valid = false;
         HistoryThread *history_thread = new HistoryThread(*process_sp, tid, pcs, stop_id, stop_id_is_valid);
         ThreadSP new_thread_sp(history_thread);
-        new_thread_sp->SetName(GenerateThreadName(path, o).c_str());
+        new_thread_sp->SetName(GenerateThreadName(path, o, info).c_str());
         
         // Save this in the Process' ExtendedThreadList so a strong pointer retains the object
         process_sp->GetExtendedThreadList().AddThread(new_thread_sp);

Modified: lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.h?rev=270588&r1=270587&r2=270588&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.h (original)
+++ lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.h Tue May 24 12:47:23 2016
@@ -103,7 +103,7 @@ private:
     GetMainRacyAddress(StructuredData::ObjectSP report);
     
     std::string
-    GetLocationDescription(StructuredData::ObjectSP report, std::string &filename, uint32_t &line);
+    GetLocationDescription(StructuredData::ObjectSP report, lldb::addr_t &global_addr, std::string &global_name, std::string &filename, uint32_t &line);
     
     lldb::addr_t
     GetFirstNonInternalFramePc(StructuredData::ObjectSP trace);




More information about the lldb-commits mailing list