debugger: 75/17475/2
Antoine ELIAS [Thu, 19 Nov 2015 11:18:21 +0000 (12:18 +0100)]
- avoid add duplicate breakpoints.
- if disp command failed, error is correctly displayed in console.
- update help pages.

Change-Id: I58e37f2d06c4da830d7da5df7b26ab09b5831741

scilab/modules/ast/src/cpp/ast/debugmanager.cpp
scilab/modules/core/help/en_US/debugging/debug.xml
scilab/modules/core/help/fr_FR/debugging/debug.xml
scilab/modules/core/sci_gateway/cpp/sci_debug.cpp
scilab/modules/core/src/cpp/InitScilab.cpp

index 9136a89..63c826c 100644 (file)
@@ -134,8 +134,35 @@ void DebuggerMagager::sendUpdate() const
 
 void DebuggerMagager::addBreakPoint(Breakpoint* bp)
 {
-    breakpoints.push_back(bp);
-    sendUpdate();
+    //check if breakpoint does not exist
+
+    bool add = true;
+    for (const auto b : breakpoints)
+    {
+        if (b->getFunctioName() != bp->getFunctioName())
+        {
+            continue;
+        }
+
+        if (b->getMacroLine() != bp->getMacroLine())
+        {
+            continue;
+        }
+
+        if (b->getCondition() != bp->getCondition())
+        {
+            continue;
+        }
+
+        //same breakpoint, cancel add
+        add = false;
+    }
+
+    if (add)
+    {
+        breakpoints.push_back(bp);
+        sendUpdate();
+    }
 }
 
 void DebuggerMagager::removeBreakPoint(int _iBreakPoint)
index 055d403..e3add1e 100644 (file)
         When debug mode is active, prompt change to <literal>debug> </literal>.
         </para>
         <term>Commands: </term>
-        <listitem>
-            <variablelist>
-                <varlistentry>
-                    <term>(h)elp: </term>
-                    <para>Show help on console</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>(q)uit: </term>
-                    <para>Leave debug mode to return to normal mode of Scilab.</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>(w)here or bt: </term>
-                    <para>Display callstack.</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>(e)xec: </term>
-                    <term>(r)un: </term>
-                    <para>Execute command.</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>(c)ontinue: </term>
-                    <para>Continue execution.</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>(a)bort: </term>
-                    <para>Abort execution.</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>step(n)ext or (n)ext: </term>
-                    <para>Continue execution to next expression.</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>step(i)n or (i)n: </term>
-                    <para>Continue execution to next expression in sub function.</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>step(o)ut or (o)ut: </term>
-                    <para>Continue execution to next expression in previous function.</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>(b)reakpoint or (b)reak: </term>
-                    <synopsis>breakpoint function [line [condition]]</synopsis>
-                    <para>Add a breakpoint in a function at line <literal>line</literal></para>
-                    <para>If a condition is specified, a breakpoint become enable only if condition is <literal>%t</literal></para>
-                </varlistentry>
-                <varlistentry>
-                    <term>(del)ete: </term>
-                    <synopsis>delete [n]</synopsis>
-                    <para>Remove all breakpoints.</para>
-                    <para>If n is specified, remove breakpoint #n</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>enable: </term>
-                    <synopsis>enable [n]</synopsis>
-                    <para>Enable all breakpoints.</para>
-                    <para>If n is specified, enable breakpoint #n</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>disable: </term>
-                    <synopsis>disable [n]</synopsis>
-                    <para>Disable all breakpoints.</para>
-                    <para>If n is specified, disable breakpoint #n</para>
-                </varlistentry>
-                <varlistentry>
-                    <term>(s)how: </term>
-                    <synopsis>show [n]</synopsis>
-                    <para>Show all breakpoints information.</para>
-                    <para>If n is specified, show breakpoint #n</para>
-                </varlistentry>
-            </variablelist>
-        </listitem>
+        <variablelist>
+            <varlistentry>
+                <term>(h)elp: </term>
+                <para>Show help on console</para>
+            </varlistentry>
+            <varlistentry>
+                <term>help: </term>
+                <para>Show help on help browser when possible otherwise display help in console</para>
+            </varlistentry>
+            <varlistentry>
+                <term>(q)uit: </term>
+                <para>Leave debug mode to return to normal mode of Scilab.</para>
+            </varlistentry>
+            <varlistentry>
+                <term>(w)here or bt: </term>
+                <para>Display callstack.</para>
+            </varlistentry>
+            <varlistentry>
+                <term>(e)xec: </term>
+                <term>(r)un: </term>
+                <para>Execute command.</para>
+            </varlistentry>
+            <varlistentry>
+                <term>(d)isp var: </term>
+                <term>(p)rint var: </term>
+                <para>Display variable <literal>var</literal>.</para>
+            </varlistentry>
+            <varlistentry>
+                <term>(c)ontinue: </term>
+                <para>Continue execution.</para>
+            </varlistentry>
+            <varlistentry>
+                <term>(a)bort: </term>
+                <para>Abort execution.</para>
+            </varlistentry>
+            <varlistentry>
+                <term>step(n)ext or next: </term>
+                <para>Continue execution to next expression.</para>
+            </varlistentry>
+            <varlistentry>
+                <term>step(i)n or in: </term>
+                <para>Continue execution to next expression in sub function.</para>
+            </varlistentry>
+            <varlistentry>
+                <term>step(o)ut or out: </term>
+                <para>Continue execution to next expression in previous function.</para>
+            </varlistentry>
+            <varlistentry>
+                <term>(b)reakpoint or break: </term>
+                <synopsis>breakpoint function [line [condition]]</synopsis>
+                <para>Add a breakpoint in a function at line <literal>line</literal></para>
+                <para>If a condition is specified, a breakpoint become enable only if condition is <literal>%t</literal></para>
+            </varlistentry>
+            <varlistentry>
+                <term>(del)ete [n]: </term>
+                <para>Remove all breakpoints.</para>
+                <para>If n is specified, remove breakpoint #n</para>
+            </varlistentry>
+            <varlistentry>
+                <term>enable [n]: </term>
+                <para>Enable all breakpoints.</para>
+                <para>If n is specified, enable breakpoint #n</para>
+            </varlistentry>
+            <varlistentry>
+                <term>disable [n]: </term>
+                <para>Disable all breakpoints.</para>
+                <para>If n is specified, disable breakpoint #n</para>
+            </varlistentry>
+            <varlistentry>
+                <term>(s)how [n]: </term>
+                <para>Show all breakpoints information.</para>
+                <para>If n is specified, show breakpoint #n</para>
+            </varlistentry>
+        </variablelist>
     </refsection>
     <refsection>
         <title>Examples</title>
