gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Sun, 17 Apr 2011 19:11:07 +0000 (19:11 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Sun, 17 Apr 2011 19:11:07 +0000 (19:11 +0000)
* linux-thread-db.c (find_new_threads_callback): Exit on zero TI_TID
even if !TARGET_HAS_EXECUTION.

gdb/testsuite/
* gdb.threads/gcore-thread.exp ($core0file): New variable.
(clear __stack_user.next, clear stack_used.next)
(save a zeroed-threads corefile): New test.
Call core_load for $core0file.
(zeroed-threads cannot be listed): New test.

gdb/ChangeLog
gdb/linux-thread-db.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.threads/gcore-thread.exp

index 5c06df203f1bb85d7b70302930e01ffefe25843f..492082b61633312d38aee4ace0026bfa8405fcd0 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * linux-thread-db.c (find_new_threads_callback): Exit on zero TI_TID
+       even if !TARGET_HAS_EXECUTION.
+
 2011-04-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix convert_code_addr_to_desc_addr for ppc64 files after eu-strip.
index 005a34a60b13d81897aea76c7fad834908373593..2700a65865e44962f6c2535d1d0c2f9417829505 100644 (file)
@@ -1335,7 +1335,7 @@ find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
   if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
     return 0;                  /* A zombie -- ignore.  */
 
-  if (ti.ti_tid == 0 && target_has_execution)
+  if (ti.ti_tid == 0)
     {
       /* A thread ID of zero means that this is the main thread, but
         glibc has not yet initialized thread-local storage and the
@@ -1347,10 +1347,13 @@ find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
         need this glibc bug workaround.  */
       info->need_stale_parent_threads_check = 0;
 
-      err = info->td_thr_event_enable_p (th_p, 1);
-      if (err != TD_OK)
-       error (_("Cannot enable thread event reporting for LWP %d: %s"),
-              (int) ti.ti_lid, thread_db_err_str (err));
+      if (target_has_execution)
+       {
+         err = info->td_thr_event_enable_p (th_p, 1);
+         if (err != TD_OK)
+           error (_("Cannot enable thread event reporting for LWP %d: %s"),
+                  (int) ti.ti_lid, thread_db_err_str (err));
+       }
 
       return 0;
     }
index b0fd5af856bb60f5fbc301b7b8801c410ca671bd..6a0d0976d5e7f11a422ed8ed5b22fc9d5ef1205c 100644 (file)
@@ -1,3 +1,11 @@
+2011-04-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.threads/gcore-thread.exp ($core0file): New variable.
+       (clear __stack_user.next, clear stack_used.next)
+       (save a zeroed-threads corefile): New test.
+       Call core_load for $core0file.
+       (zeroed-threads cannot be listed): New test.
+
 2011-04-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.threads/gcore-thread.exp ($testfile): Match it the .exp
index fa460bb603b4f2dd9feab24ea96b23f89c58b2b3..a072a6bb2f9b18bd6dba66208519ff2ecec7f144 100644 (file)
@@ -26,6 +26,7 @@ set testfile "gcore-thread"
 set srcfile  pthreads.c
 set binfile  ${objdir}/${subdir}/${testfile}
 set corefile ${objdir}/${subdir}/${testfile}.test
+set core0file ${objdir}/${subdir}/${testfile}0.test
 
 if [istarget "*-*-linux"] then {
     set target_cflags "-D_MIT_POSIX_THREADS"
@@ -110,6 +111,29 @@ if {!$core_supported} {
 }
 
 
+# Test the uninitialized thread list.
+# Provide the case of glibc td_thr_get_info handling of:
+# /* Special case for the main thread before initialization.  */
+
+foreach symbol {__stack_user stack_used} {
+    set test "clear ${symbol}.next"
+    gdb_test_multiple "p *(void **) &${symbol} = 0" $test {
+       -re " = \\(void \\*\\) 0x0\r\n$gdb_prompt $" {
+           pass $test
+       }
+       -re "No symbol \"${symbol}\" in current context\\.\r\n$gdb_prompt $" {
+           xfail $test
+           # Do not do the verification.
+           set core0file ""
+       }
+    }
+}
+
+if {"$core0file" != ""} {
+    gdb_test "gcore $core0file" "Saved corefile .*" "save a zeroed-threads corefile"
+}
+
+
 # Now restart gdb and load the corefile.
 clean_restart ${testfile}
 
@@ -160,3 +184,11 @@ gdb_test "info threads" ".* thread2 .*" \
 
 gdb_test "info threads" ".*${nl}\\* ${horiz} thread2 .*" \
        "thread2 is current thread in corefile"
+
+
+# Test the uninitialized thread list.
+
+if {"$core0file" != "" && [load_core $core0file]} {
+
+    gdb_test "info threads" "Cannot find new threads: .*" "zeroed-threads cannot be listed"
+}