[lldb] Assert filecache and live memory match on debug under a setting

This commit is contained in:
Augusto Noronha
2021-07-27 09:22:12 -03:00
parent fa6b2c9915
commit 77e9d10f0f
7 changed files with 56 additions and 13 deletions

View File

@@ -236,6 +236,8 @@ public:
void SetIsRelocated(bool b) { m_relocated = b; }
bool IsReadOnly();
protected:
ObjectFile *m_obj_file; // The object file that data for this section should
// be read from

View File

@@ -229,6 +229,10 @@ public:
bool GetDebugUtilityExpression() const;
void SetVerifyFileCacheMemoryReads(bool debug);
bool GetVerifyFileCacheMemoryReads() const;
private:
// Callbacks for m_launch_info.
void Arg0ValueChangedCallback();

View File

@@ -798,6 +798,9 @@ class Base(unittest2.TestCase):
'settings set symbols.clang-modules-cache-path "{}"'.format(
configuration.lldb_module_cache_dir),
"settings set use-color false",
# Verify that file cache and live memory always match.
"settings set target.verify-file-cache-memory-reads true",
]
# Set any user-overridden settings.

View File

@@ -599,3 +599,9 @@ size_t SectionList::Slide(addr_t slide_amount, bool slide_children) {
}
return count;
}
bool Section::IsReadOnly() {
auto permissions = Flags(GetPermissions());
return !permissions.Test(ePermissionsWritable) &&
permissions.Test(ePermissionsReadable);
}

View File

@@ -1763,21 +1763,34 @@ size_t Target::ReadMemory(const Address &addr, void *dst, size_t dst_len,
// Read from file cache if read-only section.
if (!force_live_memory && resolved_addr.IsSectionOffset()) {
SectionSP section_sp(resolved_addr.GetSection());
if (section_sp) {
auto permissions = Flags(section_sp->GetPermissions());
bool is_readonly = !permissions.Test(ePermissionsWritable) &&
permissions.Test(ePermissionsReadable);
if (is_readonly) {
file_cache_bytes_read =
ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error);
if (file_cache_bytes_read == dst_len)
return file_cache_bytes_read;
else if (file_cache_bytes_read > 0) {
file_cache_read_buffer =
std::make_unique<uint8_t[]>(file_cache_bytes_read);
std::memcpy(file_cache_read_buffer.get(), dst, file_cache_bytes_read);
if (section_sp && section_sp->IsReadOnly()) {
file_cache_bytes_read =
ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error);
if (GetVerifyFileCacheMemoryReads()) {
if (ProcessIsValid() && file_cache_bytes_read == dst_len) {
if (load_addr == LLDB_INVALID_ADDRESS)
load_addr = resolved_addr.GetLoadAddress(this);
if (load_addr != LLDB_INVALID_ADDRESS) {
std::unique_ptr<uint8_t[]> live_buf =
std::make_unique<uint8_t[]>(dst_len);
bytes_read = m_process_sp->ReadMemory(load_addr, live_buf.get(),
dst_len, error);
if (bytes_read == dst_len) {
lldbassert(memcmp(live_buf.get(), dst, dst_len) == 0 &&
"File cache and live memory diverge!");
}
}
}
}
if (file_cache_bytes_read == dst_len)
return file_cache_bytes_read;
if (file_cache_bytes_read > 0) {
file_cache_read_buffer =
std::make_unique<uint8_t[]>(file_cache_bytes_read);
std::memcpy(file_cache_read_buffer.get(), dst, file_cache_bytes_read);
}
}
}
@@ -4376,6 +4389,17 @@ void TargetProperties::SetDebugUtilityExpression(bool debug) {
m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, debug);
}
bool TargetProperties::GetVerifyFileCacheMemoryReads() const {
const uint32_t idx = ePropertyVerifyFileCacheMemoryReads;
return m_collection_sp->GetPropertyAtIndexAsBoolean(
nullptr, idx, g_target_properties[idx].default_uint_value != 0);
}
void TargetProperties::SetVerifyFileCacheMemoryReads(bool verify) {
const uint32_t idx = ePropertyVerifyFileCacheMemoryReads;
m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, verify);
}
// Target::TargetEventData
Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp)

View File

@@ -175,6 +175,9 @@ let Definition = "target" in {
def DebugUtilityExpression: Property<"debug-utility-expression", "Boolean">,
DefaultFalse,
Desc<"Enable debugging of LLDB-internal utility expressions.">;
def VerifyFileCacheMemoryReads: Property<"verify-file-cache-memory-reads", "Boolean">,
DefaultFalse,
Desc<"Verify that memory read from the file-cache is identical to the memory read from the process.">;
}
let Definition = "process_experimental" in {

View File

@@ -6,3 +6,4 @@ settings set symbols.clang-modules-cache-path "@LLDB_TEST_MODULE_CACHE_LLDB@"
settings set target.auto-apply-fixits false
settings set target.inherit-tcc true
settings set target.detach-on-error false
settings set target.verify-file-cache-memory-reads true