[lldb-dev] [RFC] Supporting Lua Scripting in LLDB
Jim Ingham via lldb-dev
lldb-dev at lists.llvm.org
Tue Dec 10 11:04:04 PST 2019
> On Dec 10, 2019, at 3:11 AM, Pavel Labath via lldb-dev <lldb-dev at lists.llvm.org> wrote:
> On 09/12/2019 18:27, Jonas Devlieghere wrote:
>> On Mon, Dec 9, 2019 at 1:55 AM Pavel Labath <pavel at labath.sk> wrote:
>>> I think this would be a very interesting project, and would allow us to
>>> flesh out the details of the script interpreter interface.
>>> A lot of the complexity in our python code comes from the fact that
>>> python can be (a) embedded into lldb and (b) lldb can be embedded into
>>> python. It's been a while since I worked with lua, but from what I
>>> remember, lua was designed to make (a) easy., and I don't think (b) was
>>> ever a major goal (though it can always be done ways, of course)..
>>> Were you intending to implement both of these directions or just one of
>>> them ((a), I guess)?
>> Thanks for pointing this out. Indeed, my goal is only to support (a)
>> for exactly the reasons you brought up.
>>> The reason I am asking this is because doing only (a) will definitely
>>> make lua support simpler than python, but it will also mean it won't be
>>> a "python-lite".
>>> Both of these options are fine -- I just want to understand where you're
>>> going with this. It also has some impact on the testing strategy, as our
>>> existing python tests are largely using mode (b).
>> That's part of my motivation for *not* doing (b). I really don't want
>> to create/maintain another (Lua driven) test suite.
> I certainly see where you're coming from, but I'm not sure if this will
> actually achieve the intended effect. The thing is, not doing (b) does
> not really reduce the testing surface that much -- it just makes the
> tested APIs harder to reach. If Python didn't have (b), we wouldn't be
> able to do "import lldb" in python, but that's about it. The full lldb
> python api would still be reachable by starting lldb and typing "script".
> What this means is that if lua doesn't support (b) then the lua bindings
> will need to be tested by driving lldb from within the lua interpreter
> embedded within lldb -- which doesn't exactly sound like a win. I'm not
> saying this means we *must* implement (b), or that the alternative
> solution will be more complex than testing via (b) (though I'm sure we
> could come up with something way simpler than dotest), but I think we
> should try to come up with a good testing story very early on.
> Speaking of testing, will there be any bot configured to build&test the
> lua code?
>>> Another question I'm interested in is how deeply will this
>>> multi-interpreter thing go? Will it be a build time option, will it be
>>> selectable at runtime, but we'll have only one script interpreter per
>>> SBDebugger, or will we be able to freely mix'n'match scripting languages?
>> There is one script interpreter per debugger. As far as I can tell
>> from the code this is already enforced.
>>> I think the last option would be best because of data formatters
>>> (otherwise one would have a problem is some of his data formatters are
>>> written in python and others in lua), but it would also create a lot
>>> more of new api surface, as one would have to worry about consistency of
>>> the lua and python views of lldb, etc.
>> That's an interesting problem I didn't think of. I'm definitely not
>> excited about having the same data formatter implemented in both
>> scripting languages. Mixing scripting languages makes sense for when
>> your LLDB is configured to support both Python and Lua, but what do
>> you do for people that want only Lua? They might still want to
>> re-implement some data formatters they care about...
> Well, if they really have a lldb build which only supports one scripting
> language, then yes, they'd have to reimplement something -- there isn't
> anything else that can be done. But it'd be a pitty if someone had lldb
> which supports *both* languages and he is forced to choose which data
> structures he wants pretty-printed.
>> Anyway, given
>> that we don't maintain/ship data formatters in Python ourselves, maybe
>> this isn't that big of an issue at all?
> Hard to say without this thing actually being used. I certainly don't
> think this is something that we need to solve right now, though I think
> it something that we should be aware of, and not close the door on that
> possibility completely.
> And BTW we do ship python data formatters right now. The libc++ and
> libstdc++ have some formatters written in python -- with the choice of
> formatters being pretty arbitrary.
This is an aside, but... We originally wrote all the data formatters in Python for dog fooding purposes. Then most of the ones relevant to macOS were replaced with C++ ones quite a while ago - partly so that there would be formatters for crucial objects that didn't depend on having Python around and partly as an experiment in the cost of C++ vrs. Python data formatters. The former purpose was obviated when ALL data formatters got errantly put under the 'ifdef PYTHON' - though that's been fixed recently - but the latter purpose was useful, mostly for showing that the C++ ones weren't noticeably faster... The only libcxx Python data formatter that actually gets added by lldb is the dequeue one. Looks like a few more get used from the gnu libstdcpp support (dequeue, vector, map and list). It is kind of nice to have a bunch of sophisticated examples out there for people to copy from, but I don't see any strong reason to be dogmatic about how to implement them.
To which point... I do agree with Pavel that if we support more than one scripting language fully, we should make it possible to load and use more than one script interpreter in a given lldb session. What gets added to lldb by the scripting interface is domain specific customizations, so in a working ecosystem for this facility, pieces will be coming from a wide variety of sources. If we require only one implementation language at a time, then eventually everyone will ignore one of the scripting languages, because the other has more interesting bits of functionality. Or worse we'll get divided into "my scripting language is better than yours" camps which while a constant source of fun in the CS community for years now, ends up not being very productive and in our case will reduce the overall utility of lldb.
The initial design of the scripting interpreters in lldb was to allow more than one to coexist. So for instance, "break command add" takes a scripting language as well as a script function. I don't think there's any fundamental reason why this couldn't be maintained.
> lldb-dev mailing list
> lldb-dev at lists.llvm.org
More information about the lldb-dev