[PATCH libevdev] test: detect if we're running inside gdb and disable forking

David Herrmann dh.herrmann at gmail.com
Fri Dec 27 07:50:06 PST 2013


Hi Peter

On Mon, Dec 23, 2013 at 11:44 PM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> The Check test framework forks by default which is annoying when running gdb.
> Try to detect whether we're inside gdb by ptracing ourselves. If that works,
> we're not inside a debugger. If it doesn't, then assume we're inside a
> debugger and set CK_FORK to "no".
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>  libevdev/libevdev.h |  5 +++--
>  test/test-main.c    | 37 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 40 insertions(+), 2 deletions(-)
>
> diff --git a/libevdev/libevdev.h b/libevdev/libevdev.h
> index c11c845..c5d12a4 100644
> --- a/libevdev/libevdev.h
> +++ b/libevdev/libevdev.h
> @@ -177,8 +177,9 @@ extern "C" {
>   *     git grep "suite_create"
>   *     git grep "tcase_create"
>   *
> - * By default, check forks, making debugging harder. Run gdb as below to avoid
> - * forking.
> + * By default, Check forks, making debugging harder. The test suite tries to detect
> + * if it is running inside gdb and disable forking. If that doesn't work for
> + * some reason, run gdb as below to avoid forking.
>   *
>   *     sudo CK_FORK=no CK_RUN_TEST="test case name" gdb ./test/test-libevdev

You should also change this line then.

>   *
> diff --git a/test/test-main.c b/test/test-main.c
> index 73d79c9..91128c3 100644
> --- a/test/test-main.c
> +++ b/test/test-main.c
> @@ -22,6 +22,10 @@
>
>  #include <config.h>
>  #include <check.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <sys/ptrace.h>
> +#include <sys/wait.h>
>
>  extern Suite *event_name_suite(void);
>  extern Suite *event_code_suite(void);
> @@ -31,9 +35,42 @@ extern Suite *libevdev_has_event_test(void);
>  extern Suite *libevdev_events(void);
>  extern Suite *uinput_suite(void);
>
> +static int
> +is_debugger_attached(void)
> +{
> +       int status;
> +       int rc;
> +       int pid = fork();
> +
> +       if (pid == -1)
> +               return 0;
> +
> +       if (pid == 0) {
> +               int ppid = getppid();
> +               if (ptrace(PTRACE_ATTACH, ppid, NULL, NULL) == 0) {
> +                       waitpid(ppid, NULL, 0);

I guess PTRACE_ATTACH stops the tracee or what are you waiting here for?

> +                       ptrace(PTRACE_CONT, NULL, NULL);
> +                       ptrace(PTRACE_DETACH, ppid, NULL, NULL);
> +                       rc = 0;
> +               } else
> +                       rc = 1;
> +               _exit(rc);
> +       } else {
> +               waitpid(pid, &status, 0);
> +               rc = WEXITSTATUS(status);
> +       }
> +
> +       return rc;
> +}
> +
> +
>  int main(int argc, char **argv)
>  {
>         int failed;
> +
> +       if (is_debugger_attached())

Can you add: && !getenv("CK_FORK")
Allows to set CK_FORK explicitly on the command-line.

Thanks
David

> +               setenv("CK_FORK", "no", 0);
> +
>         Suite *s = libevdev_has_event_test();
>         SRunner *sr = srunner_create(s);
>         srunner_add_suite(sr, libevdev_events());
> --
> 1.8.4.2
>
> _______________________________________________
> Input-tools mailing list
> Input-tools at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/input-tools


More information about the Input-tools mailing list