[Lldb-commits] [lldb] r241475 - Fix step over breakpoint on Windows (which was detected by TestCreateAfterAttach.py).

Adrian McCarthy amccarth at google.com
Mon Jul 6 10:42:09 PDT 2015


Author: amccarth
Date: Mon Jul  6 12:42:09 2015
New Revision: 241475

URL: http://llvm.org/viewvc/llvm-project?rev=241475&view=rev
Log:
Fix step over breakpoint on Windows (which was detected by TestCreateAfterAttach.py).

Added:
    lldb/trunk/test/functionalities/thread/create_after_attach/main.cpp
      - copied, changed from r241132, lldb/trunk/test/functionalities/thread/create_after_attach/main.c
Removed:
    lldb/trunk/test/functionalities/thread/create_after_attach/main.c
Modified:
    lldb/trunk/source/Plugins/Process/Windows/TargetThreadWindows.cpp
    lldb/trunk/test/functionalities/thread/create_after_attach/Makefile
    lldb/trunk/test/functionalities/thread/create_after_attach/TestCreateAfterAttach.py

Modified: lldb/trunk/source/Plugins/Process/Windows/TargetThreadWindows.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Windows/TargetThreadWindows.cpp?rev=241475&r1=241474&r2=241475&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Windows/TargetThreadWindows.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Windows/TargetThreadWindows.cpp Mon Jul  6 12:42:09 2015
@@ -52,10 +52,6 @@ TargetThreadWindows::RefreshStateAfterSt
 void
 TargetThreadWindows::WillResume(lldb::StateType resume_state)
 {
-    Log *log(lldb_private::GetLogIfAllCategoriesSet (WINDOWS_LOG_THREAD));
-    if (log)
-        log->Printf ("TargetThreadWindows::WillResume (tid = %" PRIi64 ") setting thread resume state to %s",
-                     GetID(), StateAsCString(resume_state));
 }
 
 void
@@ -125,7 +121,7 @@ TargetThreadWindows::GetUnwinder()
 bool
 TargetThreadWindows::DoResume()
 {
-    StateType resume_state = GetResumeState();
+    StateType resume_state = GetTemporaryResumeState();
     StateType current_state = GetState();
     if (resume_state == current_state)
         return true;

Modified: lldb/trunk/test/functionalities/thread/create_after_attach/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/thread/create_after_attach/Makefile?rev=241475&r1=241474&r2=241475&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/thread/create_after_attach/Makefile (original)
+++ lldb/trunk/test/functionalities/thread/create_after_attach/Makefile Mon Jul  6 12:42:09 2015
@@ -1,5 +1,5 @@
-LEVEL = ../../../make
-
-ENABLE_THREADS := YES
-C_SOURCES := main.c
-include $(LEVEL)/Makefile.rules
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+ENABLE_STD_THREADS := YES
+include $(LEVEL)/Makefile.rules

Modified: lldb/trunk/test/functionalities/thread/create_after_attach/TestCreateAfterAttach.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/thread/create_after_attach/TestCreateAfterAttach.py?rev=241475&r1=241474&r2=241475&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/thread/create_after_attach/TestCreateAfterAttach.py (original)
+++ lldb/trunk/test/functionalities/thread/create_after_attach/TestCreateAfterAttach.py Mon Jul  6 12:42:09 2015
@@ -44,9 +44,9 @@ class CreateAfterAttachTestCase(TestBase
         # Call super's setUp().
         TestBase.setUp(self)
         # Find the line numbers for our breakpoints.
-        self.break_1 = line_number('main.c', '// Set first breakpoint here')
-        self.break_2 = line_number('main.c', '// Set second breakpoint here')
-        self.break_3 = line_number('main.c', '// Set third breakpoint here')
+        self.break_1 = line_number('main.cpp', '// Set first breakpoint here')
+        self.break_2 = line_number('main.cpp', '// Set second breakpoint here')
+        self.break_3 = line_number('main.cpp', '// Set third breakpoint here')
 
     def create_after_attach(self, use_fork):
         """Test thread creation after process attach."""
@@ -70,13 +70,17 @@ class CreateAfterAttachTestCase(TestBase
         self.assertTrue(process, PROCESS_IS_VALID)
 
         # This should create a breakpoint in the main thread.
-        lldbutil.run_break_set_by_file_and_line (self, "main.c", self.break_1, num_expected_locations=1)
+        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.break_1, num_expected_locations=1)
 
         # This should create a breakpoint in the second child thread.
-        lldbutil.run_break_set_by_file_and_line (self, "main.c", self.break_2, num_expected_locations=1)
+        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.break_2, num_expected_locations=1)
 
         # This should create a breakpoint in the first child thread.
-        lldbutil.run_break_set_by_file_and_line (self, "main.c", self.break_3, num_expected_locations=1)
+        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.break_3, num_expected_locations=1)
+
+        # Note:  With std::thread, we cannot rely on particular thread numbers.  Using
+        # std::thread may cause the program to spin up a thread pool (and it does on
+        # Windows), so the thread numbers are non-deterministic.
 
         # Run to the first breakpoint
         self.runCmd("continue")
