[PATCH libevdev] test: detect if we're running inside gdb and disable forking
David Herrmann
dh.herrmann at gmail.com
Sun Dec 29 02:50:23 PST 2013
Hi
On Sun, Dec 29, 2013 at 10:59 AM, Peter Hutterer
<peter.hutterer at who-t.net> wrote:
> On 28/12/2013 01:50 , David Herrmann wrote:
>>
>> 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.
>
>
> setenv("foo", "bar", 0) only overwrites foo when it isn't set, otherwise
> it'll leave it untouched (see the man page) so we're good here.
Oh, I missed that. Fine with me then.
Thanks
David
>
>
>
>>
>> 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