From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1301 invoked by alias); 13 Dec 2013 23:06:00 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 1291 invoked by uid 89); 13 Dec 2013 23:05:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.6 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 13 Dec 2013 23:05:58 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rBDN5uAR013361 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 13 Dec 2013 18:05:56 -0500 Received: from psique (ovpn-113-60.phx2.redhat.com [10.3.113.60]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id rBDN5q61010732 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 13 Dec 2013 18:05:54 -0500 From: Sergio Durigan Junior To: GDB Patches Subject: [PATCH] Improve and fix catch-syscall.exp X-URL: http://www.redhat.com Date: Fri, 13 Dec 2013 23:06:00 -0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2013-12/txt/msg00551.txt.bz2 Hi, While fixing another bug, I found that the current gdb.base/catch-syscall.exp is kind of messy, could use some improvements, and is not correctly testing some things. I've made the following patch to address all the issues I found. On the organization side, it does a cleanup and removes unecessary imports of gdb_prompt, uses prepare_for_testing and clean_restart where needed, and fixes some comments. The testcase was also not correctly testing catching syscalls using only numbers, or catching many syscalls at once. I fixed that. This is good because I will soon submit another patch to fix a bug on catch syscall which will make use of the new things I've added. I tested this on x86_64 Fedora 18, and I'm waiting for machines to test on PPC and ARM at least, but I checked the syscalls numbers on every architecture supported by the patch to make sure everything was OK. OK to apply? -- Sergio 2013-12-13 Sergio Durigan Junior * gdb.base/catch-syscall.exp: Remove check for "hppa*-hp-hpux*" target. Replace gdb_compile by prepare_for_testing. Call fill_all_syscalls_numbers before starting. Replace gdb_exit, gdb_start, gdb_reinitialize_dir and gdb_load by clean_restart. (check_info_bp_any_syscall, check_info_bp_specific_syscall) (check_info_bp_many_syscalls, check_call_to_syscall) (check_return_from_syscall, check_continue) (insert_catch_syscall_with_arg): Remove global gdb_prompt. (insert_catch_syscall_with_many_args): Likewise. Fix $filter_str. (check_for_program_end, test_catch_syscall_without_args) (test_catch_syscall_with_args, test_catch_syscall_with_many_args) (test_catch_syscall_with_wrong_args) (test_catch_syscall_restarting_inferior) (test_catch_syscall_fail_nodatadir, do_syscall_tests): Remove global gdb_prompt. (test_catch_syscall_without_args_noxml): Likewise. Add global last_syscall_number. Test for the exact syscall number to be caught. (test_catch_syscall_with_args_noxml): Remove global gdb_prompt. Add global all_syscalls_numbers. Test each syscall number to be caught, instead of only testing "close". (test_catch_syscall_with_wrong_args_noxml): Remove global gdb_prompt. (do_syscall_tests_without_xml): Likewise. Remove stale comment. (fill_all_syscalls_numbers): Add global last_syscall_number. Fill the correct syscall numbers according to each architecture. diff --git a/gdb/testsuite/gdb.base/catch-syscall.exp b/gdb/testsuite/gdb.base/catch-syscall.exp index 7f1bd29..172890c 100644 --- a/gdb/testsuite/gdb.base/catch-syscall.exp +++ b/gdb/testsuite/gdb.base/catch-syscall.exp @@ -24,7 +24,7 @@ if { [is_remote target] || ![isnative] } then { } # Until "catch syscall" is implemented on other targets... -if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then { +if { ![istarget "*-linux*"] } { continue } @@ -40,26 +40,26 @@ if { ![istarget "x86_64-*-linux*"] && ![istarget "i\[34567\]86-*-linux*"] standard_testfile +if { [prepare_for_testing ${testfile}.exp $testfile ${testfile}.c] } { + untested catch-syscall.exp + return -1 +} + # All (but the last) syscalls from the example code # They are ordered according to the file, so do not change this. set all_syscalls { "close" "chroot" } set all_syscalls_numbers { } + # The last syscall (exit()) does not return, so # we cannot expect the catchpoint to be triggered # twice. It is a special case. set last_syscall "exit_group" - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { - untested catch-syscall.exp - return -1 -} +set last_syscall_number { } # Internal procedure used to check if, after issuing a 'catch syscall' # command (without arguments), the 'info breakpoints' command displays # that '"any syscall"' is to be caught. proc check_info_bp_any_syscall {} { - global gdb_prompt - # Verifying that the catchpoint appears in the 'info breakpoints' # command, but with "". set thistest "catch syscall appears in 'info breakpoints'" @@ -70,8 +70,6 @@ proc check_info_bp_any_syscall {} { # command (with arguments), the 'info breakpoints' command displays # that the syscall 'X' is to be caught. proc check_info_bp_specific_syscall { syscall } { - global gdb_prompt - set thistest "syscall(s) $syscall appears in 'info breakpoints'" gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscall(\[(\]s\[)\])? (.)?${syscall}(.)?.*" $thistest } @@ -80,7 +78,6 @@ proc check_info_bp_specific_syscall { syscall } { # command (with many arguments), the 'info breakpoints' command displays # that the syscalls 'X' are to be caught. proc check_info_bp_many_syscalls { syscalls } { - global gdb_prompt set filter_str "" foreach name $syscalls { @@ -95,16 +92,12 @@ proc check_info_bp_many_syscalls { syscalls } { # This procedure checks if there was a call to a syscall. proc check_call_to_syscall { syscall } { - global gdb_prompt - set thistest "program has called $syscall" gdb_test "continue" "Catchpoint .*(call to syscall .?${syscall}.?).*" $thistest } # This procedure checks if the syscall returned. proc check_return_from_syscall { syscall } { - global gdb_prompt - set thistest "syscall $syscall has returned" gdb_test "continue" "Catchpoint .*(returned from syscall (.)?${syscall}(.)?).*" $thistest } @@ -112,8 +105,6 @@ proc check_return_from_syscall { syscall } { # Internal procedure that performs two 'continue' commands and checks if # a syscall call AND return occur. proc check_continue { syscall } { - global gdb_prompt - # Testing if the 'continue' stops at the # specified syscall_name. If it does, then it should # first print that the infeior has called the syscall, @@ -127,8 +118,6 @@ proc check_continue { syscall } { # Inserts a syscall catchpoint with an argument. proc insert_catch_syscall_with_arg { syscall } { - global gdb_prompt - # Trying to set the catchpoint set thistest "catch syscall with arguments ($syscall)" gdb_test "catch syscall $syscall" "Catchpoint .*(syscall (.)?${syscall}(.)?( \[\[0-9\]+\])?).*" $thistest @@ -138,12 +127,11 @@ proc insert_catch_syscall_with_arg { syscall } { # Inserts a syscall catchpoint with many arguments. proc insert_catch_syscall_with_many_args { syscalls numbers } { - global gdb_prompt set catch [ join $syscalls " " ] set filter_str "" foreach name $syscalls number $numbers { - set filter_str "${filter_str}'${name}' \[${number}\] " + set filter_str "${filter_str}'${name}' \\\[${number}\\\] " } set filter_str [ string trimright $filter_str " " ] @@ -156,8 +144,6 @@ proc insert_catch_syscall_with_many_args { syscalls numbers } { } proc check_for_program_end {} { - global gdb_prompt - # Deleting the catchpoints delete_breakpoints @@ -166,7 +152,7 @@ proc check_for_program_end {} { } proc test_catch_syscall_without_args {} { - global gdb_prompt all_syscalls last_syscall + global all_syscalls last_syscall with_test_prefix "without arguments" { # Trying to set the syscall. @@ -190,8 +176,6 @@ proc test_catch_syscall_without_args {} { proc test_catch_syscall_with_args {} { with_test_prefix "with arguments" { - global gdb_prompt - set syscall_name "close" insert_catch_syscall_with_arg $syscall_name @@ -205,7 +189,7 @@ proc test_catch_syscall_with_args {} { proc test_catch_syscall_with_many_args {} { with_test_prefix "with many arguments" { - global gdb_prompt all_syscalls all_syscalls_numbers + global all_syscalls all_syscalls_numbers insert_catch_syscall_with_many_args $all_syscalls $all_syscalls_numbers @@ -221,8 +205,6 @@ proc test_catch_syscall_with_many_args {} { proc test_catch_syscall_with_wrong_args {} { with_test_prefix "wrong args" { - global gdb_prompt - # mlock is not called from the source set syscall_name "mlock" insert_catch_syscall_with_arg $syscall_name @@ -237,8 +219,6 @@ proc test_catch_syscall_with_wrong_args {} { proc test_catch_syscall_restarting_inferior {} { with_test_prefix "restarting inferior" { - global gdb_prompt - set syscall_name "chroot" with_test_prefix "entry" { @@ -263,8 +243,6 @@ proc test_catch_syscall_restarting_inferior {} { proc test_catch_syscall_fail_nodatadir {} { with_test_prefix "fail no datadir" { - global gdb_prompt - # Sanitizing. delete_breakpoints @@ -289,8 +267,6 @@ proc test_catch_syscall_fail_nodatadir {} { } proc do_syscall_tests {} { - global gdb_prompt srcdir - # NOTE: We don't have to point gdb at the correct data-directory. # For the build tree that is handled by INTERNAL_GDBFLAGS. @@ -332,7 +308,7 @@ proc test_catch_syscall_without_args_noxml {} { with_test_prefix "without args noxml" { # We will need the syscall names even not using it because we # need to know know many syscalls are in the example file. - global gdb_prompt all_syscalls last_syscall + global all_syscalls last_syscall_number all_syscalls_numbers delete_breakpoints @@ -340,19 +316,15 @@ proc test_catch_syscall_without_args_noxml {} { # Now, we should be able to set a catchpoint, and GDB shall # not display the warning anymore. - foreach name $all_syscalls { - # Unfortunately, we don't know the syscall number that - # will be caught because this information is - # arch-dependent. Thus, we try to catch anything similar - # to a number. + foreach name $all_syscalls number $all_syscalls_numbers { with_test_prefix "$name" { - check_continue "\[0-9\]*" + check_continue $number } } # At last but not least, we check if the inferior has called # the last (exit) syscall. - check_call_to_syscall "\[0-9\]*" + check_call_to_syscall $last_syscall_number delete_breakpoints } @@ -360,25 +332,19 @@ proc test_catch_syscall_without_args_noxml {} { proc test_catch_syscall_with_args_noxml {} { with_test_prefix "with args noxml" { - global gdb_prompt - - # The number of the "close" syscall. This is our option for a - # "long-estabilished" syscall in all Linux architectures, but - # unfortunately x86_64 and a few other platforms don't "follow - # the convention". Because of this, we need this ugly check - # :-(. - set close_number "" - if { [istarget "x86_64-*-linux*"] } { - set close_number "3" - } else { - set close_number "6" - } + global all_syscalls_numbers delete_breakpoints - insert_catch_syscall_with_arg $close_number + # Inserting all syscalls numbers to be caught + foreach syscall_number $all_syscalls_numbers { + insert_catch_syscall_with_arg $syscall_number + } - check_continue $close_number + # Checking that all syscalls are caught. + foreach syscall_number $all_syscalls_numbers { + check_continue $syscall_number + } delete_breakpoints } @@ -386,8 +352,6 @@ proc test_catch_syscall_with_args_noxml {} { proc test_catch_syscall_with_wrong_args_noxml {} { with_test_prefix "with wrong args noxml" { - global gdb_prompt - delete_breakpoints # Even without XML support, GDB should not accept unknown @@ -400,8 +364,6 @@ proc test_catch_syscall_with_wrong_args_noxml {} { } proc do_syscall_tests_without_xml {} { - global gdb_prompt srcdir - # Make sure GDB doesn't load the syscalls xml from the system data # directory. gdb_test_no_output "set data-directory /the/path/to/nowhere" @@ -413,12 +375,6 @@ proc do_syscall_tests_without_xml {} { # The only valid argument "catch syscall" should accept is the # syscall number, and not the name (since it can't translate a # name to a number). - # - # It's worth mentioning that we only try to catch the syscall - # close(). This is because the syscall number is an arch-dependent - # information, so we can't assume that we know every syscall number - # in this system. Therefore, we have decided to use a "long-estabilished" - # system call, and close() just sounded the right choice :-). if [runto_main] then { test_catch_syscall_with_args_noxml } # Now, we'll try to provide a syscall name (valid or not) to the command, @@ -428,47 +384,58 @@ proc do_syscall_tests_without_xml {} { # This procedure fills the vector "all_syscalls_numbers" with the proper # numbers for the used syscalls according to the architecture. +# +# These numbers were taken from the respective files +# from each architecture. proc fill_all_syscalls_numbers {} { - global all_syscalls_numbers + global all_syscalls_numbers last_syscall_number # For Linux on x86, PPC, PPC64, SPARC, SPARC64 and ARM, # the numbers for the syscalls "close" and "chroot" are the same. - if { [istarget "i\[34567\]86-*-linux*"] - || [istarget "powerpc-*-linux*"] || [istarget "powerpc64-*-linux*"] - || [istarget "sparc-*-linux*"] || [istarget "sparc64-*-linux*"] - || [istarget "arm*-linux*"] } { - set all_syscalls_numbers { "6" "61" } + # For x86_64, the numbers differ. + if { [istarget "x86_64-*-linux*"] } { + set all_syscalls_numbers { "3" "161" } + set last_syscall_number "231" + } elseif { [istarget "i\[34567\]86-*-linux*"] + || [istarget "powerpc-*-linux*"] + || [istarget "powerpc64-*-linux*"] + || [istarget "sparc-*-linux*"] + || [istarget "sparc64-*-linux*"] + || [istarget "arm*-linux*"] } { + set all_syscalls_numbers { "6" "61" } } -} -# Start with a fresh gdb + #Now, filling the last_syscall_number. It is the "exit_group" syscall. + if { [istarget "arm*-linux*"] } { + set last_syscall_number "248" + } elseif { [istarget "powerpc64-*-linux*"] + || [istarget "powerpc64-*-linux*"] } { + set last_syscall_number "234" + } elseif { [istarget "sparc-*-linux*"] + || [istarget "sparc64-*-linux*"] } { + set last_syscall_number "188" + } elseif { [istarget "i\[34567\]86-*-linux*"] } { + set last_syscall_number "252" + } +} -gdb_exit -set do_xml_test ![gdb_skip_xml_test] -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} +# Filling all the syscalls numbers before starting anything. +fill_all_syscalls_numbers # Execute the tests, using XML support -if $do_xml_test { +if { ![gdb_skip_xml_test] } { + clean_restart $binfile do_syscall_tests # Now, we have to see if GDB displays a warning when we # don't set the data-directory but try to use catch syscall # anyway. For that, we must restart GDB first. - gdb_exit - gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load ${binfile} + clean_restart $binfile test_catch_syscall_fail_nodatadir } # Restart gdb - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} +clean_restart $binfile # Execute the tests, without XML support. In this case, GDB will # only display syscall numbers, and not syscall names.