summaryrefslogtreecommitdiff
path: root/packages/Python/lldbsuite/test/functionalities/exec
diff options
context:
space:
mode:
Diffstat (limited to 'packages/Python/lldbsuite/test/functionalities/exec')
-rw-r--r--packages/Python/lldbsuite/test/functionalities/exec/Makefile8
-rw-r--r--packages/Python/lldbsuite/test/functionalities/exec/TestExec.py110
-rw-r--r--packages/Python/lldbsuite/test/functionalities/exec/main.cpp50
-rw-r--r--packages/Python/lldbsuite/test/functionalities/exec/secondprog.cpp5
-rw-r--r--packages/Python/lldbsuite/test/functionalities/exec/secondprog.mk6
5 files changed, 83 insertions, 96 deletions
diff --git a/packages/Python/lldbsuite/test/functionalities/exec/Makefile b/packages/Python/lldbsuite/test/functionalities/exec/Makefile
index 8a7102e347af2..784a53da4776e 100644
--- a/packages/Python/lldbsuite/test/functionalities/exec/Makefile
+++ b/packages/Python/lldbsuite/test/functionalities/exec/Makefile
@@ -2,4 +2,12 @@ LEVEL = ../../make
CXX_SOURCES := main.cpp
+all: a.out secondprog
+
include $(LEVEL)/Makefile.rules
+
+secondprog:
+ $(MAKE) VPATH=$(VPATH) -f $(SRCDIR)/secondprog.mk
+
+clean::
+ $(MAKE) -f $(SRCDIR)/secondprog.mk clean
diff --git a/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py b/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py
index 550eae85e1d6d..611869932b61d 100644
--- a/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py
+++ b/packages/Python/lldbsuite/test/functionalities/exec/TestExec.py
@@ -29,44 +29,32 @@ class ExecTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
@skipUnlessDarwin
- @expectedFailureAll(oslist=['macosx'], bugnumber="rdar://36134350") # when building with cmake on green gragon or on ci.swift.org, this test fails.
@expectedFailureAll(archs=['i386'], bugnumber="rdar://28656532")
@expectedFailureAll(oslist=["ios", "tvos", "watchos", "bridgeos"], bugnumber="rdar://problem/34559552") # this exec test has problems on ios systems
def test_hitting_exec (self):
self.do_test(False)
@skipUnlessDarwin
- @expectedFailureAll(oslist=['macosx'], bugnumber="rdar://36134350") # when building with cmake on green gragon or on ci.swift.org, this test fails.
@expectedFailureAll(archs=['i386'], bugnumber="rdar://28656532")
@expectedFailureAll(oslist=["ios", "tvos", "watchos", "bridgeos"], bugnumber="rdar://problem/34559552") # this exec test has problems on ios systems
def test_skipping_exec (self):
- self.do_test(False)
+ self.do_test(True)
def do_test(self, skip_exec):
- if self.getArchitecture() == 'x86_64':
- source = os.path.join(os.getcwd(), "main.cpp")
- o_file = os.path.join(os.getcwd(), "main.o")
- execute_command(
- "'%s' -g -O0 -arch i386 -arch x86_64 '%s' -c -o '%s'" %
- (os.environ["CC"], source, o_file))
- execute_command(
- "'%s' -g -O0 -arch i386 -arch x86_64 '%s'" %
- (os.environ["CC"], o_file))
- if self.debug_info != "dsym":
- dsym_path = os.path.join(os.getcwd(), "a.out.dSYM")
- execute_command("rm -rf '%s'" % (dsym_path))
- else:
- self.build()
-
- exe = os.path.join(os.getcwd(), "a.out")
+ self.build()
+ exe = self.getBuildArtifact("a.out")
+ secondprog = self.getBuildArtifact("secondprog")
# Create the target
target = self.dbg.CreateTarget(exe)
# Create any breakpoints we need
- breakpoint = target.BreakpointCreateBySourceRegex(
+ breakpoint1 = target.BreakpointCreateBySourceRegex(
'Set breakpoint 1 here', lldb.SBFileSpec("main.cpp", False))
- self.assertTrue(breakpoint, VALID_BREAKPOINT)
+ self.assertTrue(breakpoint1, VALID_BREAKPOINT)
+ breakpoint2 = target.BreakpointCreateBySourceRegex(
+ 'Set breakpoint 2 here', lldb.SBFileSpec("secondprog.cpp", False))
+ self.assertTrue(breakpoint2, VALID_BREAKPOINT)
# Launch the process
process = target.LaunchSimple(
@@ -74,7 +62,7 @@ class ExecTestCase(TestBase):
self.assertTrue(process, PROCESS_IS_VALID)
if skip_exec:
- self.debugger.HandleCommand("settings set target.process.stop-on-exec false")
+ self.dbg.HandleCommand("settings set target.process.stop-on-exec false")
def cleanup():
self.runCmd("settings set target.process.stop-on-exec false",
check=False)
@@ -82,50 +70,48 @@ class ExecTestCase(TestBase):
# Execute the cleanup function during test case tear down.
self.addTearDownHook(cleanup)
-
- for i in range(6):
- # The stop reason of the thread should be breakpoint.
- self.assertTrue(process.GetState() == lldb.eStateStopped,
- STOPPED_DUE_TO_BREAKPOINT)
+ # The stop reason of the thread should be breakpoint.
+ self.assertTrue(process.GetState() == lldb.eStateStopped,
+ STOPPED_DUE_TO_BREAKPOINT)
+
+ threads = lldbutil.get_threads_stopped_at_breakpoint(
+ process, breakpoint1)
+ self.assertTrue(len(threads) == 1)
- threads = lldbutil.get_threads_stopped_at_breakpoint(
- process, breakpoint)
- self.assertTrue(len(threads) == 1)
+ # We had a deadlock tearing down the TypeSystemMap on exec, but only if some
+ # expression had been evaluated. So make sure we do that here so the teardown
+ # is not trivial.
- # We had a deadlock tearing down the TypeSystemMap on exec, but only if some
- # expression had been evaluated. So make sure we do that here so the teardown
- # is not trivial.
+ thread = threads[0]
+ value = thread.frames[0].EvaluateExpression("1 + 2")
+ self.assertTrue(
+ value.IsValid(),
+ "Expression evaluated successfully")
+ int_value = value.GetValueAsSigned()
+ self.assertTrue(int_value == 3, "Expression got the right result.")
- thread = threads[0]
- value = thread.frames[0].EvaluateExpression("1 + 2")
+ # Run and we should stop due to exec
+ process.Continue()
+
+ if not skip_exec:
+ self.assertTrue(process.GetState() == lldb.eStateStopped,
+ "Process should be stopped at __dyld_start")
+
+ threads = lldbutil.get_stopped_threads(
+ process, lldb.eStopReasonExec)
self.assertTrue(
- value.IsValid(),
- "Expression evaluated successfully")
- int_value = value.GetValueAsSigned()
- self.assertTrue(int_value == 3, "Expression got the right result.")
+ len(threads) == 1,
+ "We got a thread stopped for exec.")
- # Run and we should stop due to exec
+ # Run and we should stop at breakpoint in main after exec
process.Continue()
- if not skip_exec:
- self.assertTrue(process.GetState() == lldb.eStateStopped,
- "Process should be stopped at __dyld_start")
-
- threads = lldbutil.get_stopped_threads(
- process, lldb.eStopReasonExec)
- self.assertTrue(
- len(threads) == 1,
- "We got a thread stopped for exec.")
-
- # Run and we should stop at breakpoint in main after exec
- process.Continue()
-
- threads = lldbutil.get_threads_stopped_at_breakpoint(
- process, breakpoint)
- if self.TraceOn():
- for t in process.threads:
- print(t)
- if t.GetStopReason() != lldb.eStopReasonBreakpoint:
- self.runCmd("bt")
- self.assertTrue(len(threads) == 1,
- "Stopped at breakpoint in exec'ed process.")
+ threads = lldbutil.get_threads_stopped_at_breakpoint(
+ process, breakpoint2)
+ if self.TraceOn():
+ for t in process.threads:
+ print(t)
+ if t.GetStopReason() != lldb.eStopReasonBreakpoint:
+ self.runCmd("bt")
+ self.assertTrue(len(threads) == 1,
+ "Stopped at breakpoint in exec'ed process.")
diff --git a/packages/Python/lldbsuite/test/functionalities/exec/main.cpp b/packages/Python/lldbsuite/test/functionalities/exec/main.cpp
index 700c5dd94b285..92206b2d88ef7 100644
--- a/packages/Python/lldbsuite/test/functionalities/exec/main.cpp
+++ b/packages/Python/lldbsuite/test/functionalities/exec/main.cpp
@@ -6,6 +6,8 @@
#include <stdlib.h>
#include <spawn.h>
#include <unistd.h>
+#include <libgen.h>
+#include <string>
static void
exit_with_errno (int err, const char *prefix)
@@ -21,9 +23,9 @@ exit_with_errno (int err, const char *prefix)
}
static pid_t
-spawn_process (const char **argv,
+spawn_process (const char *progname,
+ const char **argv,
const char **envp,
- cpu_type_t cpu_type,
int &err)
{
pid_t pid = 0;
@@ -46,21 +48,12 @@ spawn_process (const char **argv,
posix_spawnattr_setsigmask(&attr, &no_signals);
posix_spawnattr_setsigdefault(&attr, &all_signals);
- if (cpu_type != 0)
- {
- size_t ocount = 0;
- err = posix_spawnattr_setbinpref_np (&attr, 1, &cpu_type, &ocount);
- }
-
- if (err == 0)
- {
- err = posix_spawn (&pid,
- argv[0],
- file_actions,
- &attr,
- (char * const *)argv,
- (char * const *)envp);
- }
+ err = posix_spawn (&pid,
+ progname,
+ file_actions,
+ &attr,
+ (char * const *)argv,
+ (char * const *)envp);
posix_spawnattr_destroy(&attr);
}
@@ -70,25 +63,14 @@ spawn_process (const char **argv,
int
main (int argc, char const **argv)
{
- printf ("pid %i: Pointer size is %zu.\n", getpid(), sizeof(void *));
+ char *buf = (char*) malloc (strlen (argv[0]) + 12);
+ strlcpy (buf, argv[0], strlen (argv[0]) + 1);
+ std::string directory_name (::dirname (buf));
+
+ std::string other_program = directory_name + "/secondprog";
int err = 0; // Set breakpoint 1 here
-#if defined (__x86_64__)
- if (sizeof(void *) == 8)
- {
- spawn_process (argv, NULL, CPU_TYPE_I386, err);
- if (err)
- exit_with_errno (err, "posix_spawn i386 error");
- }
- else
- {
- spawn_process (argv, NULL, CPU_TYPE_X86_64, err);
- if (err)
- exit_with_errno (err, "posix_spawn x86_64 error");
- }
-#else
- spawn_process (argv, NULL, 0, err);
+ spawn_process (other_program.c_str(), argv, NULL, err);
if (err)
exit_with_errno (err, "posix_spawn x86_64 error");
-#endif
return 0;
}
diff --git a/packages/Python/lldbsuite/test/functionalities/exec/secondprog.cpp b/packages/Python/lldbsuite/test/functionalities/exec/secondprog.cpp
new file mode 100644
index 0000000000000..5653471c15307
--- /dev/null
+++ b/packages/Python/lldbsuite/test/functionalities/exec/secondprog.cpp
@@ -0,0 +1,5 @@
+#include <stdio.h>
+int main ()
+{
+ puts ("I am the second program."); // Set breakpoint 2 here
+}
diff --git a/packages/Python/lldbsuite/test/functionalities/exec/secondprog.mk b/packages/Python/lldbsuite/test/functionalities/exec/secondprog.mk
new file mode 100644
index 0000000000000..88f76b5113b4f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/functionalities/exec/secondprog.mk
@@ -0,0 +1,6 @@
+LEVEL = ../../make
+
+CXX_SOURCES := secondprog.cpp
+EXE = secondprog
+
+include $(LEVEL)/Makefile.rules