index 27eabec..3439b14 100644 (file)
                     <para>Affiche l'aide dans la console</para>
                 </varlistentry>
                 <varlistentry>
+                    <term>help: </term>
+                    <para>Affiche l'aide dans le navigateur si cela est possible sinon l'affiche dans la console</para>
+                </varlistentry>
+                <varlistentry>
                     <term>(q)uit: </term>
                     <para>Quitte l'environnement de déboggage et revient au mode normal de Scilab.</para>
                 </varlistentry>
                     <para>Exécute une commande.</para>
                 </varlistentry>
                 <varlistentry>
+                    <term>(d)isp var: </term>
+                    <term>(p)rint var: </term>
+                    <para>Affiche la variable <literal>var</literal>.</para>
+                </varlistentry>
+                <varlistentry>
                     <term>(c)ontinue: </term>
                     <para>Poursuit l'éxécution.</para>
                 </varlistentry>
                     <para>Annule l'éxécution.</para>
                 </varlistentry>
                 <varlistentry>
-                    <term>step(n)ext or (n)ext: </term>
+                    <term>step(n)ext or next: </term>
                     <para>Poursuit l'éxécution jusqu'a l'expression suivante.</para>
                 </varlistentry>
                 <varlistentry>
-                    <term>step(i)n or (i)n: </term>
+                    <term>step(i)n or in: </term>
                     <para>Poursuit l'éxécution dans la sous fonction.</para>
                 </varlistentry>
                 <varlistentry>
-                    <term>step(o)ut or (o)ut: </term>
+                    <term>step(o)ut or out: </term>
                     <para>Poursuit l'éxécution jusqu'a revenir dans la fonction appelante.</para>
                 </varlistentry>
                 <varlistentry>
-                    <term>(b)reakpoint or (b)reak: </term>
+                    <term>(b)reakpoint or break: </term>
                     <synopsis>breakpoint function [line [condition]]</synopsis>
                     <para>Ajoute un point d'arrêt dans une fonction a une ligne <literal>line</literal></para>
                     <para>Si une condition est spécifiée, le point d'arrêt ne devient active que si la condition est <literal>%t</literal></para>
                 </varlistentry>
                 <varlistentry>
-                    <term>(del)ete: </term>
-                    <synopsis>delete [n]</synopsis>
+                    <term>(del)ete [n]: </term>
                     <para>Supprime tous les points d'arrêt.</para>
                     <para>Si n est spécifié, supprime le point d'arrêt #n</para>
                 </varlistentry>
                 <varlistentry>
