How can I debug specific functions? - go

I have a website that has several different functions . I can get to my website by using localhost:5000/ , when I run it in debug mode using vscode-go debugger I get the following message
API server listening at: 127.0.0.1:52238
I have a Name function that returns several strings but I can not hit the breakpoint in debug mode . I put a breakpoint in my Name function and put the url as follows: 127.0.0.1:52238/name however it does not hit the breakpoint. What could be going on here ? My code is below if i run the application normally and put http://localhost:5000/name then everything works but in debug mode this 127.0.0.1:52238/name does not hit the breakpoint or page . I am using Go as a backend api so I'll need to hit url endpoints to see what's going on. Is there someway that I can make the debug port also :5000 ?
-- Main
package main
import (
"github.com/gorilla/mux"
"runtime"
"./Models"
"./Controllers"
)
func main() {
Controllers.CircleRoutes(r)
srv := &http.Server{
ReadTimeout: 20 * time.Second,
WriteTimeout: 20 * time.Second,
IdleTimeout: 120 * time.Second,
Addr: ":5000",
}
srv.ListenAndServe()
}
// Circles Route
package Controllers
func Name(w http.ResponseWriter, r *http.Request) {
var result string
r.ParseForm()
result = "Success"
io.WriteString(w, result)
}
func CircleRoutes(r *mux.Router) {
r.HandleFunc("/name", Name)
}

It looks you are using vscode-go debugger.
You can configure the port from launch.json configuration file from your vscode.
The config should look like this:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",
"program": "${workspaceRoot}",
"env": {
"GOPATH": <your GOPATH>
},
"args": [],
"showLog": true
}
],
"go.lintTool": "gometalinter"
}
You can change port from above settings. To find launch.json, just ctrl+P and type launch.json it will show dropdown result of search in your vscode.

Related

Fail to use the Go Delve debugger with VSCode

This is my first day with the Go language and I wanted to debug a simple REST API.
package main
import (
"fmt"
"log"
"net/http"
)
func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Homepage EndPoint Hit")
}
func handleRequests() {
http.HandleFunc("/", homePage)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func main() {
handleRequests()
}
Here is my debug configuration
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch file",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceRoot}"
}
]
}
The settings.json is
{
"redhat.telemetry.enabled": true,
"vs-kubernetes": {
"vscode-kubernetes.helm-path.mac": "/Users/gsinha/.vs-kubernetes/tools/helm/darwin-amd64/helm"
},
"go.toolsManagement.autoUpdate": true,
"files.autoSave": "afterDelay",
"code-runner.clearPreviousOutput": true,
"code-runner.runInTerminal": true,
"code-runner.saveAllFilesBeforeRun": true
}
When I try to start a debug session using F5, I get this error.
Starting: /Users/gsinha/go/bin/dlv-dap dap --listen=127.0.0.1:54320 --log-dest=3
DAP server listening at: 127.0.0.1:54320
Build Error: go build -o /Users/gsinha/go/src/rest/__debug_bin -gcflags all=-N -l /Users/gsinha/go/src/rest
go tool: no such tool "compile"
go tool: no such tool "compile"
go tool: no such tool "compile"
go tool: no such tool "compile" (exit status 2)
I am able to run the application but when I try to start a debug session it fails unexpectedly.
Check your go env, the compile file should be in path GOTOOLDIR.
If not, check your go installation.
Maybe helpful: All of a sudden go tool: no such tool "compile"
--- update ---
It should be a go env problem.
Could u check go env and go build using the vscode internal terminal?
Have u ever chose go sdk version in vscode?

Simple Go code running straight from command line but causing "Not able to determine import path" on VS Code

