diff --git a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp --- a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp @@ -1499,6 +1499,44 @@ return Status(); } +Status NativeProcessLinux::ReadCStringFromMemory(lldb::addr_t addr, + char *buffer, size_t max_size, + size_t &total_bytes_read) { + const size_t cache_line_size = 4096; + size_t bytes_read = 0; + size_t bytes_left = max_size; + addr_t curr_addr = addr; + char *curr_buffer = buffer; + total_bytes_read = 0; + Status error; + + while (bytes_left > 0 && error.Success()) { + addr_t cache_line_bytes_left = + cache_line_size - (curr_addr % cache_line_size); + addr_t bytes_to_read = std::min(bytes_left, cache_line_bytes_left); + error = ReadMemory(curr_addr, reinterpret_cast(curr_buffer), + bytes_to_read, bytes_read); + + if (bytes_read == 0) + break; + + auto str_end = std::memchr(curr_buffer, '\0', bytes_read); + if (str_end != NULL) { + total_bytes_read = (size_t)(reinterpret_cast(str_end) - buffer); + error.Clear(); + break; + } + + total_bytes_read += bytes_read; + curr_buffer += bytes_read; + curr_addr = reinterpret_cast(reinterpret_cast(curr_addr) + + bytes_read); + bytes_left -= bytes_read; + } + + return error; +} + Status NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf, size_t size, size_t &bytes_written) { const unsigned char *src = static_cast(buf); @@ -2181,8 +2219,9 @@ return error; char name_buffer[PATH_MAX]; - error = ReadMemory(link_map.l_name, &name_buffer, sizeof(name_buffer), - bytes_read); + error = ReadCStringFromMemory(link_map.l_name, + reinterpret_cast(&name_buffer), + sizeof(name_buffer), bytes_read); if (!error.Success()) return error;