[lldb-dev] does vFile:Open actually work?

Jason Molenda via lldb-dev lldb-dev at lists.llvm.org
Thu Oct 10 17:56:58 PDT 2019

Yeah, this is a bug in lldb's implementation of vFile:open.  lldb talks to lldb-server (in platform mode) so it will work with itself, but it will not interoperate with any other implementations.  That's the down side to having the client and server literally built from the same sources. :) 

I have a small self-contained platform implementation I wrote locally from the specification, and I stumbled across the bug last winter.  We'll need to add a packet so lldb can request standards-correct vFile:open: behavior, and fall back to its original implementation if it that is not understood for a while so we interoperate with existing platforms in the wild.

A similar type of bug is lldb's incorrect implementation of the A packet, see https://bugs.llvm.org/show_bug.cgi?id=42471 - Spencer had the good suggestion of creating a protocol fixes packet to query for these so additional ones can be added in the future, he suggested:

> Request: "qProtocolFixes:fix;…" where each 'fix' is one of the following strings:
>   - "GDBFlagsInvFileOpen"
>   - "GDBBaseInAPacket"
>   - ...
> Unknown strings are acceptable, but ignored. If a fix  string is not present, it is assumed that that fix is not present.
> Response: "fix;…", same definition as 'fix' above.

I have a little TODO on myself to do this (<rdar://problem/46788934>).


> On Oct 10, 2019, at 2:39 PM, Larry D'Anna via lldb-dev <lldb-dev at lists.llvm.org> wrote:
> The comments in File.h say:
>   // NB this enum is used in the lldb platform gdb-remote packet
>   // vFile:open: and existing values cannot be modified.
>   enum OpenOptions {
>     eOpenOptionRead = (1u << 0),  // Open file for reading
>     eOpenOptionWrite = (1u << 1), // Open file for writing
>     eOpenOptionAppend =
>         (1u << 2), // Don't truncate file when opening, append to end of file
> And In GDBRemoteCommunicationServerCommon.cpp it says:
>       uint32_t flags = packet.GetHexMaxU32(false, 0);
>       if (packet.GetChar() == ',') {
>         mode_t mode = packet.GetHexMaxU32(false, 0600);
>         FileSpec path_spec(path);
>         FileSystem::Instance().Resolve(path_spec);
>         // Do not close fd.
>         auto file = FileSystem::Instance().Open(path_spec, flags, mode, false);
> But in the GDB documentation it says:
> @node Open Flags
> @unnumberedsubsubsec Open Flags
> @cindex open flags, in file-i/o protocol
> All values are given in hexadecimal representation.
> @smallexample
>   O_RDONLY        0x0
>   O_WRONLY        0x1
>   O_RDWR          0x2
>   O_APPEND        0x8
>   O_CREAT       0x200
>   O_TRUNC       0x400
>   O_EXCL        0x800
> @end smallexample
> Does vFile:Open actually work?  Are there any tests that cover it?
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

More information about the lldb-dev mailing list