forked from cosmos/cosmos-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
build: add remote debugging with delve (cosmos#10587)
## Description This is a feat and adds functionality for a developer to remote-debug a testnet node. This is made possible with `delve` remote debugging. I received some help from here: https://kupczynski.info/2020/05/17/remote-debug-go-code.html Also, @creachadair I made a tiny modification in the testnet file generation. I removed the `localnet` folder and simply let the `testnet init-files` to use the default `.testnets`, since this is also being `.gitignore`d in the repo, and we don't usually want these files in the main repo. Let me know if there are any implications to your update that you made a few days ago. --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting)) - [ ] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing) - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [ ] reviewed "Files changed" and left comments if necessary - [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [x] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [x] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [x] manually tested (if applicable)
- Loading branch information
Showing
6 changed files
with
153 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,14 @@ | ||
all: simd-env | ||
|
||
simd-env: | ||
docker build --tag cosmossdk/simd-env -f simd-env/Dockerfile \ | ||
$(shell git rev-parse --show-toplevel) | ||
simd-env: simd-rmi | ||
docker build --tag cosmossdk/simd -f simd-env/Dockerfile \ | ||
$(shell git rev-parse --show-toplevel) | ||
|
||
.PHONY: all simd-env | ||
simd-dlv: simd-rmi | ||
docker build --tag cosmossdk/simd -f simd-dlv/Dockerfile \ | ||
$(shell git rev-parse --show-toplevel) | ||
|
||
simd-rmi: | ||
docker rmi cosmossdk/simd 2>/dev/null; true | ||
|
||
.PHONY: all simd-env simd-dlv simd-rmi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
FROM golang:1.17-alpine AS build | ||
RUN apk add build-base git linux-headers libc-dev | ||
RUN go install github.com/go-delve/delve/cmd/dlv@latest | ||
WORKDIR /work | ||
COPY go.mod go.sum /work/ | ||
COPY db/go.mod db/go.sum /work/db/ | ||
RUN go mod download | ||
COPY ./ /work | ||
RUN LEDGER_ENABLED=false make COSMOS_BUILD_OPTIONS="debug,nostrip" clean build | ||
|
||
FROM alpine:3.14 AS run | ||
RUN apk add bash curl jq | ||
COPY contrib/images/simd-dlv/wrapper.sh /usr/bin/wrapper.sh | ||
|
||
VOLUME /simd | ||
COPY --from=build /work/build/simd /simd/ | ||
COPY --from=build /go/bin/dlv /usr/local/bin | ||
WORKDIR /simd | ||
|
||
EXPOSE 26656 26657 2345 | ||
ENTRYPOINT ["/usr/bin/wrapper.sh"] | ||
CMD ["start", "--log_format", "plain"] | ||
STOPSIGNAL SIGTERM |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
# Remote Debugging with go-delve | ||
|
||
[Delve](https://github.com/go-delve/delve) is a debugger for the Go programming language. The goal of the project is to provide a simple, full featured debugging tool for Go. Delve should be easy to invoke and easy to use. Chances are if you're using a debugger, things aren't going your way. With that in mind, Delve should stay out of your way as much as possible. | ||
|
||
## Use-case | ||
|
||
Cosmos-SDK provides you with a local network to bootstrap a chain in your machine, but how does one debug a node or module? | ||
|
||
If we start a single node, we won't be able to debug transactions as the machine will be in bootstrapping phase trying to find peers to connect too, thats why we need to start a local network. | ||
|
||
But the current `localnet-start` does not provide us with debugging tools so that's why there is a different image for debugging a local network, that is to avoid any issues in the future were debugging won't be needed. | ||
|
||
Both `simd-env` and `simd-dlv` work and run the same, except that `simd-dlv` uses `go-delve` to run the binaries. | ||
|
||
## How to use | ||
|
||
The command to start a local network in debug mode is: | ||
```shell | ||
# make localnet-debug | ||
``` | ||
|
||
The command to stop the local network and destroy its containers is: | ||
```shell | ||
# make localnet-stop | ||
``` | ||
__note: this works the same for both `localnet-start` and `localnet-debug`__ | ||
|
||
Now, by default only `simdnode0` is run in debug mode, but you can run any of the other nodes in debug mode by changing the `DEBUG` environment variable to `1` in `docker-compose.yml`. | ||
|
||
## How to connect | ||
|
||
Delve will open a port on `2345` for `simdnode0` and it will increment for each of the other nodes that have `DEBUG` set to `1`. | ||
|
||
You can connect to the debugging server either through [GoLand IDE](https://www.jetbrains.com/help/go/attach-to-running-go-processes-with-debugger.html) or you can use [delve cli](https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv_connect.md) command. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
#!/usr/bin/env sh | ||
set -euo pipefail | ||
set -x | ||
|
||
DEBUG=${DEBUG:-0} | ||
BINARY=/simd/${BINARY:-simd} | ||
ID=${ID:-0} | ||
LOG=${LOG:-simd.log} | ||
|
||
if ! [ -f "${BINARY}" ]; then | ||
echo "The binary $(basename "${BINARY}") cannot be found. Please add the binary to the shared folder. Please use the BINARY environment variable if the name of the binary is not 'simd'" | ||
exit 1 | ||
fi | ||
|
||
export SIMDHOME="/data/node${ID}/simd" | ||
|
||
if [ "$DEBUG" -eq 1 ]; then | ||
dlv --listen=:2345 --continue --headless=true --api-version=2 --accept-multiclient exec "${BINARY}" -- --home "${SIMDHOME}" "$@" | ||
elif [ "$DEBUG" -eq 1 ] && [ -d "$(dirname "${SIMDHOME}"/"${LOG}")" ]; then | ||
dlv --listen=:2345 --continue --headless=true --api-version=2 --accept-multiclient exec "${BINARY}" -- --home "${SIMDHOME}" "$@" | tee "${SIMDHOME}/${LOG}" | ||
elif [ -d "$(dirname "${SIMDHOME}"/"${LOG}")" ]; then | ||
"${BINARY}" --home "${SIMDHOME}" "$@" | tee "${SIMDHOME}/${LOG}" | ||
else | ||
"${BINARY}" --home "${SIMDHOME}" "$@" | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters