2021-10-30 02:35:13 +00:00
|
|
|
package dap
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
2021-11-24 21:38:37 +00:00
|
|
|
"sort"
|
2021-10-30 02:35:13 +00:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/go-delve/delve/pkg/config"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (s *Session) delveCmd(goid, frame int, cmdstr string) (string, error) {
|
|
|
|
vals := strings.SplitN(strings.TrimSpace(cmdstr), " ", 2)
|
|
|
|
cmdname := vals[0]
|
|
|
|
var args string
|
|
|
|
if len(vals) > 1 {
|
|
|
|
args = strings.TrimSpace(vals[1])
|
|
|
|
}
|
|
|
|
for _, cmd := range debugCommands(s) {
|
|
|
|
for _, alias := range cmd.aliases {
|
|
|
|
if alias == cmdname {
|
|
|
|
return cmd.cmdFn(goid, frame, args)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "", errNoCmd
|
|
|
|
}
|
|
|
|
|
|
|
|
type cmdfunc func(goid, frame int, args string) (string, error)
|
|
|
|
|
|
|
|
type command struct {
|
|
|
|
aliases []string
|
|
|
|
helpMsg string
|
|
|
|
cmdFn cmdfunc
|
|
|
|
}
|
|
|
|
|
|
|
|
const (
|
|
|
|
msgHelp = `Prints the help message.
|
|
|
|
|
2021-11-24 21:38:37 +00:00
|
|
|
dlv help [command]
|
2021-10-30 02:35:13 +00:00
|
|
|
|
|
|
|
Type "help" followed by the name of a command for more information about it.`
|
|
|
|
|
|
|
|
msgConfig = `Changes configuration parameters.
|
|
|
|
|
2021-11-24 21:38:37 +00:00
|
|
|
dlv config -list
|
2021-10-30 02:35:13 +00:00
|
|
|
|
|
|
|
Show all configuration parameters.
|
|
|
|
|
2021-11-24 21:38:37 +00:00
|
|
|
dlv config <parameter> <value>
|
2021-10-30 02:35:13 +00:00
|
|
|
|
|
|
|
Changes the value of a configuration parameter.
|
|
|
|
|
2021-11-24 21:38:37 +00:00
|
|
|
dlv config substitutePath <from> <to>
|
|
|
|
dlv config substitutePath <from>
|
2021-10-30 02:35:13 +00:00
|
|
|
|
|
|
|
Adds or removes a path substitution rule.`
|
2021-11-24 21:38:37 +00:00
|
|
|
msgSources = `Print list of source files.
|
|
|
|
|
|
|
|
dlv sources [<regex>]
|
|
|
|
|
|
|
|
If regex is specified only the source files matching it will be returned.`
|
2021-10-30 02:35:13 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// debugCommands returns a list of commands with default commands defined.
|
|
|
|
func debugCommands(s *Session) []command {
|
|
|
|
return []command{
|
|
|
|
{aliases: []string{"help", "h"}, cmdFn: s.helpMessage, helpMsg: msgHelp},
|
|
|
|
{aliases: []string{"config"}, cmdFn: s.evaluateConfig, helpMsg: msgConfig},
|
2021-11-24 21:38:37 +00:00
|
|
|
{aliases: []string{"sources", "s"}, cmdFn: s.sources, helpMsg: msgSources},
|
2021-10-30 02:35:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var errNoCmd = errors.New("command not available")
|
|
|
|
|
|
|
|
func (s *Session) helpMessage(_, _ int, args string) (string, error) {
|
|
|
|
var buf bytes.Buffer
|
|
|
|
if args != "" {
|
|
|
|
for _, cmd := range debugCommands(s) {
|
|
|
|
for _, alias := range cmd.aliases {
|
|
|
|
if alias == args {
|
|
|
|
return cmd.helpMsg, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "", errNoCmd
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Fprintln(&buf, "The following commands are available:")
|
|
|
|
|
|
|
|
for _, cmd := range debugCommands(s) {
|
|
|
|
h := cmd.helpMsg
|
|
|
|
if idx := strings.Index(h, "\n"); idx >= 0 {
|
|
|
|
h = h[:idx]
|
|
|
|
}
|
|
|
|
if len(cmd.aliases) > 1 {
|
2021-11-24 21:38:37 +00:00
|
|
|
fmt.Fprintf(&buf, " dlv %s (alias: %s) \t %s\n", cmd.aliases[0], strings.Join(cmd.aliases[1:], " | "), h)
|
2021-10-30 02:35:13 +00:00
|
|
|
} else {
|
2021-11-24 21:38:37 +00:00
|
|
|
fmt.Fprintf(&buf, " dlv %s \t %s\n", cmd.aliases[0], h)
|
2021-10-30 02:35:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Fprintln(&buf)
|
2021-11-24 21:38:37 +00:00
|
|
|
fmt.Fprintln(&buf, "Type 'dlv help' followed by a command for full documentation.")
|
2021-10-30 02:35:13 +00:00
|
|
|
return buf.String(), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Session) evaluateConfig(_, _ int, expr string) (string, error) {
|
|
|
|
argv := config.Split2PartsBySpace(expr)
|
|
|
|
name := argv[0]
|
|
|
|
switch name {
|
|
|
|
case "-list":
|
|
|
|
return listConfig(&s.args), nil
|
|
|
|
default:
|
|
|
|
res, err := configureSet(&s.args, expr)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
}
|
2021-11-24 21:38:37 +00:00
|
|
|
|
|
|
|
func (s *Session) sources(_, _ int, filter string) (string, error) {
|
|
|
|
sources, err := s.debugger.Sources(filter)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
sort.Strings(sources)
|
|
|
|
return strings.Join(sources, "\n"), nil
|
|
|
|
}
|