[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