It is my first time coding in Go. I am following an example and I succesfully can run the small applcation bellow. But I can't find a reason for not been ran in Visual Studio Code. So far I can see, I follow the suggestion found in this answer saying: "... Since your package is outside of $GOPATH, you may need to create a module file. You'll need to init your go module using".
go.mod
module jimis.net/snippetbox
go 1.15
main.go
package main
import (
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", home)
mux.HandleFunc("/snippet", showSnippet)
mux.HandleFunc("/snippet/create", createSnippet)
log.Println("Starting server on :4000")
err := http.ListenAndServe(":4000", mux)
log.Fatal(err)
}
handlers.go
package main
import (
"fmt"
"net/http"
"strconv"
)
func home(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
http.NotFound(w, r)
return
}
w.Write([]byte("Hello from Snippetbox"))
}
func showSnippet(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(r.URL.Query().Get("id"))
if err != nil || id < 1 {
http.NotFound(w, r)
return
}
fmt.Fprintf(w, "Display a specific snippet with ID %d...", id)
}
func createSnippet(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
w.Header().Set("Allow", http.MethodPost)
http.Error(w, "Method Not Allowed", 405)
return
}
w.Write([]byte("Create a new snippet..."))
}
launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}",
"env": {},
"args": []
}
]
}
output
Starting linting the current package at c:\WSs\snippetbox\cmd\web
Starting "go vet" under the folder c:\WSs\snippetbox\cmd\web
Starting building the current package at c:\WSs\snippetbox\cmd\web
Not able to determine import path of current package by using cwd: c:\WSs\snippetbox\cmd\web and Go workspace:
C:\WSs\snippetbox\cmd\web>Finished running tool: C:\Go\bin\go.exe vet .
C:\WSs\snippetbox\cmd\web>Finished running tool: C:\Go\bin\go.exe build -i -o C:\Users\DEMETR~1.EXT\AppData\Local\Temp\vscode-go7pNgfo\go-code-check .
Project structure (pkg and ui folder are emptys)
VS Code settings.json
{
"workbench.startupEditor": "newUntitledFile",
"editor.minimap.enabled": false,
"go.formatTool": "goimports",
"explorer.confirmDelete": false,
"go.toolsEnvVars": {
"GO111MODULE": "on" /// *** I tried both on and off with no changes on my issue
}
}
go env
PS C:\WSs\snippetbox> go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\aa.bb.ext\AppData\Local\go-build
set GOENV=C:\Users\aa.bb.ext\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\aa.bb.ext\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\aa.bb.ext\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=c:\go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=c:\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\WSs\snippetbox\go.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\DEMETR~1.EXT\AppData\Local\Temp\go-build201665690=/tmp/go-build -gno-record-gcc-switches
PS C:\WSs\snippetbox>
In case it is relevant, I added this extension to VSCode
Rich Co Language Support for Visual Studio Code v0.16.1
But all goes fine from command line
PS C:\WSs\snippetbox> go run ./cmd/web
2020/08/20 18:19:51 Starting server on :4000
Thanks to discussion in Go Slack (GOPHERS), someone guided me to this solution. Hopefully it can help future readers.
1 - add program and cwd as bellow to launch
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "auto",
"env": {},
"args": [],
"program": "${workspaceRoot}/cmd/web",
"cwd": "${workspaceFolder}"
}
]
}
2 - code must be outside GOPATH floder
3 - add go.useLanguageServer": true (C:\Users..\AppData\Roaming\Code\User\settings.json)
{
"workbench.startupEditor": "newUntitledFile",
"editor.minimap.enabled": false,
"go.formatTool": "goimports",
"explorer.confirmDelete": false,
"go.useLanguageServer": true,
"go.toolsEnvVars": {
"GO111MODULE": "on"
}
}
4 - here are my current GO extensions although I don't know how relevant each one is for my solution
PS C:\> code --list-extensions
...
casualjim.gotemplate
dunstontc.vscode-go-syntax
golang.go

Debug file other than main.go in VS Code

I am writing a CLI in go using VS code editor. I am not able to figure out how to debug a code section.
My directory structure is :
- test
- main.go
- cmd
- login.go
- root.go
I have set breakpoints in login.go but if I run "Start Debugging" in this file, I get error
Can not debug non-main package
Process exiting with code: 1
I tried running debugger in main.go but the debugger won't go to login.go file as I we have not explicitly written test login
API server listening at: 127.0.0.1:48423
A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:
cd .
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
Usage:
test [command]
Available Commands:
help Help about any command
login A brief description of your command
Flags:
--config string config file (default is $HOME/.test.yaml)
-h, --help help for test
-t, --toggle Help message for toggle
Use "test [command] --help" for more information about a command.
main.go file
package main
import "test/cmd"
func main() {
cmd.Execute()
}
login.go file
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// loginCmd represents the login command
var loginCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("login called")
name, _ := cmd.Flags().GetString("username")
pwd, _ := cmd.Flags().GetString("password")
userInfo := name + ":" + pwd
},
}
func init() {
rootCmd.AddCommand(loginCmd)
// Here you will define your flags and configuration settings.
loginCmd.Flags().StringP("username", "u", "", "Specifies the user")
loginCmd.Flags().StringP("password", "p", "", "Specifies the password for the user")
loginCmd.Flags().StringP("manager", "m", "", "Specifies the environement where user wants to login")
}
settings.json
{
"go.gopath":"/Users/deepakpatankar/go"
}
launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}",
"env": {},
"args": []
}
]
}
Please guide me how I can see the variable values in debug mode like for variable name. Though using Println is fine, but this source code is part of a bigger project, so I want to see how I can use the debugger ?
Modify your launch.json as below:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceRoot}",
"env": {},
"args": [],
"port": 8080,
"host": "127.0.0.1"
}
]
}
You'll learn that some differences are there from yours.
...
"mode": "debug",
"program": "${workspaceRoot}",
...
You can add flags to the "args": [] array in your vscode settings like this:
"args": ["login", "-u", "username", "-p", "password"]
This will make sure when you run debug you end up in the login command with the given flags.

