This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: gdb.objc/objcdecode.exp test error..


For the record, here is the patch that Matt sent me privately when
he realized he forgot to attach it.

-- 
Joel
>From ad407eb015bbdde409cbcdf98f116b9ea949644a Mon Sep 17 00:00:00 2001
From: Matt Rice <ratmice@gmail.com>
Date: Wed, 23 Sep 2009 22:48:41 -0700
Subject: [PATCH] New objc tests.

2009-09-23  Matt Rice  <ratmice@gmail.com>

	* gdb.objc/ambiguous.exp: New objc tests for 8343 with shared libs.
	* gdb.objc/ambiguous.m: New objc file.
	* gdb.objc/objcdecode.exp: Additional objc tests for 8343.
	* gdb.objc/objcdecode2.m: New objc file.
	* gdb.objc/objcdecode3.m: New objc file.
	* lib/gdb.exp (gdb_continue_to_breakpoint): Handle internal error.
---
 gdb/testsuite/gdb.objc/ambiguous.exp  |  119 +++++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.objc/ambiguous.m    |   35 ++++++++++
 gdb/testsuite/gdb.objc/objcdecode.exp |   43 ++++++++++--
 gdb/testsuite/gdb.objc/objcdecode2.m  |   20 ++++++
 gdb/testsuite/gdb.objc/objcdecode3.m  |   19 +++++
 gdb/testsuite/lib/gdb.exp             |    5 ++
 6 files changed, 233 insertions(+), 8 deletions(-)
 create mode 100644 gdb/testsuite/gdb.objc/ambiguous.exp
 create mode 100644 gdb/testsuite/gdb.objc/ambiguous.m
 create mode 100644 gdb/testsuite/gdb.objc/objcdecode2.m
 create mode 100644 gdb/testsuite/gdb.objc/objcdecode3.m

