Thanks for the explanation. + Pavel & Adrian.
On Thu, Oct 31, 2019 at 12:51 PM Jim Ingham via lldb-dev <lldb-dev@lists.llvm.org> wrote: > > It looks like this change is causing problems with swift. I was talking a > little bit with Davide about this and it seems like it wasn't obvious how > this was designed to work. So here's what this was intended to do (apologies > if this is at too basic a level and the issue was something deeper I missed, > but anyway this might get us started...) > > The lldb ValueObject system supports two fairly different kinds of values, > live and frozen. > > The classic example of a live ValueObject is ValueObjectVariable. That > ValueObject is backed by an entity in the target, and knows when that entity > is valid and not. So it can always try to do "UpdateValueIfNeeded" and that > will always return good values. However, there's on complication with this, > which is that we also want ValueObjectVariable to be able to answer > "IsChanged". That's so in a UI you can mark values that change over a step > in red, which is very helpful for following along in a debugging session. So > you have to copy the values into host memory, in order to have something to > compare against when you stop again. That's why there's this slightly > complex dance between host and target memory for the live ValueObjects. > > The example of a frozen object is the ValueObjectConstResult that is returned > from expression evaluation. That value is fixed to a StopID, so the backing > entity is only known to be good at that stop id. This is implemented by > copying the value into Host memory and fetching it from there when requested. > > The use case for this is for people like me who have a bad memory. So I can > stop somewhere and do: > > (lldb) expr foo > struct baz $1 = { > bar = 20 > } > > Then later on when I forget what foo.bar was at that time, I can do: > > (lldb) expr $1.bar > bar = 20 > > At a first approximation, this leads to the statement that ConstValues should > fetch what they fetch when made, and then not offer any information that > wasn't gathered when the variable was fetched, and you certainly don't ever > want these values to be updated. > > A little complication arises because I might do: > > (lldb) expr foo_which_has_a_pointer > $1 = ... > (lldb) expr *$1->the_pointer > > If the StopID is the same between the first and second evaluation, then you > should follow the pointer into target memory and fetch the value. But if the > StopID has changed, then trying to dereference a pointer should be an error. > After all, you are now accessing an incoherent object, and if you try to do > anything fancier with it than just print some memory (like asking the Swift > Language Runtime what this value happens to be) you are very likely to get > into trouble. > > So it's clear we need two different behaviors w.r.t. how we treat live or > frozen values. Pavel's change was addressing a failure in ValueObjectChild, > and the solution was to move the ValueObjectVariable behavior up to the > ValueObject level. But then that means that ValueObjectConstResults are no > longer obeying the ConstResult rules. > > But it seems like the problem really is that we have only one > ValueObjectChild class, but child value objects can either be live or frozen, > depending on the nature of their Root ValueObject. And this is made a little > more complicated by the fact that frozen values only freeze when the stop ID > changes. > > Jim > > > _______________________________________________ > lldb-dev mailing list > lldb-dev@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev _______________________________________________ lldb-dev mailing list lldb-dev@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev