debugger abort a running execution fixed 53/21253/4
Cedric Delamarre [Fri, 24 Jan 2020 09:54:13 +0000 (10:54 +0100)]
Change-Id: I046c3b455bbdf7a540ac8d83537a85cf22c03033

scilab/modules/ast/src/cpp/ast/debuggervisitor.cpp
scilab/modules/ast/src/cpp/ast/debugmanager.cpp
scilab/modules/core/src/cpp/runner.cpp

index 6b75291..3a87874 100644 (file)
@@ -35,8 +35,13 @@ namespace ast
 void DebuggerVisitor::visit(const SeqExp  &e)
 {
     std::list<Exp *>::const_iterator itExp;
+
     debugger::DebuggerManager* manager = debugger::DebuggerManager::getInstance();
-    manager->resetAborted();
+    if(manager->isAborted())
+    {
+        // abort a running execution
+        throw ast::InternalAbort();
+    }
 
     for (const auto & exp : e.getExps())
     {
index d910d76..a54e720 100644 (file)
@@ -410,7 +410,10 @@ char* DebuggerManager::execute(const std::string& command)
         return error;
     }
 
-    //inform debuggers
+    // reset abort flag befor a new exection
+    resetAborted();
+
+    // inform debuggers
     sendExecution();
     // execute command and wait
     StoreDebuggerCommand(command.data());
@@ -441,14 +444,20 @@ void DebuggerManager::resume() //resume execution
 
 void DebuggerManager::abort() //abort execution
 {
-    if (ConfigVariable::getPauseLevel() != 0)
+    //inform debuggers
+    sendAbort();
+
+    // this state is check by the debuggerVisitor to do abort in the main thread
+    setAborted();
+
+    // abort in a pause
+    if(isInterrupted())
     {
-        //inform debuggers
-        sendAbort();
+        if (ConfigVariable::getPauseLevel() != 0)
+        {
+            ConfigVariable::DecreasePauseLevel();
+        }
 
-        // this state is check by the debuggerVisitor to do abort in the main thread
-        setAborted();
-        ConfigVariable::DecreasePauseLevel();
         // reset lasterror
         ConfigVariable::clearLastError();
         // reset callstack
index b9985d1..7ba5cde 100644 (file)
@@ -159,11 +159,12 @@ int StaticRunner::launch()
             pCtx->scope_end();
         }
 
+        // debugger leave with abort state
+        manager->setAborted();
+
         // send the good signal about the end of execution
         sendExecDoneSignal();
 
-        // debugger leave with abort state
-        manager->setAborted();
         throw ia;
     }