keiths / rpms / gdb

Forked from rpms/gdb 4 months ago
Clone
Jan Kratochvil 5752ad0
http://sourceware.org/ml/gdb-patches/2011-02/msg00680.html
Jan Kratochvil 5752ad0
Subject: [patch 2/3] Fix threading internal error on corrupted memory [rediff]
Jan Kratochvil 5752ad0
Jan Kratochvil 5752ad0
[rediff]
Jan Kratochvil 5752ad0
Jan Kratochvil 5752ad0
gdb/
Jan Kratochvil 5752ad0
2011-02-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
Jan Kratochvil 5752ad0
Jan Kratochvil 5752ad0
	* linux-thread-db.c (find_new_threads_callback): Exit on zero TI_TID
Jan Kratochvil 5752ad0
	even if !TARGET_HAS_EXECUTION.
Jan Kratochvil 5752ad0
Jan Kratochvil 5752ad0
gdb/testsuite/
Jan Kratochvil 5752ad0
2011-02-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
Jan Kratochvil 5752ad0
Jan Kratochvil 5752ad0
	* gdb.threads/gcore-thread.exp ($core0file): New variable.
Jan Kratochvil 5752ad0
	(clear __stack_user.next, clear stack_used.next)
Jan Kratochvil 5752ad0
	(save a zeroed-threads corefile): New test.
Jan Kratochvil 5752ad0
	Call core_load for $core0file.
Jan Kratochvil 5752ad0
	(zeroed-threads cannot be listed): New test.
Jan Kratochvil 5752ad0
Jan Kratochvil 5752ad0
--- a/gdb/linux-thread-db.c
Jan Kratochvil 5752ad0
+++ b/gdb/linux-thread-db.c
Jan Kratochvil 5752ad0
@@ -1335,7 +1335,7 @@ find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
Jan Kratochvil 5752ad0
   if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
Jan Kratochvil 5752ad0
     return 0;			/* A zombie -- ignore.  */
Jan Kratochvil 5752ad0
 
Jan Kratochvil 5752ad0
-  if (ti.ti_tid == 0 && target_has_execution)
Jan Kratochvil 5752ad0
+  if (ti.ti_tid == 0)
Jan Kratochvil 5752ad0
     {
Jan Kratochvil 5752ad0
       /* A thread ID of zero means that this is the main thread, but
Jan Kratochvil 5752ad0
 	 glibc has not yet initialized thread-local storage and the
Jan Kratochvil 5752ad0
@@ -1347,10 +1347,13 @@ find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
Jan Kratochvil 5752ad0
 	 need this glibc bug workaround.  */
Jan Kratochvil 5752ad0
       info->need_stale_parent_threads_check = 0;
Jan Kratochvil 5752ad0
 
Jan Kratochvil 5752ad0
-      err = info->td_thr_event_enable_p (th_p, 1);
Jan Kratochvil 5752ad0
-      if (err != TD_OK)
Jan Kratochvil 5752ad0
-	error (_("Cannot enable thread event reporting for LWP %d: %s"),
Jan Kratochvil 5752ad0
-	       (int) ti.ti_lid, thread_db_err_str (err));
Jan Kratochvil 5752ad0
+      if (target_has_execution)
Jan Kratochvil 5752ad0
+	{
Jan Kratochvil 5752ad0
+	  err = info->td_thr_event_enable_p (th_p, 1);
Jan Kratochvil 5752ad0
+	  if (err != TD_OK)
Jan Kratochvil 5752ad0
+	    error (_("Cannot enable thread event reporting for LWP %d: %s"),
Jan Kratochvil 5752ad0
+		   (int) ti.ti_lid, thread_db_err_str (err));
Jan Kratochvil 5752ad0
+	}
Jan Kratochvil 5752ad0
 
Jan Kratochvil 5752ad0
       return 0;
Jan Kratochvil 5752ad0
     }
