[lldb-dev] File::Read does not read everything

Greg Clayton via lldb-dev lldb-dev at lists.llvm.org
Mon Oct 17 12:39:12 PDT 2016


It is probably best to make the code loop as long as "bytes_reads > 0" and we haven't read "num_bytes" yet. The darwin kernel has a INT32_MAX read size which gets set to MAX_READ_SIZE, but we need to do that because if you try to read more than that it reads nothing. So MAX_READ_SIZE is more for the case where the read will outright fail if given a byte size that is too large. Feel free to submit a patch that can keep calling pread correctly in a loop as long as bytes_read > 0.

Greg

> On Oct 17, 2016, at 12:20 PM, Eugene Birukov via lldb-dev <lldb-dev at lists.llvm.org> wrote:
> 
> Hello,
> 
> I am using LLDB 3.9 on Linux Ubuntu. I am loading a 5GiB core which is located on Windows file share mounted on Linux via mount.cifs. I see that we successfully allocated memory and are trying to fill it in one read. Unfortunately pread returns 2GiB and we never check for short read here.
> 
> I think we could combine this code with previous block "#if defined (MAX_READ_SIZE)" if we simply check for short read here (bytes_read too small) and loop until all the buffer is filled.
> 
> Thanks,
> Eugene
> 
> #ifndef _WIN32
>     int fd = GetDescriptor();
>     if (fd != kInvalidDescriptor)
>     {
>         ssize_t bytes_read = -1;
>         do
>         {
>             bytes_read = ::pread (fd, buf, num_bytes, offset);
>         } while (bytes_read < 0 && errno == EINTR);
> 
>         if (bytes_read < 0)
>         {
>             num_bytes = 0;
>             error.SetErrorToErrno();
>         }
>         else
>         {
>             offset += bytes_read;
>             num_bytes = bytes_read;
>         }
>     }
> 
> Sent from Outlook
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev



More information about the lldb-dev mailing list