(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是否可以?
在大多数情况下,可以使用断点来代替计算步骤和执行已计算的步骤数。例如,在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
。
另一种计算步数的方法是编写脚本化的步调计划,该计划将不断推动新的“步入”或“跨步”计划,直到达到终止条件为止,并在每次结束单个步骤时更新一些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将必须知道将循环计数器设置为该点当时没有的值。