diff options
author | Keith Seitz <keiths@redhat.com> | 2014-06-11 13:26:50 -0700 |
---|---|---|
committer | Keith Seitz <keiths@redhat.com> | 2014-06-16 11:38:19 -0700 |
commit | 6be47f0c48cbd58921a25e7493ca79a6f596dffe (patch) | |
tree | dd34087bac0f958db3c0601fe028811086e5d546 /gdb/mi | |
parent | b97e87cc01703e2e612b1fc21c54f90b1a0f4519 (diff) | |
download | gdb-6be47f0c48cbd58921a25e7493ca79a6f596dffe.zip gdb-6be47f0c48cbd58921a25e7493ca79a6f596dffe.tar.gz gdb-6be47f0c48cbd58921a25e7493ca79a6f596dffe.tar.bz2 |
Fix for PR mi/15863
If an MI client creates a varobj and attempts to update the root
/before/ the inferior is started, gdb will throw an internal error:
(gdb)
-var-create * - batch_flag
^done,name="var1",numchild="0",value="0",type="int",has_more="0"
(gdb)
-var-update var1
^done,changelist=[]
(gdb)
-var-update *
~"../../src/gdb/thread.c:628: internal-error: is_thread_state: Assertion `tp' failed.\nA problem internal to GDB has been detected,\nfurther debugging may prove unreliable.\nQuit this debugging session? "
~"(y or n) "
The function that handles the varobj update in the failing case,
mi_cmd_var_udpate_iter, checks if the thread/inferior is stopped before
attempting to update the varobj. It calls is_stopped (inferior_ptid)
which calls is_thread_state:
tp = find_thread_ptid (ptid);
gdb_assert (tp);
When there is no inferior, ptid is null_ptid, and find_thread_ptid (null_ptid)
returns NULL and the assertion is triggered.
This patch changes mi_cmd_var_update_iter to behave the same way
"-var-update var1" does: by calling the thread "stopped" if
there is no inferior (and thereby calling varobj_update_one).
ChangeLog
2014-06-16 Keith Seitz <keiths@redhat.com>
PR mi/15863
* mi/mi-cmd-var.c (mi_cmd_var_update_iter): Do not attempt
to update the varobj if inferior_ptid is null_ptid.
testsuite/ChangeLog
2014-06-16 Keith Seitz <keiths@redhat.com>
PR mi/15863
* gdb.mi/mi-var-cmd.exp: Add test for -var-update before
the inferior is started.
Diffstat (limited to 'gdb/mi')
-rw-r--r-- | gdb/mi/mi-cmd-var.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 9059616..08a87bf 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -642,7 +642,9 @@ mi_cmd_var_update_iter (struct varobj *var, void *data_pointer) thread_id = varobj_get_thread_id (var); - if (thread_id == -1 && is_stopped (inferior_ptid)) + if (thread_id == -1 + && (ptid_equal (inferior_ptid, null_ptid) + || is_stopped (inferior_ptid))) thread_stopped = 1; else { |