[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