diff options
Diffstat (limited to 'packages/Python/lldbsuite/test/functionalities/unwind/sigtramp')
3 files changed, 113 insertions, 0 deletions
| diff --git a/packages/Python/lldbsuite/test/functionalities/unwind/sigtramp/Makefile b/packages/Python/lldbsuite/test/functionalities/unwind/sigtramp/Makefile new file mode 100644 index 000000000000..b09a579159d4 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/unwind/sigtramp/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +C_SOURCES := main.c + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/functionalities/unwind/sigtramp/TestSigtrampUnwind.py b/packages/Python/lldbsuite/test/functionalities/unwind/sigtramp/TestSigtrampUnwind.py new file mode 100644 index 000000000000..ddfb1122b6f1 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/unwind/sigtramp/TestSigtrampUnwind.py @@ -0,0 +1,81 @@ +""" +Test that we can backtrace correctly with 'sigtramp' functions on the stack +""" + +from __future__ import print_function + + + +import os, time +import lldb +from lldbsuite.test.lldbtest import * +import lldbsuite.test.lldbutil as lldbutil + +class SigtrampUnwind(TestBase): +    mydir = TestBase.compute_mydir(__file__) + +    # On different platforms the "_sigtramp" and "__kill" frames are likely to be different. +    # This test could probably be adapted to run on linux/*bsd easily enough. +    @skipUnlessDarwin +    def test (self): +        """Test that we can backtrace correctly with _sigtramp on the stack""" +        self.build() +        self.setTearDownCleanup() + +        exe = os.path.join(os.getcwd(), "a.out") +        target = self.dbg.CreateTarget(exe) +        self.assertTrue(target, VALID_TARGET) + + +        lldbutil.run_break_set_by_file_and_line (self, "main.c", line_number('main.c', '// Set breakpoint here'), num_expected_locations=1) + +        process = target.LaunchSimple (None, None, self.get_process_working_directory()) + +        if not process: +            self.fail("SBTarget.Launch() failed") + +        if process.GetState() != lldb.eStateStopped: +            self.fail("Process should be in the 'stopped' state, " +                      "instead the actual state is: '%s'" % +                      lldbutil.state_type_to_str(process.GetState())) + +        self.expect("pro handle  -n false -p true -s false SIGUSR1", "Have lldb pass SIGUSR1 signals", +            substrs = ["SIGUSR1", "true", "false", "false"]) + +        lldbutil.run_break_set_by_symbol (self, "handler", num_expected_locations=1, module_name="a.out") + +        self.runCmd("continue") + +        thread = process.GetThreadAtIndex(0) + +        found_handler = False +        found_sigtramp = False +        found_kill = False +        found_main = False + +        for f in thread.frames: +            if f.GetFunctionName() == "handler": +                found_handler = True +            if f.GetFunctionName() == "_sigtramp": +                found_sigtramp = True +            if f.GetFunctionName() == "__kill": +                found_kill = True +            if f.GetFunctionName() == "main": +                found_main = True + +        if self.TraceOn(): +            print("Backtrace once we're stopped:") +            for f in thread.frames: +                print("  %d %s" % (f.GetFrameID(), f.GetFunctionName())) + +        if found_handler == False: +            self.fail("Unable to find handler() in backtrace.") + +        if found_sigtramp == False: +            self.fail("Unable to find _sigtramp() in backtrace.") + +        if found_kill == False: +            self.fail("Unable to find kill() in backtrace.") + +        if found_main == False: +            self.fail("Unable to find main() in backtrace.") diff --git a/packages/Python/lldbsuite/test/functionalities/unwind/sigtramp/main.c b/packages/Python/lldbsuite/test/functionalities/unwind/sigtramp/main.c new file mode 100644 index 000000000000..aaa03e7aa843 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/unwind/sigtramp/main.c @@ -0,0 +1,27 @@ +#include <stdlib.h> +#include <signal.h> +#include <stdio.h> +#include <unistd.h> + +void handler (int in) +{ +    puts ("in handler routine"); +    while (1) +        ; +} + +void +foo () +{ +    puts ("in foo ()"); +    kill (getpid(), SIGUSR1); +} +int main () +{ +    puts ("in main");           // Set breakpoint here +    signal (SIGUSR1, handler); +    puts ("signal handler set up"); +    foo(); +    puts ("exiting"); +    return 0; +} | 
