void UpdateVariable(IVariable variable)
        {
            TreeRowReference row = (TreeRowReference)variable_rows[variable];

            if (row == null) {
                /* the variable isn't presently displayed */

                if (!variable.IsAlive (current_frame.TargetAddress))
                    /* it's not displayed and not alive, just return */
                    return;

                AddVariable (variable);
            }
            else {
                /* the variable is presently displayed */

                // XXX we need a obj.IsValid check in this branch

                if (!variable.IsAlive (current_frame.TargetAddress)) {
                    /* it's in the display but no longer alive.  remove it */
                    RemoveVariable (variable);
                    return;
                }

                /* it's still alive - make sure the display is up to date */
                TreeIter iter;
                if (store.GetIter (out iter, row.Path)) {
                    try {
                        ITargetObject obj = variable.GetObject (current_frame);

                        /* make sure the Value column is correct */
                        string current_value = (string)store.GetValue (iter, VALUE_COL);
                        string new_value = GetObjectValueString (obj);
                        if (current_value != new_value)
                            store.SetValue (iter, VALUE_COL, new_value);

                        /* update the children */
                        UpdateVariableChildren (variable, obj, row.Path, iter);

                    } catch (Exception e) {
                        Console.WriteLine ("can't update variable: {0} {1}", variable, e);
                        store.SetValue (iter, VALUE_COL, "");
                    }
                }
            }
        }