代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

MATLAB中的调试

  •  0
  • Tim unnamed eng  · 技术社区  · 15 年前

    我喜欢使用命令在matlab中进行调试。一些问题:

    1. 如果选择堆栈,是否可以直接跳到特定的堆栈,而不是使用dbup和dbdown逐个移动堆栈?
    2. 在跳到中间堆栈之后,如果我执行一些命令,为什么它会自动返回到最内部的堆栈?在发出命令离开到另一个堆栈之前,我可以一直呆在中间堆栈吗?
    1 回复  |  直到 11 年前
        1
  •  2
  •   Andrew Janke    15 年前

    1)不是从键盘。如果您正在使用编辑器并显示编辑器工具栏,那么会有一个“堆栈”下拉列表显示整个调用堆栈,您可以跳转到任意级别。通过查看下拉列表中的内容,您可能可以将n级dbup/dbdown合并在一起,但由于调试器与用于脚本编写的m代码之间的交互作用,从matlab中很难编写调试器控件的脚本。

    2)如果您从“k>>”调试器提示下发出命令,当它完成时,应该像您期望的那样返回您从中发出的堆栈级别。是否仍然在代码的底层设置了断点?可能您实际上看到了嵌套调用堆栈中断点处的辅助调试器“k>>”提示。基本上可以有多个嵌套的调试器上下文。

    例如:

    function f1
    f2();
    function f2()
    f3();
    function f3()
    f4();
    function f4()
    disp('Hello world');
    

    如果您像这样将它放入调试器中,您将碰到调用堆栈底部的断点,该调用堆栈本身是从原始调试器会话启动的。

    >> dbstop in f1 at 8
    >> f1()
    8   disp('Hello world');
    K>> dbup
    In workspace belonging to f1>f3 at 6
    K>> dbup
    In workspace belonging to f1>f2 at 4
    K>> f1()
    8   disp('Hello world');
    K>> dbstack
    > In f1>f4 at 8
      In f1>f3 at 6
      In f1>f2 at 4
      In f1 at 2
      In f1>f4 at 8
      In f1>f3 at 6
      In f1>f2 at 4
      In f1 at 2
    K>> 
    

    执行dbquit(退出嵌套的调试器会话)将使您返回到原始调用堆栈的中间位置。

    K>> dbquit
    K>> dbstack
      In f1>f4 at 8
      In f1>f3 at 6
    > In f1>f2 at 4
      In f1 at 2
    K>> 
    

    如果从“k>>”中退出,则控制流将从调用堆栈的底部继续,在该堆栈中最初引发断点,而不管k>>正在查看哪个堆栈帧。不能使用调试器更改正在执行的主线代码的控制流。