Source Debugger(源码调试器)

在同一个工作区中查看调用、源码、调用栈和变量。

Source Debugger 用来继续分析某一次合约调用。它不会重新执行交易,而是把已有的 Trace、源码和变量放在一起,帮助你确认“这一步做了什么”。

先认识工作区

Debugger 由以下几个区域组成:

区域用来做什么
Execution Trace选择要分析的调用,并查看它在交易中的位置
Sources浏览当前交易中可用的合约源码文件
Editors打开选中调用对应的源码位置
Call Stack查看这次调用是由哪些上层调用一路进入的
Information核对调用参数、返回值和 Contract Variables

先在 Execution Trace 选中一个调用。源码可用时,Editors 会打开对应文件;再用 Call Stack 和 Information 确认它的上下文。没有源码时,切换 Bytecode Mode,继续查看指令、Stack、Memory 和 Storage。

顶部导航按钮怎么用

Execution Trace 顶部的 Previous / Next / Step Out / Step Over 用于在调用树中移动:

按钮作用
Previous跳到当前 Trace 行之前的上一条可见调用。
Next跳到当前 Trace 行之后的下一条可见调用。
Step Out跳到当前调用的父调用,用于回到上层合约上下文。
Step Over跳到当前调用的下一个同级调用,跳过当前调用内部的嵌套调用。

例如,正在查看 UniswapV3Pool.flash(...) 内的回调时,使用 Step Out 可以回到 flash(...);使用 Step Over 可以继续查看该层的下一次调用。到达可移动范围的边界时,对应按钮会不可用。

跟着一个例子操作

下面直接复用了 Debugger 页面组件,并为这笔交易提供了本地 Trace 与源码数据。按这个顺序看即可:

找到回调

展开 UniswapV3Pool.flash(...),选择 uniswapV3FlashCallback(...)。确认 From 是 Pool、To 是中间合约。

查看源码

选中后,Editors 会打开 XPepeExploit.sol。这里依次执行质押提取、交换 WETH、再转出 ETH。

核对上下文

Call Stack 中确认路径 flashuniswapV3FlashCallback;在 Information 中核对本次调用的参数。

继续追踪

继续查看 TokenStaker.stake(...)withdrawAll()Pool.swap(...)WETH.withdraw(...),理解质押、交换和 unwrap 的顺序。最后用 State Changes 确认实际写入的状态。

注意

  • 源码定位依赖合约验证、编译信息和 Source Map;没有这些信息时,仍可使用 Trace、参数和原始数据继续分析。
  • Call Stack 表示嵌套关系;同级调用的先后顺序以 Execution Trace 为准。
  • Source Debugger 解释执行过程;最终资产结果请查看 Balance Changes 或 Token Flow。

下一步