-                    <term>enable: </term>
-                    <synopsis>enable [n]</synopsis>
+                    <term>enable [n]: </term>
                     <para>Active tous les points d'arrêt.</para>
                     <para>Si n est spécifié, active le point d'arrêt #n</para>
                 </varlistentry>
                 <varlistentry>
-                    <term>disable: </term>
-                    <synopsis>disable [n]</synopsis>
+                    <term>disable [n]: </term>
                     <para>Désactive tous les points d'arrêt.</para>
                     <para>Si n est spécifié, désavtive le point d'arrêt #n</para>
                 </varlistentry>
                 <varlistentry>
-                    <term>(s)how: </term>
-                    <synopsis>show [n]</synopsis>
+                    <term>(s)how [n]: </term>
                     <para>Affiche tous les information sur les points d'arrêt.</para>
                     <para>Si n est spécifié, affiche les information du point d'arrêt #n</para>
                 </varlistentry>
index 32349eb..27714f3 100644 (file)
@@ -36,6 +36,7 @@ typedef enum EnumCommand
     DeleteCommand,
     EnableCommand,
     HelpCommand,
+    HelpShortCommand,
     ListCommand,
     NextCommand,
     QuitCommand,
@@ -291,6 +292,22 @@ types::Function::ReturnValue sci_debug(types::typed_list &in, int _iRetCount, ty
                 return types::Function::Error;
             }
 
+            if (ConfigVariable::getScilabMode() == SCILAB_NW || ConfigVariable::getScilabMode() == SCILAB_STD)
+            {
+                StorePrioritaryCommand("help debug");
+                return types::Function::OK;
+            }
+
+            //continue tp HelpShortCommand
+        }
+        case HelpShortCommand:
+        {
+            if (iRhs > 1)
+            {
+                Scierror(999, _("%s: Wrong number of input arguments: %d expected.\n"), "help", 0);
+                return types::Function::Error;
+            }
+
             //help
             print_help();
             return types::Function::OK;
@@ -495,32 +512,35 @@ void print_help()
     //a,b,c,d,h,i,n,o,q,s,w
 
     sciprint(_("debug commands : \n"));
-    sciprint("  help (h)          : %s.\n", _("show this help"));
-    sciprint("\n");
-    sciprint("  quit (q)          : %s.\n", _("stop debugging"));
-    sciprint("  where (w, bt)     : %s.\n", _("show callstack"));
-    sciprint("\n");
-    sciprint("  exec (e) cmd      : %s.\n", _("execute cmd"));
-    sciprint("  run (r) cmd       : %s.\n", _("execute cmd"));
-    sciprint("\n");
-    sciprint("  continue (c)      : %s.\n", _("continue execution"));
-    sciprint("  abort (a)         : %s.\n", _("abort execution"));
-    sciprint("  next (n)          : %s.\n", _("continue to next statement"));
-    sciprint("  stepin (i, in)    : %s.\n", _("step into function"));
-    sciprint("  stepout (o, out)  : %s.\n", _("step outside function"));
+    sciprint("  h                            : %s.\n", _("show this help"));
+    sciprint("  help                         : %s.\n", _("open debug documentation page"));
+    sciprint("\n");                          
+    sciprint("  (q)uit                       : %s.\n", _("stop debugging"));
+    sciprint("  (w)here or bt                : %s.\n", _("show callstack"));
+    sciprint("\n");                          
+    sciprint("  (e)xec cmd                   : %s.\n", _("execute cmd"));
+    sciprint("  (r)un cmd                    : %s.\n", _("execute cmd"));
+    sciprint("\n");                          
+    sciprint("  (d)isp var                   : %s.\n", _("display variable"));
+    sciprint("  (p)rint var                  : %s.\n", _("display variable"));
+    sciprint("\n");                          
+    sciprint("  (c)ontinue                   : %s.\n", _("continue execution"));
+    sciprint("  (a)bort                      : %s.\n", _("abort execution"));
+    sciprint("  step(n)ext or next           : %s.\n", _("continue to next statement"));
+    sciprint("  step(i)n or in               : %s.\n", _("step into function"));
+    sciprint("  step(o)ut or out             : %s.\n", _("step outside function"));
     sciprint("\n");
-    sciprint("  breakpoint (break, b)\n     func [l [cond]]: %s.\n", _("set a breakpoint"));
-    sciprint("  delete (del)      : %s.\n", _("delete all breakpoints"));
-    sciprint("  delete (del) n    : %s.\n", _("delete a specific breakpoint"));
-    sciprint("  enable            : %s.\n", _("enable all breakpoints"));
-    sciprint("  enable n          : %s.\n", _("enable a specific breakpoint"));
-    sciprint("  disable           : %s.\n", _("disable all breakpoints"));
-    sciprint("  disable n         : %s.\n", _("disable a specific breakpoint"));
-    sciprint("  show (s)          : %s.\n", _("show all breakpoints"));
-    sciprint("  show (s) n        : %s.\n", _("show a specific breakpoint"));
+    sciprint("  (b)reakpoint or break\n     func [line [\"condition\"]] : %s.\n", _("add a breakpoint"));
+    sciprint("  (del)ete                     : %s.\n", _("delete all breakpoints"));
+    sciprint("  (del)ete n                   : %s.\n", _("delete a specific breakpoint"));
+    sciprint("  enable                       : %s.\n", _("enable all breakpoints"));
+    sciprint("  enable n                     : %s.\n", _("enable a specific breakpoint"));
+    sciprint("  disable                      : %s.\n", _("disable all breakpoints"));
+    sciprint("  disable n                    : %s.\n", _("disable a specific breakpoint"));
+    sciprint("  (s)how                       : %s.\n", _("show all breakpoints"));
+    sciprint("  (s)how n                     : %s.\n", _("show a specific breakpoint"));
     sciprint("\n");
-    sciprint(_("  for more details, help debug.\n"));
-
+    sciprint(_("  for more details, show help page.\n"));
 }
 
 EnumCommand getCommand(const std::wstring& command)
