From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31452 invoked by alias); 19 Feb 2013 18:42:40 -0000 Received: (qmail 31391 invoked by uid 22791); 19 Feb 2013 18:42:39 -0000 X-SWARE-Spam-Status: No, hits=-6.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_SPAMHAUS_DROP,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 19 Feb 2013 18:42:32 +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 r1JIgVTO016013 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 19 Feb 2013 13:42:31 -0500 Received: from host2.jankratochvil.net (ovpn-116-18.ams2.redhat.com [10.36.116.18]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r1JIgP01008990 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 19 Feb 2013 13:42:27 -0500 Date: Tue, 19 Feb 2013 18:42:00 -0000 From: Jan Kratochvil To: gdb-patches@sourceware.org Subject: [patch] Avoid false valgrind warnings on linux_ptrace_test_ret_to_nx Message-ID: <20130219184224.GA9706@host2.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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 X-SW-Source: 2013-02/txt/msg00513.txt.bz2 Hi, running "valgrind gdb ..." produces this false warning due to the Ubuntu kernel bug detection in GDB: ==6371== Process terminating with default action of signal 11 (SIGSEGV) ==6371== Bad permissions for mapped region at address 0x4032000 ==6371== at 0x4032000: ??? ==6371== by 0x603210: linux_ptrace_init_warnings (linux-ptrace.c:244) ==6371== by 0x5EF295: linux_child_post_startup_inferior (linux-nat.c:602) ==6371== by 0x5EDAE2: amd64_linux_child_post_startup_inferior (amd64-linux-nat.c:573) ==6371== by 0x5E9ACE: inf_ptrace_create_inferior (inf-ptrace.c:147) ==6371== by 0x5F0E35: linux_nat_create_inferior (linux-nat.c:1584) ==6371== by 0x76A330: find_default_create_inferior (target.c:3086) ==6371== by 0x7655C5: target_create_inferior (target.c:479) ==6371== by 0x71A7BA: run_command_1 (infcmd.c:594) ==6371== by 0x71A921: start_command (infcmd.c:649) ==6371== by 0x63184A: do_cfunc (cli-decode.c:113) ==6371== by 0x634930: cmd_func (cli-decode.c:1859) ==6371== by 0x83D673: execute_command (top.c:484) ==6371== by 0x739D70: catch_command_errors (exceptions.c:573) ==6371== by 0x73D612: captured_main (main.c:1009) ==6371== by 0x739C9E: catch_errors (exceptions.c:546) ==6371== by 0x73D6CF: gdb_main (main.c:1042) ==6371== by 0x48D6B5: main (gdb.c:34) warning: linux_ptrace_test_ret_to_nx: PC 0x3806e309 is neither near return address 0x4032000 nor is the return instruction 0x602e33! BTW that 0x3806e309 is in /usr/lib64/valgrind/memcheck-amd64-linux: Dump of assembler code for function do_syscall_WRK: 0x000000003806e2f0 <+0>: mov %rdi,%rax 0x000000003806e2f3 <+3>: mov %rsi,%rdi 0x000000003806e2f6 <+6>: mov %rdx,%rsi 0x000000003806e2f9 <+9>: mov %rcx,%rdx 0x000000003806e2fc <+12>: mov %r8,%r10 0x000000003806e2ff <+15>: mov %r9,%r8 0x000000003806e302 <+18>: mov 0x8(%rsp),%r9 0x000000003806e307 <+23>: syscall ----------------------------> 0x000000003806e309 <+25>: retq "Bad permissions for mapped region at address 0x4032000" is correct, this is a test by GDB in GDB's linux_ptrace_test_ret_to_nx. Therefore detect it and skip the test under valgrind. RUNNING_ON_VALGRIND is described here - as found by Pedro: http://valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.clientreq While they suggest You are encouraged to copy the valgrind/*.h headers into your project's include directory, so your program doesn't have a compile-time dependency on Valgrind being installed. I made a standard --with-X/--without-X external dependency as besides other reasons the valgrind.h file is 280KB and its stripping also would not be perfect as the macro depends on various arch-specific asm implementations. No regressions on {x86_64,x86_64-m32,i686}-fedora19pre-linux-gnu. Thanks, Jan gdb/ 2013-02-19 Jan Kratochvil * acinclude.m4: Include common/acinclude.m4. * common/acinclude.m4: New file. * common/linux-ptrace.c : Include valgrind/valgrind.h. (linux_ptrace_test_ret_to_nx) : Return. * config.in: Regenerate. * configure: Regenerate. * configure.ac: Call GDB_AC_CHECK_VALGRIND. gdb/gdbserver/ 2013-02-19 Jan Kratochvil * acinclude.m4: Include ../common/acinclude.m4. * config.in: Regenerate. * configure: Regenerate. * configure.ac: Call GDB_AC_CHECK_VALGRIND. diff --git a/gdb/acinclude.m4 b/gdb/acinclude.m4 index 25caddd..12da851 100644 --- a/gdb/acinclude.m4 +++ b/gdb/acinclude.m4 @@ -49,6 +49,8 @@ sinclude([../config/codeset.m4]) sinclude([../config/zlib.m4]) +sinclude([common/acinclude.m4]) + ## ----------------------------------------- ## ## ANSIfy the C compiler whenever possible. ## ## From Franc,ois Pinard ## diff --git a/gdb/common/acinclude.m4 b/gdb/common/acinclude.m4 new file mode 100644 index 0000000..a4d937d9 --- /dev/null +++ b/gdb/common/acinclude.m4 @@ -0,0 +1,43 @@ +# Copyright 2012 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 . + +dnl GDB_AC_CHECK_VALGRIND +dnl Check for HAVE_RUNNING_ON_VALGRIND. +dnl If such symbol is defined is also available. +AC_DEFUN([GDB_AC_CHECK_VALGRIND], [ + AC_ARG_WITH([valgrind], + [AS_HELP_STRING([--without-valgrind], + [do not include false valgrind warning message skip])],, + [with_valgrind=check]) + if test "$with_valgrind" != no; then + AC_MSG_CHECKING([for RUNNING_ON_VALGRIND macro]) + AC_CACHE_VAL(gdb_cv_check_running_on_valgrind, [ + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[#include ]], + [[return RUNNING_ON_VALGRIND;]])], + [gdb_cv_check_running_on_valgrind=yes], + [gdb_cv_check_running_on_valgrind=no])]) + AC_MSG_RESULT($gdb_cv_check_running_on_valgrind) + if test "$gdb_cv_check_running_on_valgrind" = yes; then + with_valgrind=yes + elif test "$with_valgrind" = yes; then + AC_ERROR([--with-valgrind was requested but it has not been found]) + fi + fi + if test "$with_valgrind" = yes; then + AC_DEFINE(HAVE_RUNNING_ON_VALGRIND, 1, + [Define if you have and RUNNING_ON_VALGRIND.]) + fi +]) diff --git a/gdb/common/linux-ptrace.c b/gdb/common/linux-ptrace.c index 886be80..e1bd5eb 100644 --- a/gdb/common/linux-ptrace.c +++ b/gdb/common/linux-ptrace.c @@ -29,6 +29,10 @@ #include "gdb_assert.h" #include "gdb_wait.h" +#ifdef HAVE_RUNNING_ON_VALGRIND +# include +#endif + /* Find all possible reasons we could fail to attach PID and append these newline terminated reason strings to initialized BUFFER. '\0' termination of BUFFER must be done by the caller. */ @@ -76,6 +80,11 @@ linux_ptrace_test_ret_to_nx (void) long l; int status; +#ifdef HAVE_RUNNING_ON_VALGRIND + if (HAVE_RUNNING_ON_VALGRIND) + return; +#endif + return_address = mmap (NULL, 2, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (return_address == MAP_FAILED) diff --git a/gdb/configure.ac b/gdb/configure.ac index e501766..a7bac76 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -1166,6 +1166,7 @@ AC_CHECK_FUNCS([canonicalize_file_name realpath getrusage getuid getgid \ ttrace wborder wresize setlocale iconvlist libiconvlist btowc \ setrlimit getrlimit posix_madvise waitpid lstat]) AM_LANGINFO_CODESET +GDB_AC_CHECK_VALGRIND # Check the return and argument types of ptrace. No canned test for # this, so roll our own. diff --git a/gdb/gdbserver/acinclude.m4 b/gdb/gdbserver/acinclude.m4 index 0e0bdc8..c5a93b7 100644 --- a/gdb/gdbserver/acinclude.m4 +++ b/gdb/gdbserver/acinclude.m4 @@ -12,6 +12,8 @@ sinclude(../../config/acx.m4) m4_include(../../config/depstand.m4) m4_include(../../config/lead-dot.m4) +sinclude([../common/acinclude.m4]) + dnl Check for existence of a type $1 in libthread_db.h dnl Based on BFD_HAVE_SYS_PROCFS_TYPE in bfd/bfd.m4. diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac index 55fb461..d492e8b 100644 --- a/gdb/gdbserver/configure.ac +++ b/gdb/gdbserver/configure.ac @@ -71,6 +71,7 @@ AC_CHECK_HEADERS(sgtty.h termio.h termios.h sys/reg.h string.h dnl linux/perf_event.h) AC_CHECK_FUNCS(pread pwrite pread64 readlink) AC_REPLACE_FUNCS(vasprintf vsnprintf) +GDB_AC_CHECK_VALGRIND # Check for UST ustlibs=""