how to proxy API requests? (Angular-CLI)

I'm working on Java project with Spring-4 and Angular-5. Session is generated on spring side.
So, I'm not able to generate this session from angular Service. It's working on Postman and I'm able to get response in PostMan.
But It's not working with Angular post method call.
So, I thought that it's may be a issue of Proxy. (Corrent me If i'm wrong).
So, My local Url is :- http://localhost:8080/MacromWeb/ws/login
So, How Can I make a proxy.conf.json file?
So for that I have added this code to my package.json file,
"start": "ng serve --proxy-config proxy.conf.json",
I have created a new file called proxy.conf.json.
And Put this code in it.
{
"/": {
"target": "http://localhost:8080/MacromWeb/ws",
"secure": false
}
}
Then I tried with ng serve and npm start both.
Postman Screenshot.
You can achieve this through proxy, You need to provide proper values in the proxy config.
/* should work too, but if MacromWeb is common in API URLs, then instead of / provide /MacromWeb/*
proxy.conf.json looks something like this,
{
"/MacromWeb/*": {
"target": {
"host": "localhost",
"protocol": "http:",
"port": 8080
},
"secure": false,
"changeOrigin": true,
"logLevel": "debug"
}
}
Hope it helps.
Say we have a server running on http://localhost:3000 and we want all calls to http://localhost:4200/api to go to that server.
In our proxy.conf.json file, we add the following content
{
"/api": {
"target": "http://localhost:3000",
"secure": false,
"pathRewrite": {
"^/api": ""
}
}
}
More on this: here

Debug Electron using Visual Studio Code on Mac

Refer to this stackoverflow question:
I am trying to do the same but on Mac. I have the same as above,except instead of
"runtimeExecutable": "node_modules/electron-prebuilt/dist/electron.exe"
I have it as
"runtimeExecutable": "/usr/local/bin/electron"
Since F5 on mac is mapped to screen dimmer, I launched the app from command line as follows:
electron --debug-brk=5858 .
My program launched and ran without breaking.
So I modified keybindings.json like so:
[
{ "key": "shift+ctrl+f5", "command": "workbench.action.debug.play",
"when": "inDebugMode" },
{ "key": "shift+ctrl+f5", "command": "workbench.action.debug.start",
"when": "!inDebugMode" },
]
I tried launching the program by pressing shift+ctrl+f5 - I am still unable to debug my program.
I get the following error:
Error: Connection Failed
when I run node instead of electron, the debugger works fine when the the app is launched from command line
PLEASE HELP!
Thanks in advance
This is your launch.json. The important parts are runtimeExecutable and env. For VS Code 0.8.0, debugging only mostly works using electron 0.30.6.
{
"version": "0.1.0",
// List of configurations. Add new configurations or edit existing ones.
// ONLY "node" and "mono" are supported, change "type" to switch.
"configurations": [
{
// Name of configuration; appears in the launch configuration drop down menu.
"name": "Launch electron",
// Type of configuration. Possible values: "node", "mono".
"type": "node",
// Workspace relative or absolute path to the program.
"program": "main.js",
// Automatically stop program after launch.
"stopOnEntry": false,
// Command line arguments passed to the program.
"args": [],
// Workspace relative or absolute path to the working directory of the program being debugged. Default is the current workspace.
"cwd": ".",
// Workspace relative or absolute path to the runtime executable to be used. Default is the runtime executable on the PATH.
"runtimeExecutable": "node_modules/electron-prebuilt/dist/electron.app/Contents/MacOS/electron",
// Optional arguments passed to the runtime executable.
"runtimeArgs": [],
// Environment variables passed to the program.
"env": {"ATOM_SHELL_INTERNAL_RUN_AS_NODE": "0"},
// Use JavaScript source maps (if they exist).
"sourceMaps": false,
// If JavaScript source maps are enabled, the generated code is expected in this directory.
"outDir": null
},
{
"name": "Attach",
"type": "node",
// TCP/IP address. Default is "localhost".
"address": "localhost",
// Port to attach to.
"port": 5858,
"sourceMaps": false
}
]
}
Install 0.30.6 of electron-prebuilt in your project directory using npm install –-save-dev electron-prebuilt#0.30.6

Resources