用于程序调试中的变量跟踪的方法和系统的制作方法_3

文档序号:9921952阅读:来源:国知局
的第一变量,以获得第二表达式。更具体地,在此例中,第一表达式“suspect >= O”中的第一变量“suspect”被替换为赋值表达式“suspect+2”。由此,获得的第二表达式是“suspect+2 > = O”。
[0050]在此示例中,包含赋值表达式“suspect+2”的赋值语句是语句216。第二表达式“suspect+2 >= O”在赋值语句216之前的语义等同于第一表达式“suspect >= O”在该赋值语句216之后的语义。换言之,如果表达式“suspect+2 >= O”在语句216之前成立,则表达式“suspect >= O”在语句216之后也成立;反之亦然。这种语义的等效性保证了表达式监测的正确性和有效性。
[0051 ] 特别地,在一个实施例中,调试器可以通过对赋值表达式进行代码外提(outIine)技术,来实现所监测表达式的变化。另外,在某些情况下,在确定第二表达式时可能需要更新待跟踪的变量,这方面的实施例将在下文结合具体示例描述。
[0052]可以理解,在某些情况下,在对程序代码的逆向扫描中,方法400可被迭代地执行一次或多次。例如,在图2所示的示例,方法400可以从语句216开始,继续向上执行逆向扫描。此时,在当前的步骤S440处确定的第二表达式,将在后续逆向搜索中被用作的监测目标。
[0053]仍然讨论图2所示的示例,其中方法400从语句216开始继续向上执行逆向扫描。换言之,方法400被第二次执行。此时,可以在步骤S410处确定:第一变量仍然是“suspect” (先前的执行过程并未更新待跟踪的变量),与之关联的第一表达式是方法400的上一轮执行中在步骤S440处确定的第二表达式“suspect+2 >= O”。
[0054]在步骤S420,从语句216向上搜索对变量“suspect”赋值的语句。响应于找到赋值语句214中所包含的赋值表达式“show”,在步骤S430,在赋值语句214之后设置与第一表达式“suspect+2 >= O”相关联的监测点。例如,在一个实施例中,可以在赋值语句214之后插入语句 “assert (suspect+2 > = O) ”。
[0055]在步骤S440,基于第一表达式“suspect+2 >= O”和赋值表达式“show”来确定将在后续扫描中使用的第二表达式。此时,赋值表达式涉及不同于第一变量“suspect”的第二变量“show”。根据本发明的实施例,在这种情况下,将会触发对待跟踪变量的更新。具体而言,在后续扫描中的待跟踪目标从当前的第一变量“suspect”被更新为第二变量“show”。也就是说,在方法400的下一轮执行中,在步骤S410处确定的第一变量将是当前轮次中的第二变量“show”。
[0056]相应地,第一表达式中先前的第一变量将被赋值表达式中包括的第二变量所取代,从而生成在后续扫描中作为监测目标的第二表达式。在此例中,第一表达式“suspect+2>=O”中的第一变量“suspect”被替换为第二变量“show”。由此,得到的第二表达式是“show+2 > = O”。
[0057]可以理解,在某些情况下,在当前轮次的逆向扫描中找到的赋值表达式可能同时涉及当前所跟踪的第一变量以及不同于第一变量的第二变量。此时,在一个实施例中,可以在后续逆向扫描中跟踪第一变量和第二变量二者。
[0058]作为跟踪目标的第一变量的更新不仅可以由语句214所包含的简单赋值表达式所触发,还可以由赋值函数触发。例如,在图2所示的示例中,在后续扫描中可以确定下一赋值语句是语句212。在赋值语句212中,用于对第一变量“suspect”赋值的赋值表达式是赋值函数“find_suspect O ”,而且函数find_suspect230所返回的是不同于suspect的变量candidate。
[0059]此时,在一个实施例中,赋值表达式被认定为涉及了不同的变量。换言之,此时,赋值函数所返回的变量是第二变量。该第二变量将被设置为在下一轮中待跟踪的目标变量。相应地,在步骤S440处,可以利用第二变量替换第一表达式中的第一变量,从而获得在后续扫描中待监测的第二表达式。具体而言,在图2的示例中,第一表达式“suspect+2>=O”中的第一变量“suspect”被替换为第二变量“candidate”,以得到第二表达式“candidate+2 > = O”。
[0060]另外,根据本发明的实施例,响应于赋值表达式包含赋值函数,逆向扫描的目标函数将发生更新。具体而言,该赋值函数将被确定为用于后续逆向扫描的目标函数。作为示例,在图2的示例中,逆向扫描原本在函数police_chase中执行。也即,函数police_chase是目标函数。响应于找到赋值语句212中的第二表达式“fincLsuspectO ”,目标函数从函数police_chase 210 被更新为函数 find_suspect 230。
[0061]由此,在方法400的下一轮执行中,将在函数find_suspect中执行逆向扫描,其中作为跟踪目标的第一变量是candidate,与之关联的第一表达式是“candidate+2 > =O”。这样,响应于在函数find_suspect中的语句235处搜索到对变量candidate进行赋值的赋值表达式,在赋值语句235之后插入与第一表达式相关联的断点,例如,断言语句“assert(candidate+2 > = O)”。
[0062]方法400可以被迭代地执行,直到完成对所调试的程序代码的扫描。以此方式,可以自动地在程序代码中的适当位置设置监测点。在调试过程中,可以有效而高效地实现变量的动态跟踪,找到变量值异常的根源。
[0063]作为示例,通过使用方法400来处理图2所示的代码片段200,可以得到图5所示的代码片段500。在代码片段500中,断言语句510、520、530和540是自动设置的监测点。
[0064]下面讨论用于方法400的若干可选的预处理,即,方法300中的步骤S310。在一个实施例中,预处理可以包括别名(alias)处理。可以理解,在程序代码中,一个变量可能存在一个或多个变量别名,也即,这些名称不同的变量共享相同的存储空间地址。别名的存在可能导致跟踪的错误。例如,如果没有对别名变量进行识别和跟踪,可能无法准确地找到导致变量值异常的根源。
[0065]为此,在一个实施例中,可以在逆向扫描之前,在程序代码中确定步骤S410处确定的第一变量的别名变量。可以通过任何适当的技术手段来确定程序代码中的第一变量的别名变量。例如,可以确定在程序代码中是否存在对第一变量的地址引用。作为示例,假设第一变量是整型变量a。如果存在另一整型变量b被声明为“int&b = a”,则b是a的地址引用,并且因此是a的别名变量。也就是说,修改变量b的值将会引起变量a的值改变。
[0066]备选地或附加地,还可以检查在程序代码中是否存在与第一变量相关联的指针、联合(un1n)、以传指针的方式进行的函数调用、对全局变量的局部修改,等等。如果存在上述情况中的一个或多个,则可以认为程序代码中存在第一变量的别名变量。
[0067]响应于存在别名变量,在逆向扫描中,除了第一变量本身之外,还可以确定是否存在对别名变量进行赋值的赋值表达式。例如,在一个实施例中,可以维护与第一变量相关联的别名变量表。别名变量表可以记录每个别名变量的变量名及其有效命名空间。这样,在逆向扫描中,可以基于别名变量表将别名变量纳入考虑。具体而言,如果找到对别名变量进行赋值的赋值表达式,则可以在该赋值表达式之后插入相应的监测点,以及可选地更新跟踪目标变量和监测目标表示。以此方式,可以避免在扫描过程中漏检导致变量值异常的根源。
[0068]备选地或附加地,在一个实施例中,步骤S310处的预处理还可以包括对控制流(control flow)的处理。可以理解,在程序代码中,某些控制流语句可能导致特定的赋值语句被跳过和/或执行多次。此时,可能无法在静态分析中准确地确定赋值语句是否被执行以及被执行多少次。这不利于变量的跟踪。
[0069]为此,在一个实施例中,例如可以在调试过程中实际地执行程序代码。在程序代码的执行中,可以收集与对第一变量进行赋值的赋值表达式相关联的控制流的运行时(runtime)信息。继而,在基于第一表达式和赋值表达式确定第二表达式中(步骤S440),可以将所收集的运行时控制流信息纳入考虑。
[0070]仅仅出于说明之目的,参考图6讨论一个循环控制流的示例。在图6所示的程序代码600中,存在while循环块610。在循环块610中,当变量cond为真时,执行赋值语句“val = val+l”,其中val是待跟踪的变量。在这
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1