From 6be47f0c48cbd58921a25e7493ca79a6f596dffe Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Wed, 11 Jun 2014 13:26:50 -0700 Subject: [PATCH] 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 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 PR mi/15863 * gdb.mi/mi-var-cmd.exp: Add test for -var-update before the inferior is started. --- gdb/ChangeLog | 6 ++++++ gdb/mi/mi-cmd-var.c | 4 +++- gdb/testsuite/ChangeLog | 6 ++++++ gdb/testsuite/gdb.mi/mi-var-cmd.exp | 6 ++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b3aa092e78d..5cec8d53d6d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2014-06-16 Keith Seitz + + 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. + 2014-06-16 Tom Tromey * target.h (struct target_ops) : Make parameter diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 90596161a7f..08a87bf72bc 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 { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 17e2a1aa31a..cb671f5306a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-06-16 Keith Seitz + + PR mi/15863 + * gdb.mi/mi-var-cmd.exp: Add test for -var-update before + the inferior is started. + 2014-06-16 Pedro Alves * gdb.base/break-main-file-remove-fail.c: New file. diff --git a/gdb/testsuite/gdb.mi/mi-var-cmd.exp b/gdb/testsuite/gdb.mi/mi-var-cmd.exp index 46a4e9e5049..03e1b4c5f97 100644 --- a/gdb/testsuite/gdb.mi/mi-var-cmd.exp +++ b/gdb/testsuite/gdb.mi/mi-var-cmd.exp @@ -50,6 +50,12 @@ mi_gdb_load ${binfile} mi_create_varobj "global_simple" "global_simple" "create global variable" +# PR mi/15863 +# Attempt to update the varobj before running the inferior. +mi_gdb_test "-var-update *" \ + "\\^done,changelist=\\\[\\\]" \ + "update varobj before running inferior" + # Test: c_variable-1.2 # Desc: Create non-existent variable