* [RFA] Testcase for backtrace/1435
@ 2003-11-17 21:40 Mark Kettenis
2003-11-17 23:38 ` Daniel Jacobowitz
2003-11-21 17:51 ` David Carlton
0 siblings, 2 replies; 6+ messages in thread
From: Mark Kettenis @ 2003-11-17 21:40 UTC (permalink / raw)
To: gdb-patches
This adds a testcase for the patch I just submitted. This is
i386-specific, but I don't know how to trick GCC into putting two
functions right after oneother without using assembler.
OK to check this in?
Mark
Index: ChangeLog
from Mark Kettenis <kettenis@gnu.org>
* gdb.arch/i386-unwind.exp: New file.
* gdb.arch/i386-unwind.c: New file.
Index: gdb.arch/i386-unwind.exp
===================================================================
RCS file: gdb.arch/i386-unwind.exp
diff -N gdb.arch/i386-unwind.exp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gdb.arch/i386-unwind.exp 17 Nov 2003 21:38:21 -0000
@@ -0,0 +1,63 @@
+# Copyright 2003 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 2 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@gnu.org
+
+# This file is part of the gdb testsuite.
+
+if $tracelevel {
+ strace $tracelevel
+}
+
+# Test i386 unwinder.
+
+set prms_id 0
+set bug_id 0
+
+if ![istarget "i?86-*-*"] then {
+ verbose "Skipping i386 unwinder tests."
+ return
+}
+
+set testfile "i386-unwind"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+#
+# Run to `main' where we begin our tests.
+#
+
+if ![runto_main] then {
+ gdb_suppress_tests
+}
+
+# Testcase for backtrace/1435.
+
+gdb_test "continue" "Program received signal SIGTRAP.*" \
+ "continue past gdb1435"
+
+gdb_test "backtrace 10" \
+ "#1\[ \t]*$hex in gdb1435.*\r\n#2\[ \t\]*$hex in main.*" \
+ "backtrace past gdb1435"
Index: gdb.arch/i386-unwind.c
===================================================================
RCS file: gdb.arch/i386-unwind.c
diff -N gdb.arch/i386-unwind.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gdb.arch/i386-unwind.c 17 Nov 2003 21:38:21 -0000
@@ -0,0 +1,42 @@
+/* Unwinder test program.
+
+ Copyright 2003 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+void
+trap (void)
+{
+ asm ("int $0x03");
+}
+
+/* Make sure that main directly follows a function without an
+ epilogue. */
+
+asm(".text\n"
+ " .align 8\n"
+ " .globl gdb1435\n"
+ "gdb1435:\n"
+ " pushl %ebp\n"
+ " mov %esp, %ebp\n"
+ " call trap\n"
+ " .globl main\n"
+ "main:\n"
+ " pushl %ebp\n"
+ " mov %esp, %ebp\n"
+ " call gdb1435\n");
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [RFA] Testcase for backtrace/1435
2003-11-17 21:40 [RFA] Testcase for backtrace/1435 Mark Kettenis
@ 2003-11-17 23:38 ` Daniel Jacobowitz
2003-11-21 17:51 ` David Carlton
1 sibling, 0 replies; 6+ messages in thread
From: Daniel Jacobowitz @ 2003-11-17 23:38 UTC (permalink / raw)
To: gdb-patches
On Mon, Nov 17, 2003 at 10:40:29PM +0100, Mark Kettenis wrote:
> This adds a testcase for the patch I just submitted. This is
> i386-specific, but I don't know how to trick GCC into putting two
> functions right after oneother without using assembler.
>
> OK to check this in?
Definitely. Global maintainers don't need approval to add tests to
gdb.arch - and it looks correct, too.
>
> Mark
>
>
> Index: ChangeLog
> from Mark Kettenis <kettenis@gnu.org>
>
> * gdb.arch/i386-unwind.exp: New file.
> * gdb.arch/i386-unwind.c: New file.
>
> Index: gdb.arch/i386-unwind.exp
> ===================================================================
> RCS file: gdb.arch/i386-unwind.exp
> diff -N gdb.arch/i386-unwind.exp
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ gdb.arch/i386-unwind.exp 17 Nov 2003 21:38:21 -0000
> @@ -0,0 +1,63 @@
> +# Copyright 2003 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 2 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, write to the Free Software
> +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
> +
> +# Please email any bugs, comments, and/or additions to this file to:
> +# bug-gdb@gnu.org
> +
> +# This file is part of the gdb testsuite.
> +
> +if $tracelevel {
> + strace $tracelevel
> +}
> +
> +# Test i386 unwinder.
> +
> +set prms_id 0
> +set bug_id 0
> +
> +if ![istarget "i?86-*-*"] then {
> + verbose "Skipping i386 unwinder tests."
> + return
> +}
> +
> +set testfile "i386-unwind"
> +set srcfile ${testfile}.c
> +set binfile ${objdir}/${subdir}/${testfile}
> +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
> + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
> +}
> +
> +gdb_exit
> +gdb_start
> +gdb_reinitialize_dir $srcdir/$subdir
> +gdb_load ${binfile}
> +
> +#
> +# Run to `main' where we begin our tests.
> +#
> +
> +if ![runto_main] then {
> + gdb_suppress_tests
> +}
> +
> +# Testcase for backtrace/1435.
> +
> +gdb_test "continue" "Program received signal SIGTRAP.*" \
> + "continue past gdb1435"
> +
> +gdb_test "backtrace 10" \
> + "#1\[ \t]*$hex in gdb1435.*\r\n#2\[ \t\]*$hex in main.*" \
> + "backtrace past gdb1435"
> Index: gdb.arch/i386-unwind.c
> ===================================================================
> RCS file: gdb.arch/i386-unwind.c
> diff -N gdb.arch/i386-unwind.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ gdb.arch/i386-unwind.c 17 Nov 2003 21:38:21 -0000
> @@ -0,0 +1,42 @@
> +/* Unwinder test program.
> +
> + Copyright 2003 Free Software Foundation, Inc.
> +
> + This file is part of GDB.
> +
> + 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 2 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, write to the Free Software
> + Foundation, Inc., 59 Temple Place - Suite 330,
> + Boston, MA 02111-1307, USA. */
> +
> +void
> +trap (void)
> +{
> + asm ("int $0x03");
> +}
> +
> +/* Make sure that main directly follows a function without an
> + epilogue. */
> +
> +asm(".text\n"
> + " .align 8\n"
> + " .globl gdb1435\n"
> + "gdb1435:\n"
> + " pushl %ebp\n"
> + " mov %esp, %ebp\n"
> + " call trap\n"
> + " .globl main\n"
> + "main:\n"
> + " pushl %ebp\n"
> + " mov %esp, %ebp\n"
> + " call gdb1435\n");
>
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [RFA] Testcase for backtrace/1435
2003-11-17 21:40 [RFA] Testcase for backtrace/1435 Mark Kettenis
2003-11-17 23:38 ` Daniel Jacobowitz
@ 2003-11-21 17:51 ` David Carlton
1 sibling, 0 replies; 6+ messages in thread
From: David Carlton @ 2003-11-21 17:51 UTC (permalink / raw)
To: Mark Kettenis; +Cc: gdb-patches
On Mon, 17 Nov 2003 22:40:29 +0100 (CET), Mark Kettenis <kettenis@chello.nl> said:
> This adds a testcase for the patch I just submitted. This is
> i386-specific, but I don't know how to trick GCC into putting two
> functions right after oneother without using assembler.
I'm getting a FAIL while running to main (though the tests themselves
still execute and pass, which I don't quite understand). This is with
GCC 3.2 (more or less - Red Hat 8.0), i686-pc-linux-gnu, DWARF-2.
I'll include the gdb.log below.
David Carlton
carlton@kealia.com
Test Run By carlton on Fri Nov 21 09:44:32 2003
Native configuration is i686-pc-linux-gnu
=== gdb tests ===
Schedule of variations:
unix
Running target unix
Using /usr/local/share/dejagnu/baseboards/unix.exp as board description file for target.
Using /usr/local/share/dejagnu/config/unix.exp as generic interface file for target.
Using ./config/unix.exp as tool-and-target-specific interface file.
Running ./gdb.arch/i386-unwind.exp ...
Executing on host: gcc ./gdb.arch/i386-unwind.c -g -lm -o /gdb/mirror/src/gdb/testsuite/gdb.arch/i386-unwind (timeout = 300)
spawn gcc ./gdb.arch/i386-unwind.c -g -lm -o /gdb/mirror/src/gdb/testsuite/gdb.arch/i386-unwind
spawn /gdb/mirror/src/gdb/testsuite/../../gdb/gdb -nw -nx
GNU gdb 2003-11-21-cvs
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir ./gdb.arch
Source directories searched: /gdb/mirror/src/gdb/testsuite/./gdb.arch:$cdir:$cwd
(gdb) file /gdb/mirror/src/gdb/testsuite/gdb.arch/i386-unwind
Reading symbols from /gdb/mirror/src/gdb/testsuite/gdb.arch/i386-unwind...done.
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) delete breakpoints
(gdb) info breakpoints
No breakpoints or watchpoints.
(gdb) break main
Breakpoint 1 at 0x804832c: file gdb.arch/i386-unwind.c, line 26.
(gdb) run
Starting program: /gdb/mirror/src/gdb/testsuite/gdb.arch/i386-unwind
Program received signal SIGTRAP, Trace/breakpoint trap.
trap () at gdb.arch/i386-unwind.c:26
26 }
(gdb) FAIL: gdb.arch/i386-unwind.exp: running to main in runto
continue
Continuing.
Program received signal SIGTRAP, Trace/breakpoint trap.
trap () at gdb.arch/i386-unwind.c:26
26 }
(gdb) PASS: gdb.arch/i386-unwind.exp: continue past gdb1435
backtrace 10
#0 trap () at gdb.arch/i386-unwind.c:26
#1 0x08048338 in gdb1435 () at gdb.arch/i386-unwind.c:26
#2 0x08048340 in main () at gdb.arch/i386-unwind.c:26
(gdb) PASS: gdb.arch/i386-unwind.exp: backtrace past gdb1435
testcase ./gdb.arch/i386-unwind.exp completed in 1 seconds
=== gdb Summary ===
# of expected passes 2
# of unexpected failures 1
Executing on host: /gdb/mirror/src/gdb/testsuite/../../gdb/gdb -nw --command gdb_cmd (timeout = 300)
spawn /gdb/mirror/src/gdb/testsuite/../../gdb/gdb -nw --command gdb_cmd
GNU gdb 2003-11-21-cvs
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu".
/gdb/mirror/src/gdb/testsuite/../../gdb/gdb version 2003-11-21-cvs -nx
runtest completed at Fri Nov 21 09:44:33 2003
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFA] Testcase for backtrace/1435
@ 2003-11-22 20:17 Michael Elizabeth Chastain
2003-11-23 20:21 ` Mark Kettenis
0 siblings, 1 reply; 6+ messages in thread
From: Michael Elizabeth Chastain @ 2003-11-22 20:17 UTC (permalink / raw)
To: carlton, kettenis; +Cc: gdb-patches
I see the same FAIL that David Carlton is seeing. This happens with
dwarf-2 on all my versions of gcc and binutils. It doesn't happen
with stabs+.
The problem is with the dwarf-2 line table. Look at this gdb output:
(gdb) print &main
$1 = (<text variable, no debug info> *) 0x8048358 <main>
(gdb) break main
Breakpoint 1 at 0x804834c: file /berman/fsf/_today_/source/gdb/HEAD/src/gdb/testsuite/gdb.arch/i386-unwind.c, line 26.
0x804834c is a lot different from 0x8048358!
The source code is:
trap () { ... }
asm ( ... "gdb1435" ... )
asm ( ... "main" ... )
And the addresses in the executable file are:
(gdb) disass trap
Dump of assembler code for function trap:
0x08048348 <trap+0>: push %ebp
0x08048349 <trap+1>: mov %esp,%ebp
0x0804834b <trap+3>: int3
0x0804834c <trap+4>: pop %ebp
0x0804834d <trap+5>: ret
End of assembler dump.
(gdb) disass gdb1435
Dump of assembler code for function gdb1435:
0x08048350 <gdb1435+0>: push %ebp
0x08048351 <gdb1435+1>: mov %esp,%ebp
0x08048353 <gdb1435+3>: call 0x8048348 <trap>
End of assembler dump.
(gdb) disass main
Dump of assembler code for function main:
0x08048358 <main+0>: push %ebp
0x08048359 <main+1>: mov %esp,%ebp
0x0804835b <main+3>: call 0x8048350 <gdb1435>
End of assembler dump.
In the source code, line 26 is the closing brace of the "trap" function.
All the assembly code after that gets associated with this line!
"break main" calls find_pc_sect_line to map the address of "main"
onto a line number, comes up with 26, and sets the breakpoint on line 26.
I watched this happening by stepping through find_pc_sect_line.
"readelf -wl i386-unwind" gives this line table:
Line Number Statements:
Extended opcode 2: set Address to 0x8048348
Advance Line by 23 to 24
Copy
Special opcode 48: advance Address by 3 to 0x804834b and Line by 1 to 25
Special opcode 20: advance Address by 1 to 0x804834c and Line by 1 to 26
Advance PC by 20 to 8048360
Extended opcode 1: End of Sequence
In contrast, when I compile with -gstabs+ rather than -gdwarf-2, the
line table entry for line 26 ends at the end of the "trap" function like
it's supposed to. find_pc_sect_line sees that the pc for "main" is not
associated with any line and does not adjust it to the beginning of the
line.
This is a bug somewhere, but I don't know where:
It could be a bug in the test program i386-unwind.c. There's not
really a spec for how to write mixed C / assembly and have debugging
work. But i386-unwind.c is not that tricky.
It could be a bug in the gcc dwarf-2 writer. Look at the output
of "readelf -wl" and ask yourself if "Advance PC by 20 to 8048360"
is correct.
Or it could be a bug in gdb. I doubt this, because I bet that gdb
is just reading the line table that it's given.
I am going to file a gdb PR. If we decide that there is a gcc bug then
we can file a gcc PR. And, we can either change the test script or
KFAIL this test.
dc> (though the tests themselves still execute and pass,
dc> which I don't quite understand).
Well, the test script wants to do "break main; run" to get to "main"
and then "continue" to get to the "int $3" instruction. Instead,
"break main" gets set right after the "int $3", and then "run"
runs all the way to the "int $3". Then the "continue" hits the
same SIGTRAP again. It's really co-incidental that the target
program ends up at or near the right $PC.
Michael C
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [RFA] Testcase for backtrace/1435
@ 2003-11-23 21:57 Michael Elizabeth Chastain
0 siblings, 0 replies; 6+ messages in thread
From: Michael Elizabeth Chastain @ 2003-11-23 21:57 UTC (permalink / raw)
To: kettenis; +Cc: carlton, gdb-patches
I'm not sure if the symtab problem is a gdb problem, a gcc problem,
or just a problem with the way the source file was written.
So I'll just leave the PR open and someone can work on it in the future.
Michael C
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2003-11-23 21:57 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-17 21:40 [RFA] Testcase for backtrace/1435 Mark Kettenis
2003-11-17 23:38 ` Daniel Jacobowitz
2003-11-21 17:51 ` David Carlton
2003-11-22 20:17 Michael Elizabeth Chastain
2003-11-23 20:21 ` Mark Kettenis
2003-11-23 21:57 Michael Elizabeth Chastain
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox