TRACE32支持给程序断点、内存访问断点增加逻辑条件,只有CPU命中断点位置并且条件成立时才保持停止。调试循环变量、状态机、错误计数或指定寄存器值时,条件断点比反复手工继续运行更方便。条件已经配置却始终不停,通常要检查表达式类型、变量当前是否可访问、断点地址是否真正命中,以及目标芯片还能不能提供对应的硬件断点资源。
一、TRACE32怎么设置断点条件
TRACE32可以在断点窗口中直接填写条件,也可以通过【Break.Set】命令建立。C/C++变量建议优先使用【VarCONDition】,PRACTICE表达式则使用【CONDition】,两种写法不要混用。
1、在断点窗口中设置条件
①打开源码窗口,找到需要停止的代码位置。
②在目标源码行设置普通Program断点。
③打开该断点的高级设置页面。
④找到【Condition】输入区域。
⑤使用C/C++变量表达式时,保持【HLL】启用。
⑥例如变量x等于10并且y等于11时停止,可以填写【x==10&&y==11】。
⑦确认【Program】断点类型。
⑧保存断点并执行【Go】。
⑨程序命中断点位置后,TRACE32会检查条件,不满足时继续运行,满足时才保持停止。
2、使用Break.Set命令配置
①打开TRACE32命令行。
②针对函数入口设置C变量条件时,可以输入【Break.Set MyFunc/VarCONDition(x==10&&y==11)】。
③需要在指定源码行设置时,先确认该源码行存在有效机器指令。
④也可以使用函数名或符号地址作为断点位置。
⑤输入完成后执行【Break.List】。
⑥检查断点地址、类型和Condition是否已经显示。
⑦运行程序并制造满足条件的数据。
⑧观察CPU是否停在目标位置。
使用【VarCONDition】时,表达式按照高级语言变量处理,更适合源码级调试。
3、使用PRACTICE条件
①需要通过TRACE32函数读取变量时,使用【CONDition】。
②例如可以配置【Break.Set MyFunc/CONDition(Var.Value(x)==10.&&Var.Value(y)==11.)】。
③注意PRACTICE默认数值基数可能按十六进制解释。
④明确使用十进制数值时,可以按照PRACTICE语法在数值后增加【.】。
⑤需要检查CPU寄存器时,可使用【Register】函数,例如【Break.Set MyFunc/Program/CONDition Register(R0)==0】。
⑥保存后通过【Break.List】检查最终条件。
二、TRACE32条件断点不生效如何检查
条件断点没有停止时,先去掉条件验证普通断点。普通断点本身都无法命中,就没有必要继续修改条件表达式。
1、确认断点地址能够正常命中
①在【Break.List】中找到目标断点。
②暂时删除【VarCONDition】或【CONDition】。
③重新执行程序。
④确认普通断点能够停止CPU。
⑤如果仍不停,打开【List】或反汇编窗口检查实际执行地址。
⑥源码经过编译优化后,检查目标源码行是否还有对应指令。
⑦函数被内联时,改在实际生成的指令位置设置断点。
⑧普通断点恢复后,再重新加入条件。
2、检查条件变量当前是否有效
①让CPU先停在目标断点附近。
②打开变量窗口检查条件中的变量。
③确认局部变量当前处于作用域内。
④使用【Var.View】查看变量能否正常读取。
⑤变量显示不可用时,检查编译优化和调试符号。
⑥局部变量被编译器优化掉时,可以降低目标模块优化级别重新编译。
⑦重新加载ELF和符号后再设置条件断点。
⑧条件涉及指针时,先确认指针当前指向有效地址。
条件表达式只有在断点命中的位置能够正确求值,才能得到预期结果。把局部变量条件设在变量尚未建立或已经离开作用域的位置,很容易出现不生效。
3、检查VarCONDition和CONDition有没有混用
①打开【Break.List】检查当前条件类型。
②C源码变量表达式优先改为【VarCONDition】。
③使用【Var.Value】【Register】等PRACTICE函数时改为【CONDition】。
④通过GUI设置时,检查【HLL】状态。
⑤HLL启用时按照高级语言条件处理。
⑥HLL关闭时按照PRACTICE表达式处理。
⑦重新输入一个简短条件,例如只判断一个变量。
⑧单变量能触发后,再逐步增加组合条件。
三、条件正确但断点仍异常怎么继续检查
表达式和变量都正常以后,还可以继续检查断点实现方式。Flash、ROM以及某些实时运行环境不能随意写入软件断点指令,只能依赖芯片提供的On-chip断点资源。
1、检查硬件断点资源
①执行【Break.List】查看目标断点。
②发现断点显示为红色时,查看错误信息。
③出现【no on-chip breakpoint of this type possible】时,说明当前硬件无法提供这种断点。
④删除不再使用的On-chip断点。
⑤减少Program、Read和Write硬件断点数量。
⑥重新设置目标条件断点。
⑦再次执行【Go】检查是否还有【breakpoint configuration invalid】提示。
不同处理器提供的断点比较器数量和类型不同,具体资源要结合当前Processor Architecture Manual确认。
2、Flash区域断点检查实现方式
①确认目标程序位于RAM还是Flash。
②Flash不能直接修改时,检查当前断点是否需要使用【Onchip】实现。
③在目标架构支持的情况下,通过【Break.CONFIG】检查断点实现策略。
④需要强制指定某段地址使用On-chip断点时,可根据架构配置【MAP.BOnchip】。
⑤重新设置条件断点。
⑥用【Break.List】确认断点已经处于可用状态。
总结
TRACE32条件断点不生效时,先验证普通断点地址,再检查条件变量是否可读取、表达式属于高级语言还是PRACTICE语法,最后确认处理器的硬件断点资源。源码优化、变量作用域和Flash断点实现都可能让条件设置看起来正确却无法按预期停止。按断点地址、条件求值和硬件实现三个层次逐项验证,更容易找到实际原因。如需进一步了解TRACE32条件断点配置、变量条件判断与断点异常排查方法,欢迎联系咨询。