@@ -84,23 +88,21 @@ class CreateAfterAttachTestCase(TestBase
         # The stop reason of the thread should be breakpoint.
         self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
             substrs = ['stopped',
-                       '* thread #1',
-                       'stop reason = breakpoint',
-                       'thread #2'])
+                       '* thread #',
+                       'main',
+                       'stop reason = breakpoint'])
 
         # Change a variable to escape the loop
         self.runCmd("expression main_thread_continue = 1")
 
         # Run to the second breakpoint
         self.runCmd("continue")
-        self.runCmd("thread select 3")
 
         # The stop reason of the thread should be breakpoint.
         self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
             substrs = ['stopped',
-                       'thread #1',
-                       'thread #2',
-                       '* thread #3',
+                       '* thread #',
+                       'thread_2_func',
                        'stop reason = breakpoint'])
 
         # Change a variable to escape the loop
@@ -108,14 +110,13 @@ class CreateAfterAttachTestCase(TestBase
 
         # Run to the third breakpoint
         self.runCmd("continue")
-        self.runCmd("thread select 2")
 
         # The stop reason of the thread should be breakpoint.
         # Thread 3 may or may not have already exited.
         self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
             substrs = ['stopped',
-                       'thread #1',
-                       '* thread #2',
+                       '* thread #',
+                       'thread_1_func',
                        'stop reason = breakpoint'])
 
         # Run to completion

Removed: lldb/trunk/test/functionalities/thread/create_after_attach/main.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/thread/create_after_attach/main.c?rev=241474&view=auto
==============================================================================
--- lldb/trunk/test/functionalities/thread/create_after_attach/main.c (original)
+++ lldb/trunk/test/functionalities/thread/create_after_attach/main.c (removed)
@@ -1,79 +0,0 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <pthread.h>
-
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
-volatile int g_thread_2_continuing = 0;
-
-void *
-thread_1_func (void *input)
-{
-    // Waiting to be released by the debugger.
-    while (!g_thread_2_continuing) // The debugger will change this value
-    {
-        usleep(1);
-    }
-
-    // Return
-    return NULL;  // Set third breakpoint here
-}
-
-void *
-thread_2_func (void *input)
-{
-    // Waiting to be released by the debugger.
-    int child_thread_continue = 0;
-    while (!child_thread_continue) // The debugger will change this value
-    {
-        usleep(1);  // Set second breakpoint here
-    }
-
-    // Release thread 1
-    g_thread_2_continuing = 1;
-
-    // Return
-    return NULL;
-}
-
-int main(int argc, char const *argv[])
-{
-    pthread_t thread_1;
-    pthread_t thread_2;
-
-#if defined(__linux__)
-    // Immediately enable any ptracer so that we can allow the stub attach
-    // operation to succeed.  Some Linux kernels are locked down so that
-    // only an ancestor process can be a ptracer of a process.  This disables that
-    // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-    int prctl_result;
-
-    // For now we execute on best effort basis.  If this fails for
-    // some reason, so be it.
-    prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-    (void) prctl_result;
-#endif
-#endif
-
-    // Create a new thread
-    pthread_create (&thread_1, NULL, thread_1_func, NULL);
-
-    // Waiting to be attached by the debugger.
-    int main_thread_continue = 0;
-    while (!main_thread_continue) // The debugger will change this value
-    {
-        usleep(1);  // Set first breakpoint here
-    }
-
-    // Create another new thread
-    pthread_create (&thread_2, NULL, thread_2_func, NULL);
-
-    // Wait for the threads to finish.
-    pthread_join(thread_1, NULL);
-    pthread_join(thread_2, NULL);
-
-    printf("Exiting now\n");
-}

