条件追踪

本节描述了 x64dbg 中的条件追踪功能。

操作概述

当追踪步骤被触发时,x64dbg 将执行以下操作:

  • 增加追踪计数器

  • 将系统变量 $tracecounter 设置为追踪计数器的值;

  • 如果设置了中断条件,则计算表达式(默认为 0);

  • 执行插件回调(允许插件更改中断条件);

  • 如果设置了日志条件,则计算表达式(默认为 1);

  • 如果设置了命令条件,则计算表达式(默认为中断条件);

  • 如果设置了日志文本日志条件计算结果为 1

  • 如果设置了命令文本命令条件计算结果为 1

    • 将系统变量 $tracecondition 设置为中断条件

    • 将系统变量 $tracelogcondition 设置为日志条件

    • 执行命令文本中的命令;

    • 中断条件将被设置为 $tracecondition 的值。因此,如果您在脚本中修改此系统变量,您将能够控制是否中断被调试程序。

  • 如果中断条件计算结果为 1

    • 打印标准日志消息;

    • 中断被调试程序并等待用户恢复。

除了上述操作外,x64dbg 还具有将追踪的指令记录到追踪视图以及更新追踪覆盖率的功能。这会在调试器单步执行或暂停时发生,也包括手动操作时。

警告:表达式中的所有数字默认按十六进制解释! 十进制请使用 .123

日志记录

日志可以被 x64dbg 格式化以记录程序的当前状态。请参阅格式化了解如何格式化日志字符串。如果您想记录所有追踪指令的地址和反汇编,可以使用 {p:cip} {i:cip}。要将日志重定向到文件,请使用 TraceSetLogFile,或使用图形界面。

追踪覆盖率

如果您使用基于追踪覆盖率的追踪选项(如 TraceIntoBeyondTraceCoverage),则中断条件的初始计算包括您指定的追踪覆盖率追踪类型。正常的中断条件可用于在追踪覆盖率条件满足之前中断。如果你想在条件中包含追踪覆盖率以获得完全控制,可以使用表达式函数

注意事项

您可以通过调试菜单中的"追踪跳过直到条件"/"追踪进入直到条件"命令启动条件追踪。

你不应该在断点命令中使用可能更改被调试程序运行状态的命令(如 run),因为这些命令在此处使用不稳定。您应该使用中断条件命令条件$tracecondition 代替。

当你使用追踪跳过时,被调试程序不会在已跳过的调用内部暂停,即使条件为真。其他操作(如日志记录和追踪记录)也不会执行。这使得追踪更快,但如果您需要这些操作,应该使用追踪进入

另请参阅