# Debugging Dart Hooks

When a build[^1] hook isn't working as expected, you can investigate the
intermediate files generated by the Dart and Flutter SDK build process. These
files provide insight into the inputs, outputs, and any errors that occurred
during the hook's execution.

## Key Debugging Directory

All debugging artifacts are stored within the `.dart_tool` directory of your
project. The hook runner generates a unique folder for each hook execution,
containing temporary and output files.

You can find the most important debugging files in a subdirectory specific to
your hook's execution. The path is of the form
`.dart_tool/hooks_runner/<package_name>/<some_hash>/`, where `<package_name>`
is the name of the package containing the hook. For example, for a hook in a
package named `sqlite`, it would be
`.dart_tool/hooks_runner/sqlite/221e109fbc/`.

When you run a build, hooks for all dependencies are executed, so you might see
multiple package directories.

The `<some_hash>` is a checksum of the hook's configuration. If you are unsure
which hash directory to inspect within your package's hook directory, you can
delete the `.dart_tool/hooks_runner/<package_name>/` directory and re-run the
command that failed. The newly created directory will be for the latest
invocation.

Inside this directory, you will find:

* `input.json`: Contains the exact configuration and data passed *into* your
  build hook. Reviewing this helps confirm if the hook is receiving the expected
  build configuration.
* `output.json`: This file stores the JSON data that your build hook *produced*
  as its result.
* `stdout.txt`: Captures any standard output from your build hook. This is where
  messages from a logger or `print` statements will appear.
* `stderr.txt`: Captures any error messages or exceptions thrown during the
  hook's execution.

## Using a Debugger

To step through your code with a debugger, run the build hook from its source
file and provide the `input.json` via the `--config` flag. This allows you to
set breakpoints in your IDE and inspect the hook's execution.

For example:

```sh
dart run hook/build.dart --config .dart_tool/hooks_runner/your_package_name/some_hash/input.json
```

Make sure to replace `hook/build.dart`, `your_package_name`, and
`some_hash` with the actual paths from your project.

## VS Code Launch Configuration

To debug in VS Code, you can create a `launch.json` file in a `.vscode`
directory in your project root. This allows you to run your hook with a
debugger attached.

Here is an example configuration:

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Hook",
      "type": "dart",
      "request": "launch",
      "program": "path/to/your/hook/build.dart",
      "args": [
        "--config",
        ".dart_tool/hooks_runner/your_package_name/some_hash/input.json"
      ]
    }
  ]
}
```

Again, make sure to replace `path/to/your/hook/build.dart`,
`your_package_name`, and `some_hash` with the actual paths from your project.
After setting this up, you can run the "Debug Hook" configuration from the
"Run and Debug" view in VS Code.

[^1]: This debugging strategy also works for other hooks than build hooks, but
    this documentation focuses specifically on build hooks.
