1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 23:34:47 -05:00

docs: add debugger manual (#5265)

This commit is contained in:
Bartek Iwańczuk 2020-05-13 17:55:44 +02:00 committed by GitHub
parent 9c01403865
commit e9ce043b7c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 133 additions and 5 deletions

BIN
docs/images/debugger1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
docs/images/debugger2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
docs/images/debugger3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
docs/images/debugger4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
docs/images/debugger5.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
docs/images/debugger6.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
docs/images/debugger7.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

View file

@ -6,12 +6,12 @@ and TypeScript:
<!-- prettier-ignore-start -->
<!-- prettier incorrectly moves the coming soon links to new lines -->
- [test runner (`deno test`)](./testing.md)
- [code formatter (`deno fmt`)](./tools/formatter.md)
- [bundler (`deno bundle`)](./tools/bundler.md)
- [debugger (`--debug`)](./tools/debugger.md)
- [documentation generator (`deno doc`)](./tools/documentation_generator.md)
- [debugger (`--inspect, --inspect-brk`)](./tools/debugger.md)
- [dependency inspector (`deno info`)](./tools/dependency_inspector.md)
- [documentation generator (`deno doc`)](./tools/documentation_generator.md)
- [formatter (`deno fmt`)](./tools/formatter.md)
- [test runner (`deno test`)](./testing.md)
- linter (`deno lint`) [coming soon](https://github.com/denoland/deno/issues/1880)
<!-- prettier-ignore-end -->

View file

@ -1,3 +1,131 @@
## Debugger
<!-- TODO(lucacasonto): write things -->
Deno supports [V8 Inspector Protocol](https://v8.dev/docs/inspector).
It is possible to debug Deno programs using Chrome Devtools or other clients
that support the protocol (eg. VSCode).
To activate debugging capabilities run Deno with `--inspect` or `--inspect-brk`
flag.
`--inspect` flag allows to attach debugger at any point in time, while
`--inspect-brk` will wait for debugger being attached and pause execution on the
first line of code.
### Chrome Devtools
Let's try debugging simple program using Chrome Devtools; for this purpose we'll
use [file_server.ts](https://deno.land/std@v0.50.0/http/file_server.ts) from
`std`; a simple static file server.
Use `--inspect-brk` flag to break execution on the first line.
```shell
$ deno run --inspect-brk https://deno.land/std@v0.50.0/http/file_server.ts
Debugger listening on ws://127.0.0.1:9229/ws/1e82c406-85a9-44ab-86b6-7341583480b1
Download https://deno.land/std@v0.50.0/http/file_server.ts
Compile https://deno.land/std@v0.50.0/http/file_server.ts
...
```
Open `chrome://inspect` and click `Inspect` next to target:
![chrome://inspect](../images/debugger1.jpg)
It might take a few seconds after opening the devtools to load all modules.
![Devtools opened](../images/debugger2.jpg)
You might notice that Devtools paused execution on the first line of
`_constants.ts` instead of `file_server.ts`. This is an expected behavior and is
caused by the way ES modules are evaluated by V8 (`_constants.ts` is left-most,
bottom-most dependency of `file_server.ts` so it is evaluated first).
At this point all source code is available in the Devtools, so let's open up
`file_server.ts` and add a breakpoint there; go to "Sources" pane and expand the
tree:
![Open file_server.ts](../images/debugger3.jpg)
_Looking closesly you'll find duplicate entries for each file; one written
regularly and one in italics. The former is compiled source file (so in case of
`.ts` files it will be emitted JavaScript source), while the latter is a source
map for the file._
Add a breakpoint in `listenAndServe` method:
![Break in file_server.ts](../images/debugger4.jpg)
As soon as we've added the breakpoint Devtools automatically opened up source
map file, which allows us step through the actual source code that includes
types.
Let's send a request and inspect it in Devtools:
```
$ curl http://0.0.0.0:4500/
```
![Break in request handling](../images/debugger5.jpg)
At this point we can introspect contents of the request and go step-by-step to
debug the code.
### VSCode
Deno can be debugged using VSCode.
Official support in plugin is being worked on -
https://github.com/denoland/vscode_deno/issues/12
We can still attach debugger by manually providing simple `launch.json` config:
```json
{
"version": "0.2.0",
"configurations": [
{
"name": "Deno",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}",
"runtimeExecutable": "deno",
"runtimeArgs": ["run", "--inspect-brk", "-A", "<entry_point>"],
"port": 9229
}
]
}
```
**NOTE**: Replace `<entry_point>` with actual script name.
This time let's try with local source file, create `server.ts`:
```ts
import { serve } from "https://deno.land/std@v0.50.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
req.respond({ body: "Hello World\n" });
}
```
Change `<entry_point>` to `server.ts` and run created configuration:
![VSCode debugger](../images/debugger6.jpg)
![VSCode debugger](../images/debugger7.jpg)
### Other
Any client that implementes Devtools protocol should be able to connect to Deno
process.
### Limitations
Devtools support is still immature, there are some functionalities that are
known to be missing/buggy:
- autocomplete in Devtools' Console causes Deno process to exit
- profiling and memory dumps might not work correctly