diff --git a/gdb/testsuite/gdb.objc/ambiguous.exp b/gdb/testsuite/gdb.objc/ambiguous.exp
new file mode 100644
index 0000000..aefc7f7
--- /dev/null
+++ b/gdb/testsuite/gdb.objc/ambiguous.exp
@@ -0,0 +1,119 @@
+# Copyright 2009 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file tests breakpoints on ambiguous expressions in C and Obj-C symbols
+# And their affects across shared libraries.
+
+# This file was written by Matt Rice (ratmice@gmail.com)
+
+if $tracelevel then {
+	strace $tracelevel
+}
+
+proc gdb_reinitialize {} {
+    global prms_id
+    global bug_id
+    global subdir
+    global srcdir
+    global binfile
+
+    set prms_id 0
+    set bug_id 0
+
+    # Start with a fresh gdb.
+
+    gdb_exit
+    gdb_start
+    gdb_reinitialize_dir $srcdir/$subdir
+    gdb_load $binfile
+
+}
+
+set testfile "objcdecode2"
+set srcfile ${testfile}.m
+set binfile ${objdir}/${subdir}/lib${testfile}.so
+set lib_flags [list debug additional_flags=[list -g -fPIC -I${srcdir}/${subdir}] ]
+
+if {[gdb_compile_shlib "${srcdir}/${subdir}/${srcfile}" "${binfile}" $lib_flags] != "" } {
+  return -1
+}
+
+set testfile "objcdecode3"
+set srcfile ${testfile}.m
+set binfile ${objdir}/${subdir}/lib${testfile}.so
+set decode3_binfile $binfile
+
+if {[gdb_compile_shlib "${srcdir}/${subdir}/${srcfile}" "${binfile}" $lib_flags] != "" } {
+  return -1
+}
+
+
+set testfile "ambiguous"
+set srcfile ${testfile}.m
+set binfile ${objdir}/${subdir}/${testfile}
+set ambig_opts [list debug additional_flags=[list -g \
+ -DSHLIB_NAME=\"$decode3_binfile\" \
+ -L${objdir}/${subdir} \
+ -Wl,-rpath,${objdir}/${subdir} \
+ -ldl -lobjcdecode2 \
+ -I${srcdir}/${subdir}] ]
+
+if {[gdb_compile_objc "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ${ambig_opts}] != "" } {
+  return -1
+}
+
+gdb_reinitialize
+
+set name "setup ambiguous expression"
+gdb_test "break foo" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*" $name
+
+gdb_run_cmd
+set name "loading shlib with breakpoint on ambiguous expr"
+setup_kfail "*-*-*" gdb/8343
+gdb_test "" "Breakpoint \[0-9\]+, foo \\\(\\\) at .*" $name
+
+set name "breakpoint on ambiguous objc method after shlib" 
+gdb_test "break foo" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*\r\nBreakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*" $name
+
+gdb_continue_to_breakpoint "foo class implementation"
+
+gdb_reinitialize
+
+gdb_test "set breakpoint pending on" "" 
+gdb_test "break -\[DecodeShlib bar\]" ".*not defined.*"
+
+gdb_test "run" \
+"Breakpoint \[0-9\]+, -\\\[DecodeShlib bar\\\] \\\(.*\\\) at .*" \
+"break on bar class implementation"
+
+setup_kfail "*-*-*" gdb/8343
+gdb_continue_to_breakpoint "bar category implementation"
+
+# i'm not sure why this reacts differently than the above tests
+# using pending breakpoints but it does: therefore i've added it
+# even though they appear quite similar.
+gdb_reinitialize
+
+if ![runto_main] {
+  fail "unable to run to main"
+}
+
+gdb_test "break bar" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*" $name
+
+gdb_continue_to_breakpoint "bar class implementation"
+setup_kfail "*-*-*" gdb/8343
+gdb_continue_to_breakpoint "bar category implementation"
+
+return 0
diff --git a/gdb/testsuite/gdb.objc/ambiguous.m b/gdb/testsuite/gdb.objc/ambiguous.m
new file mode 100644
index 0000000..fb59919
--- /dev/null
+++ b/gdb/testsuite/gdb.objc/ambiguous.m
@@ -0,0 +1,35 @@
+#include <objcdecode2.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __WIN32__
+#include <windows.h>
+#define dlopen(name, mode) LoadLibrary (name)
+#define dlerror() "an error occurred"
+#else
+#include <dlfcn.h>
+#endif
+
+void foo()
+{
+  printf("function implementation\n");
+}
+
+int main()
+{
+  void *handle;
+  id obj = [DecodeShlib new];
+
+  foo();
+  [obj foo];
+
+  [obj bar]; /* class implementation */
+
+  handle = dlopen(SHLIB_NAME, RTLD_LAZY);
+  if (!handle)
+    fprintf(stderr, "error calling dlopen: %s\n", dlerror());
+
+  [obj foo]; /* category implementation */
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.objc/objcdecode.exp b/gdb/testsuite/gdb.objc/objcdecode.exp
index b751fb9..317f050 100644
--- a/gdb/testsuite/gdb.objc/objcdecode.exp
+++ b/gdb/testsuite/gdb.objc/objcdecode.exp
@@ -33,14 +33,12 @@ if {[gdb_compile_objc "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [
   return -1
 }
 
-proc do_objc_tests {} {
+proc gdb_reinitialize {} {
     global prms_id
     global bug_id
     global subdir
-    global objdir
     global srcdir
     global binfile
-    global gdb_prompt
 
     set prms_id 0
     set bug_id 0
@@ -54,12 +52,13 @@ proc do_objc_tests {} {
 
 }
 
-do_objc_tests
+gdb_reinitialize
 
 #
 # Break on multiply defined method (PR objc/1236)
 #
-set name "break on multiply defined method"
+set name "break on multiply defined method using multiple-symbols ask"
+gdb_test "set multiple-symbols ask" ""
 gdb_test_multiple "break multipleDef" $name \
 {
     -re "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] -.Decode multipleDef. at .*\r\n\\\[3\\\] multipleDef at .*\r\n> $" {
@@ -67,10 +66,10 @@ gdb_test_multiple "break multipleDef" $name \
 	exp_continue
     }
     -re "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*\r\n$gdb_prompt $" { pass $name }
-    -re ".*$gdb_prompt $"   { kfail "gdb/1236" $name }
+    -re ".*$gdb_prompt $"   { kfail "gdb/8343" $name }
 }
 
-set name "continue after break on multiply defined symbol"
+set name "run after setting breakpoints on multiply defined symbol"
 gdb_run_cmd
 gdb_test_multiple "" $name \
 {
@@ -79,8 +78,36 @@ gdb_test_multiple "" $name \
     }
     -re "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] -.Decode multipleDef. at .*\r\n\\\[3\\\] multipleDef at .*\r\n> $" {
 	send_gdb "0\n"
-	kfail "gdb/1238" $name
+	kfail "gdb/8343" $name
 	# gdb is in a bad state here.
 	# It would be difficult to do any more tests after this.
     }
 }
+
+gdb_reinitialize
+if ![runto_main] { fail "Can't run to main" }
+
+gdb_test "set multiple-symbols all" ".*" "setup multiple-symbols all"
+gdb_test "break multipleDef" \
+"Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*\r\nBreakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*" \
+"break on multiply defined symbol with multiple-symbols all after main"
+
+set name "can hit multiply defined breakpoint on function after main"
+gdb_continue_to_breakpoint "function multipleDef"
+
+set name "can hit multiply defined breakpoint on objc method after main"
+gdb_continue_to_breakpoint "method multipleDef"
+
+gdb_reinitialize
+
+gdb_test "break multipleDef" \
+"Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*\r\nBreakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*" \
+"break on multiply defined symbol with multiple-symbols all before main"
+
+setup_kfail "*-*-*" gdb/8343
+gdb_run_cmd
+gdb_test "" \
+"Breakpoint \[0-9\]+, multipleDef \\\(\\\) at .*" \
+"can hit multiply defined breakpoint on function before main"
+
+gdb_continue_to_breakpoint "can hit multiply defined breakpoint on method before main"
diff --git a/gdb/testsuite/gdb.objc/objcdecode2.m b/gdb/testsuite/gdb.objc/objcdecode2.m
new file mode 100644
index 0000000..4860c54
--- /dev/null
+++ b/gdb/testsuite/gdb.objc/objcdecode2.m
@@ -0,0 +1,20 @@
+#include <objcdecode2.h>
+#include <stdio.h>
+
+@implementation DecodeShlib
+
+- foo 
+{
+  printf("foo class implementation\n");
+}
+
+- bar 
+{
+  printf("bar class implementation\n");
+}
+
+- (const char *) myDescription
+{
+  return "DecodeShlib gdb test object";
+}
+@end
diff --git a/gdb/testsuite/gdb.objc/objcdecode3.m b/gdb/testsuite/gdb.objc/objcdecode3.m
new file mode 100644
index 0000000..97f6e4f
--- /dev/null
+++ b/gdb/testsuite/gdb.objc/objcdecode3.m
@@ -0,0 +1,19 @@
+#include <objcdecode2.h>
+#include <stdio.h>
+
+@interface DecodeShlib(CategoryInShlib)
+@end
+
+@implementation DecodeShlib(CategoryInShlib)
+
+- foo 
+{
+  printf("foo category implementation\n");
+}
+
+- bar 
+{
+  printf("bar category implementation\n");
+}
+
+@end
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 0c93a73..4f33486 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -474,6 +474,11 @@ proc gdb_continue_to_breakpoint {name {location_pattern .*}} {
 	-re ".*$gdb_prompt $" {
 	    fail $full_name
 	}
+        -re ".*A problem internal to GDB has been detected" {
+             fail "$full_name (GDB internal error)"
+             gdb_internal_error_resync
+	}
+
 	timeout { 
 	    fail "$full_name (timeout)"
 	}
-- 
1.6.2.5


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]