Copied: lldb/trunk/test/functionalities/thread/create_after_attach/main.cpp (from r241132, lldb/trunk/test/functionalities/thread/create_after_attach/main.c)
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/thread/create_after_attach/main.cpp?p2=lldb/trunk/test/functionalities/thread/create_after_attach/main.cpp&p1=lldb/trunk/test/functionalities/thread/create_after_attach/main.c&r1=241132&r2=241475&rev=241475&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/thread/create_after_attach/main.c (original)
+++ lldb/trunk/test/functionalities/thread/create_after_attach/main.cpp Mon Jul  6 12:42:09 2015
@@ -1,79 +1,78 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <pthread.h>
-
-#if defined(__linux__)
-#include <sys/prctl.h>
-#endif
-
-volatile int g_thread_2_continuing = 0;
-
-void *
-thread_1_func (void *input)
-{
-    // Waiting to be released by the debugger.
-    while (!g_thread_2_continuing) // The debugger will change this value
-    {
-        usleep(1);
-    }
-
-    // Return
-    return NULL;  // Set third breakpoint here
-}
-
-void *
-thread_2_func (void *input)
-{
-    // Waiting to be released by the debugger.
-    int child_thread_continue = 0;
-    while (!child_thread_continue) // The debugger will change this value
-    {
-        usleep(1);  // Set second breakpoint here
-    }
-
-    // Release thread 1
-    g_thread_2_continuing = 1;
-
-    // Return
-    return NULL;
-}
-
-int main(int argc, char const *argv[])
-{
-    pthread_t thread_1;
-    pthread_t thread_2;
-
-#if defined(__linux__)
-    // Immediately enable any ptracer so that we can allow the stub attach
-    // operation to succeed.  Some Linux kernels are locked down so that
-    // only an ancestor process can be a ptracer of a process.  This disables that
-    // restriction.  Without it, attach-related stub tests will fail.
-#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
-    int prctl_result;
-
-    // For now we execute on best effort basis.  If this fails for
-    // some reason, so be it.
-    prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
-    (void) prctl_result;
-#endif
-#endif
-
-    // Create a new thread
-    pthread_create (&thread_1, NULL, thread_1_func, NULL);
-
-    // Waiting to be attached by the debugger.
-    int main_thread_continue = 0;
-    while (!main_thread_continue) // The debugger will change this value
-    {
-        usleep(1);  // Set first breakpoint here
-    }
-
-    // Create another new thread
-    pthread_create (&thread_2, NULL, thread_2_func, NULL);
-
-    // Wait for the threads to finish.
-    pthread_join(thread_1, NULL);
-    pthread_join(thread_2, NULL);
-
-    printf("Exiting now\n");
-}
+#include <stdio.h>
+#include <chrono>
+#include <thread>
+
+using std::chrono::microseconds;
+
+#if defined(__linux__)
+#include <sys/prctl.h>
+#endif
+
+volatile int g_thread_2_continuing = 0;
+
+void *
+thread_1_func (void *input)
+{
+    // Waiting to be released by the debugger.
+    while (!g_thread_2_continuing) // Another thread will change this value
+    {
+        std::this_thread::sleep_for(microseconds(1));
+    }
+
+    // Return
+    return NULL;  // Set third breakpoint here
+}
+
+void *
+thread_2_func (void *input)
+{
+    // Waiting to be released by the debugger.
+    int child_thread_continue = 0;
+    while (!child_thread_continue) // The debugger will change this value
+    {
+        std::this_thread::sleep_for(microseconds(1));  // Set second breakpoint here
+    }
+
+    // Release thread 1
+    g_thread_2_continuing = 1;
+
+    // Return
+    return NULL;
+}
+
+int main(int argc, char const *argv[])
+{
+#if defined(__linux__)
+    // Immediately enable any ptracer so that we can allow the stub attach
+    // operation to succeed.  Some Linux kernels are locked down so that
+    // only an ancestor process can be a ptracer of a process.  This disables that
+    // restriction.  Without it, attach-related stub tests will fail.
+#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
+    int prctl_result;
+
+    // For now we execute on best effort basis.  If this fails for
+    // some reason, so be it.
+    prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
+    (void) prctl_result;
+#endif
+#endif
+
+    // Create a new thread
+    std::thread thread_1(thread_1_func, nullptr);
+
+    // Waiting to be attached by the debugger.
+    int main_thread_continue = 0;
+    while (!main_thread_continue) // The debugger will change this value
+    {
+        std::this_thread::sleep_for(microseconds(1));  // Set first breakpoint here
+    }
+
+    // Create another new thread
+    std::thread thread_2(thread_2_func, nullptr);
+
+    // Wait for the threads to finish.
+    thread_1.join();
+    thread_2.join();
+
+    printf("Exiting now\n");
+}





More information about the lldb-commits mailing list