LLDB-计算执行线程或执行功能的步骤数,例如main(),然后跳到第X步

问题描述 投票:0回答:2

(1)是否可以计算使用LLDB执行函数或线程所需的步骤数?

例如,

#include<stdio.h>

int main()
{
    printf("\n\n\t\tStudytonight - Best place to learn\n\n\n"); // step count:  1

    int number;
    int number2;
    int number3;
    number = 50; // step count:  2  (lldb skips declarations)
    number = 60; // step count:  3
    /*
        Comment comment
    */
    if(number < 100) // step count:  4  (lldb skips comments)
        printf("Number is less than 100!\n"); // step count:  5
    else if(number == 100)
        printf("Number is 100!\n");
    else
        printf("Number is greater than 100!\n");

    printf("\n\n\t\t\tCoding is Fun !\n\n\n"); // step count:  6  (the lines that are not executed bec of branching are not counted.)

    return 0; // step count:  7
}

上面的代码的注释中提供了步数。而且我只算步数。

步数对于每次代码执行都是唯一的,并且如果命令行参数和环境变量发生更改并影响程序的控制流程,则步数将发生变化。

如果存在循环,则每次迭代都意味着再次对循环中的行进行计数。因此,如果每个迭代有2个步骤,并且有10个迭代,则该循环有20个步骤。

(2)(尽管我只计算了跨步操作,但我很欣赏答案,这些回答也告诉我如何在需要时配置为包括跨步操作,或者在不需要时将其排除。)

(3)此外,在该步骤计数中是否有跳到特定步骤的方法?这样,我想到了jump命令和How to skip a couple of lines code with lldb?

但是,如果代码有循环该怎么办?说:

for (i = 1; i < 11; ++i)
  {
    printf("%d ", i);
  }
  return 0;
}

有6条静态代码行(也计算所有仅带大括号的代码)。但是,步骤数可能为21。例如,我希望跳到第十步。 lldb是否可以?

lldb
2个回答
0
投票

在大多数情况下,可以使用断点来代替计算步骤和执行已计算的步骤数。例如,在for循环示例中,可以将断点配置为仅在正确的条件下停止。

对于这些示例,我假设printf位于file.c的第23行。

要在循环中途停止,而不是执行许多next命令,仅当循环索引i是所需的数目时,才可以使用断点条件来停止:

b file.c:23
breakpoint modify --condition 'i == 5'

条件表达式是由lldb求值的,因此根据需要可以更复杂。

在这种情况下,由于条件是一个计数,因此,另一种方法是在断点上设置忽略计数:

b file.c:23
breakpoint modify --ignore-count 5

注意:代替--condition--ignore-count,也可以使用-c-i


0
投票

另一种计算步数的方法是编写脚本化的步调计划,该计划将不断推动新的“步入”或“跨步”计划,直到达到终止条件为止,并在每次结束单个步骤时更新一些python变量。有关编写脚本化线程计划的更多信息,请参见:

https://lldb.llvm.org/use/python-reference.html#using-the-python-api-to-create-custom-stepping-logic

这里有一些脚本化的步进计划示例:

https://github.com/llvm/llvm-project/blob/master/lldb/examples/python/scripted_step.py

我不太确定“跳到特定步骤”是什么意思。如果您只是想在此刻停止操作而不必手动干预,则可以根据需要的结束条件(第10行到达第20行,等等)制定脚本化的步进计划,将非常简单。

但是,如果您的意思是“在不进行中间代码的情况下进入执行阶段”,这不是一个小问题。 lldb如何知道到那时候修改了什么状态?例如,要进行循环的某个迭代,lldb将必须知道将循环计数器设置为该点当时没有的值。

© www.soinside.com 2019 - 2024. All rights reserved.