Foundry在测试环境中设置断点、逐步执行代码,并检查EVM状态(如栈、内存、调用等)
Foundry 是基于 Rust 的以太坊开发工具包,主要用于 Solidity 智能合约的测试、部署和调试。它内置了一个交互式调试器(通过 Forge),支持在测试环境中设置断点、逐步执行代码,并检查 EVM 状态(如栈、内存、调用等)。断点主要通过 cheatcode vm.breakpoint() 实现,而不是图形化 IDE 中的点击设置。下面是详细步骤
前提条件
步骤:使用内置 Forge 调试器设置断点和调试Foundry 的调试器是终端-based 的,支持在测试失败或特定点暂停执行。断点通过在代码中插入 cheatcode 来设置,然后在调试界面中使用快捷键导航。
在代码中设置断点:
在你的 Solidity 测试或合约代码中,导入 Forge Std 的 Test 和 Vm 接口(import {Test, Vm} from "forge-std/Test.sol";)。
在需要暂停的位置插入 vm.breakpoint("\<char>");,其中 \<char> 是小写字母(a-z),作为断点标签。例如:
solidity
// 在 test/MyTest.t.sol 中
import {Test, Vm} from "forge-std/Test.sol";
contract MyTest is Test {
function testExample() public {
// 一些代码...
vm.breakpoint("a"); // 设置标签 "a" 的断点
// 更多代码...
vm.breakpoint("b", false); // 可选:false 参数用于移除断点
}
}
启动调试器:
运行测试并启用调试模式:forge test --debug --match-test "\<regex>",其中 \<regex> 是测试函数的正则表达式(例如 testExample)。
如果是脚本调试,使用 forge script --debug \<script_path>。
调试界面和导航:
调试器打开后,终端分为四个象限:
颜色提示:
导航到断点:
其他快捷键:
在暂停时,你可以检查变量、栈、内存和调用栈,以诊断问题。
高级用法:
增加详细度:使用 forge test -vvvv 获取更多日志(trace),结合调试器使用。
操作码级调试:调试器支持逐 opcode 步进,适合低级分析。
updraft.cyfrin.io
测试失败处理:调试器会报告最后一个失败的断言(从 DSTest 或 cheatcodes)。
如果需要图形化界面,考虑 VS Code 扩展如 Simbolik(Runtime Verification 出品),它支持在 Foundry 项目中逐行步进、设置断点和变量检查。
marketplace.visualstudio.com
安装步骤:搜索 VS Code Marketplace 中的 "Simbolik",安装后在 Foundry 项目中启用 Solidity 调试配置(可能需要配置 launch.json)。
注意事项
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!