@@ -581,10 +601,16 @@ EnumCommand getCommand(const std::wstring& command)
         }
         case L'h':
         {
-            if (command.size() == 1 || command == L"help")
+            if (command.size() == 1)
+            {
+                return HelpShortCommand;
+            }
+
+            if (command == L"help")
             {
                 return HelpCommand;
             }
+
             break;
         }
         case L'l':
index 5cbb366..f11a0d2 100644 (file)
@@ -675,18 +675,20 @@ void* scilabReadAndStore(void* param)
 
             if (ConfigVariable::getEnableDebug())
             {
+                bool disableDebug = false;
                 char* tmpCommand = NULL;
+                int commandsize = strlen(command);
 
                 //all commands must be prefixed by debug except e(xec) (r)un or p(rint) "something" that become "something" or disp("something")
                 if (strncmp(command, "e ", 2) == 0 || strncmp(command, "r ", 2) == 0)
                 {
                     tmpCommand = os_strdup(command + 2);
                 }
-                else if (strncmp(command, "exec ", 5) == 0)
+                else if (commandsize >= 5 && strncmp(command, "exec ", 5) == 0)
                 {
                     tmpCommand = os_strdup(command + 5);
                 }
-                else if (strncmp(command, "run ", 4) == 0)
+                else if (commandsize >= 4 && strncmp(command, "run ", 4) == 0)
                 {
                     tmpCommand = os_strdup(command + 5);
                 }
@@ -700,19 +702,37 @@ void* scilabReadAndStore(void* param)
                         continue;
                     }
                 }
-                else if ((command[0] == 'p') && command[1] == ' ')
+                else if (commandsize > 1 && command[0] == 'd' && command[1] == ' ')
                 {
                     std::string s("disp(");
                     s += command + 2;
                     s += ")";
                     tmpCommand = os_strdup(s.data());
+                    disableDebug = true;
                 }
-                else if (strncmp(command, "disp ", 5) == 0)
+                else if (commandsize > 5 && strncmp(command, "disp ", 5) == 0)
                 {
                     std::string s("disp(");
                     s += command + 5;
                     s += ")";
                     tmpCommand = os_strdup(s.data());
+                    disableDebug = true;
+                }
+                else if (commandsize > 1 && command[0] == 'p' && command[1] == ' ')
+                {
+                        std::string s("disp(");
+                        s += command + 2;
+                        s += ")";
+                        tmpCommand = os_strdup(s.data());
+                        disableDebug = true;
+                }
+                else if (commandsize > 6 && strncmp(command, "print ", 6) == 0)
+                {
+                    std::string s("disp(");
+                    s += command + 6;
+                    s += ")";
+                    tmpCommand = os_strdup(s.data());
+                    disableDebug = true;
                 }
                 else
                 {
@@ -723,6 +743,11 @@ void* scilabReadAndStore(void* param)
 #else
                     os_sprintf(tmpCommand, "%s %s", "debug", command);
 #endif
+                    disableDebug = true;
+                }
+
+                if (disableDebug)
+                {
                     //disable debugger time to exec debug command
                     //it will be enable in debuggervisitor, after execution
                     ConfigVariable::setEnableDebug(false);