hardhat脚本调试必须配置launch.json并启用sourcemap,否则断点无效;需确保runtimeexecutable为npx、type为"node"、sourcemaps:true且outfiles匹配artifacts路径,同时tsconfig.json开启sourcemap并重新编译。

Hardhat 脚本在 VS Code 里设了断点却不停?不是代码问题,大概率是 launch.json 没配对、sourceMaps 没启用,或者根本没走调试通道——F5 按了但状态栏没显示「调试正在运行」,就等于没启动。
Hardhat 脚本调试必须用 launch.json,不能靠右键“运行”
VS Code 里直接右键 deploy.ts → “Run Code” 或点绿色三角(Code Runner),只会执行,不挂调试器。断点永远不会触发。
- 必须创建
.vscode/launch.json,且配置中runtimeExecutable明确指向npx,runtimeArgs包含hardhat run ${file} --network hardhat -
type必须是"node"(不是"pwa-node"),否则新版 VS Code 会静默失败 - 确认项目根目录下已安装
@nomicfoundation/hardhat-toolbox,否则npx hardhat命令可能找不到任务
sourceMaps 不开,断点全打在 artifacts/ 编译文件里
TypeScript 写的 Hardhat 脚本(如 scripts/deploy.ts)若没生成和映射 source map,VS Code 会把断点绑到 artifacts/ 下的 JS 文件上——你看到的是压缩变量名、错位行号,甚至停在空行。
-
tsconfig.json中必须有"sourceMap": true,且"outDir"与 Hardhat 默认输出路径不冲突(推荐保持默认artifacts/) -
launch.json中"sourceMaps": true和"outFiles"必须匹配:"outFiles": ["${workspaceFolder}/artifacts/**/*.js"] - 改完
tsconfig.json后要重新运行npx hardhat compile,否则旧产物无 map 文件
断点是空心红点?先看这三件事
行号旁红点是空心的,悬停提示 Unbound breakpoint,说明 VS Code 根本没把断点映射到可执行代码上。
- 检查右下角语言模式:必须是
TypeScript,不是Plain Text或JavaScript(.ts 文件被识别错会导致 source map 加载失败) - 确保文件已保存:未保存的 .ts 文件,VS Code 不会为其生成或加载 source map
- 确认
hardhat.config.ts中networks.hardhat存在且未被注释——--network hardhat参数依赖该配置启动本地节点,缺了就退化为普通 Node.js 执行,跳过 Hardhat 的编译与注入逻辑
调试时看不到合约变量或交易详情?别急着查文档
在 deploy.ts 里调用 await contract.deployed() 后设断点,想看 contract.address 却显示 undefined,不是合约没部署,而是你停在了 Promise 返回前。
- Hardhat 的合约对象是异步初始化的,
deployed()返回 Promise,断点得设在await行之后,或用调试控制台手动await contract.deployed()查值 - 想查看交易哈希或区块信息?在
ethers.ContractFactory.deploy()返回的deployTransaction对象上展开,别只盯着contract实例 - 如果用了
console.log输出地址但没看到日志,检查是否启用了 Hardhat 的loggingEnabled: true配置,否则底层日志被静默丢弃
最难调的永远不是语法错误,而是你以为断点生效了,其实调试器压根没连上 Hardhat 的执行上下文——每次按 F5 后盯一眼状态栏有没有「调试正在运行」,比反复重设断点有用十倍。











