[lldb-dev] hang bug in lldb-mi -var-update
Ted Woodward via lldb-dev
lldb-dev at lists.llvm.org
Fri Aug 25 15:49:03 PDT 2017
The spec says that's what it should do. From
https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Variable-Objects.html :
"Reevaluate the expressions corresponding to the variable object name and
all its direct and indirect children, and return the list of variable
objects whose values have changed;"
Also, our Eclipse guy gets grumpy when it doesn't :-)
Ted
--
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a
Linux Foundation Collaborative Project
> -----Original Message-----
> From: Greg Clayton [mailto:clayborg at gmail.com]
> Sent: Friday, August 25, 2017 5:00 PM
> To: Ted Woodward <ted.woodward at codeaurora.org>
> Cc: lldb-dev at lists.llvm.org
> Subject: Re: [lldb-dev] hang bug in lldb-mi -var-update
>
> lldb-mi should never be checking the children. This is never a good idea
due to
> performance. What happens when you have an array with a million entries?
> Long delay. Aggregate types should never say they changed. Only SBValue
> objects that have values should claim to change.
>
> Greg
>
>
> > On Aug 25, 2017, at 10:42 AM, Ted Woodward via lldb-dev <lldb-
> dev at lists.llvm.org> wrote:
> >
> > I found a hang in lldb-mi's -var-update. It checks to see if a var
> > changed, then it checks each of the children recursively. If a child
> > is a pointer back to a parent, as in this case:
> >
> > struct complex_type
> > {
> > int i;
> > struct { long l; } inner;
> > struct complex_type *complex_ptr;
> > };
> >
> > void
> > var_update_test(void)
> > {
> > struct complex_type complx_array[2];
> >
> > complx_array[0].i = 4;
> > complx_array[0].inner.l = 4;
> > complx_array[0].complex_ptr = &complx_array[1];
> > complx_array[1].i = 5;
> > complx_array[1].inner.l = 5;
> > complx_array[1].complex_ptr = &complx_array[0];
> >
> >
> >
> > the code in CMICmdCmdVarUpdate::ExamineSBValueForChange will get into
> > an infinite loop.
> >
> > const MIuint nChildren = vrwValue.GetNumChildren(); for (MIuint i =
> > 0; i < nChildren; ++i) {
> > lldb::SBValue member = vrwValue.GetChildAtIndex(i);
> > if (!member.IsValid())
> > continue;
> >
> > if (member.GetValueDidChange()) {
> > vrwbChanged = true;
> > return MIstatus::success;
> > } else if (ExamineSBValueForChange(member, vrwbChanged) &&
> vrwbChanged)
> > // Handle composite types (i.e. struct or arrays)
> > return MIstatus::success;
> > }
> >
> > I've got a patch that disables checking a pointer's children. I'll put
> > it up on phabricator today.
> >
> > Ted
> >
> > --
> > Qualcomm Innovation Center, Inc.
> > The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> > a Linux Foundation Collaborative Project
> >
> >
> > _______________________________________________
> > 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