调试器

调试交易的时候,调试器会显示合约的状态。

可以对Remix上创建的交易进行调试,也可以提供一个交易哈希。使用交易哈希的时候要保证你有这个合约的源码或者你输入了已经验证过的合约的地址。

启动调试会话:

  • 当终端里出现了成功或者失败的交易时, 点击 Debug(调试)按钮。Debugger(调试器)被激活,然后在 侧面板 里进行显示。

  • 激活 插件管理器中的Debugger(调试器),然后点击图标面板中的Debugger(调试器)按钮。 想要启动调试会话, 输入已部署交易的地址 - 在编辑器中有源代码,然后点击 Start debugging(开始调试) 按钮。

调试器将在编辑器中高亮显示相关的代码。 如果你想关掉调试器的高亮去编辑代码,请点击 Stop Debugging(停止调试) 按钮。

要了解更多关于如何使用此工具的信息,请前往 调试交易 页面。

此页面将介绍调试器的“Use generated sources(使用生成的源代码)”选项,以及它的导航和面板。

使用生成的源代码

这个选项适用于使用 Solidity 0.7.2 或更高版本的合约。有关[生成源]的更多详细信息,请参阅 Solidity 博客(https://blog.soliditylang.org/2020/09/28/solidity-0.7.2-release-announcement/#notable-new-features)。

使用 生成的源代码 将使审核合约更加容易。当选中该选项时,您可以在调试时进入那些编译器输出。

这些编译器输出将出现在 Remix 编辑器中的单独 .yul 文件中。

调试器导航

滚动条和按钮

滚动条

移动滚动条将高亮 编辑器 中的相关代码。在最精细的级别上,它会滚动交易的操作码( 请参见下面的操作码部分 )。在每个操作码处,交易的状态更改,并且这些更改将反映在 调试器面板 中。

单步执行并返回

此按钮转到上一个操作码。如果上一步涉及一个 函数调用 ,不会进入到函数中。

回退一步

此按钮会返回到上一个操作码。

逐步执行

此按钮会进入到下一个操作码。如果下一行包含函数调用, 逐步执行 会进入此函数。

向前跳过

此按钮会跳转到下一个操作码。如果下一步包含 函数调用 ,调试器不会进入到此函数中。

跳转到上一个断点

可以在编辑器的边距处放置断点。如果当前调用的步骤已经通过了断点,则此按钮将会将滚动条移动到最近通过的断点。

跳出

当您处于调用状态并单击此按钮时,滚动条将移动到该调用的末尾。

跳转到下一个断点

如果代码中存在一个断点,则此按钮会将移动到该断点。

调试器面板

函数堆栈

Function stack 列出交易中涉及到的函数列表。

Solidity Locals

Solidity Locals是指函数内部的本地变量。

Solidity 状态

这些是合约的状态变量。

操作码

该面板显示了调试器当前所在的步骤编号和 操作码(opcode)

当您拖动导航按钮上面的 滚动条 时,焦点步骤编号和操作码会发生变化。

步骤详情

步骤详情显示更多关于当前码步骤操作的信息。

堆栈

此面板显示EVM Stack信息。

更多关于 stack 的信息。

内存

每次新的调用内存都会被清除。内存是线性的,可以按字节级寻址。 读取 的宽度限制为256位,而 写入 可以是8位或256位。

内存面板由三列组成。为了让格式正确,你可以将Remix的侧面板稍微扩大一些。(将主面板和侧面板之间的边界向右拖动)。

第一列是内存中的位置。第二列是十六进制编码的值。第三列是解码后的值。如果没有值,则会显示问号(?)。

0x10: 00000000000000000000000000000000 ????????????????

这是一个完整的 Memory 面板示例,

一些地址槽包含十六进制编码的值,这些值随后会被解码。例如,检查位置 0xa00x140

存储

这是永久存储。

调用堆栈

所有计算都在一个名为“调用栈”的数据数组上执行。它最大为1024个元素,每个元素包含256位的字。

调用数据

调用数据包含函数参数。

返回值

指向函数返回的值。

完整存储变更

这显示了函数结束时的持久化存储。

断点

可以在编辑器的边栏放置断点来暂停调试器。

附加信息

调试器提供精细的信息,能够向用户详细说明交易的发生情况 - 因此,调试器不仅适用于调试,还是一种极好的教学工具。

要了解如何使用调试器,请前往调试交易