[lldb-dev] hang bug in lldb-mi -var-update

Ted Woodward via lldb-dev lldb-dev at lists.llvm.org
Fri Aug 25 10:42:33 PDT 2017


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




More information about the lldb-dev mailing list