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 与源码数据。按这个顺序看即可:
在 Trace 中选择 flash callback。
2查看源码确认这一步依次做了什么。
3核对上下文用 Call Stack 和 Information 验证。
4继续追踪沿 Trace 查看后续质押、交换和 unwrap。
找到回调
展开 UniswapV3Pool.flash(...),选择 uniswapV3FlashCallback(...)。确认 From 是 Pool、To 是中间合约。
查看源码
选中后,Editors 会打开 XPepeExploit.sol。这里依次执行质押提取、交换 WETH、再转出 ETH。
核对上下文
在 Call Stack 中确认路径 flash → uniswapV3FlashCallback;在 Information 中核对本次调用的参数。
继续追踪
继续查看 TokenStaker.stake(...)、withdrawAll()、Pool.swap(...) 和 WETH.withdraw(...),理解质押、交换和 unwrap 的顺序。最后用 State Changes 确认实际写入的状态。
注意
- 源码定位依赖合约验证、编译信息和 Source Map;没有这些信息时,仍可使用 Trace、参数和原始数据继续分析。
- Call Stack 表示嵌套关系;同级调用的先后顺序以 Execution Trace 为准。
- Source Debugger 解释执行过程;最终资产结果请查看 Balance Changes 或 Token Flow。