Jan Kratochvil 5752ad0
--- a/gdb/testsuite/gdb.threads/gcore-thread.exp
Jan Kratochvil 5752ad0
+++ b/gdb/testsuite/gdb.threads/gcore-thread.exp
Jan Kratochvil 5752ad0
@@ -26,6 +26,7 @@ set testfile "gcore-thread"
Jan Kratochvil 5752ad0
 set srcfile  pthreads.c
Jan Kratochvil 5752ad0
 set binfile  ${objdir}/${subdir}/${testfile}
Jan Kratochvil 5752ad0
 set corefile ${objdir}/${subdir}/${testfile}.test
Jan Kratochvil 5752ad0
+set core0file ${objdir}/${subdir}/${testfile}0.test
Jan Kratochvil 5752ad0
 
Jan Kratochvil 5752ad0
 if [istarget "*-*-linux"] then {
Jan Kratochvil 5752ad0
     set target_cflags "-D_MIT_POSIX_THREADS"
Jan Kratochvil 5752ad0
@@ -110,6 +111,29 @@ if {!$core_supported} {
Jan Kratochvil 5752ad0
 }
Jan Kratochvil 5752ad0
 
Jan Kratochvil 5752ad0
 
Jan Kratochvil 5752ad0
+# Test the uninitialized thread list.
Jan Kratochvil 5752ad0
+# Provide the case of glibc td_thr_get_info handling of:
Jan Kratochvil 5752ad0
+# /* Special case for the main thread before initialization.  */
Jan Kratochvil 5752ad0
+
Jan Kratochvil 5752ad0
+foreach symbol {__stack_user stack_used} {
Jan Kratochvil 5752ad0
+    set test "clear ${symbol}.next"
Jan Kratochvil 5752ad0
+    gdb_test_multiple "p *(void **) &${symbol} = 0" $test {
Jan Kratochvil 5752ad0
+	-re " = \\(void \\*\\) 0x0\r\n$gdb_prompt $" {
Jan Kratochvil 5752ad0
+	    pass $test
Jan Kratochvil 5752ad0
+	}
Jan Kratochvil 5752ad0
+	-re "No symbol \"${symbol}\" in current context\\.\r\n$gdb_prompt $" {
Jan Kratochvil 5752ad0
+	    xfail $test
Jan Kratochvil 5752ad0
+	    # Do not do the verification.
Jan Kratochvil 5752ad0
+	    set core0file ""
Jan Kratochvil 5752ad0
+	}
Jan Kratochvil 5752ad0
+    }
Jan Kratochvil 5752ad0
+}
Jan Kratochvil 5752ad0
+
Jan Kratochvil 5752ad0
+if {"$core0file" != ""} {
Jan Kratochvil 5752ad0
+    gdb_test "gcore $core0file" "Saved corefile .*" "save a zeroed-threads corefile"
Jan Kratochvil 5752ad0
+}
Jan Kratochvil 5752ad0
+
Jan Kratochvil 5752ad0
+
Jan Kratochvil 5752ad0
 # Now restart gdb and load the corefile.
Jan Kratochvil 5752ad0
 clean_restart ${testfile}
Jan Kratochvil 5752ad0
 
Jan Kratochvil 5752ad0
@@ -160,3 +184,11 @@ gdb_test "info threads" ".* thread2 .*" \
Jan Kratochvil 5752ad0
 
Jan Kratochvil 5752ad0
 gdb_test "info threads" ".*${nl}\\* ${horiz} thread2 .*" \
Jan Kratochvil 5752ad0
 	"thread2 is current thread in corefile"
Jan Kratochvil 5752ad0
+
Jan Kratochvil 5752ad0
+
Jan Kratochvil 5752ad0
+# Test the uninitialized thread list.
Jan Kratochvil 5752ad0
+
Jan Kratochvil 5752ad0
+if {"$core0file" != "" && [load_core $core0file]} {
Jan Kratochvil 5752ad0
+
Jan Kratochvil 5752ad0
+    gdb_test "info threads" "Cannot find new threads: .*" "zeroed-threads cannot be listed"
Jan Kratochvil 5752ad0
+}
Jan Kratochvil 5752ad0