6

为了学习围棋,我正在关注 Karl Seguin 的“围棋小书”。

我的工作环境是 Visual Studio Code。

调试时,当我尝试从调试控制台调用函数时,我收到以下错误:“不使用'call'不允许函数调用”,如果我尝试使用“call fib(10)”,我会得到“无法eval 表达式:“1:6:预期的 'EOF',找到 fib”。这是我要评估的函数:

//Fibonnaci
func fib(n int) int64 {
    if n == 0 {
        return 0
    } else if n == 1 {
        return 1
    } else {
        return fib(n-1) + fib(n-2)
    }
}

如果我尝试从代码本身调用该函数(例如,从 main() 调用,它可以完美运行)。

但是,如果我设置断点并尝试从调试器控制台调用相同的函数,则会收到以下错误:

Eval error: function calls not allowed without using 'call'
call fib(10)
Unable to eval expression: "1:6: expected 'EOF', found fib"
Failed to eval expression:  {
 "Expr": "call fib(10)",
 "Scope": {
  "goroutineID": 1,
  "frame": 0
 },
 "Cfg": {
  "followPointers": true,
  "maxVariableRecurse": 1,
  "maxStringLen": 64,
  "maxArrayValues": 64,
  "maxStructFields": -1
 }
} 
4

2 回答 2

2

看起来像“不支持通过 delve 'call' 的函数调用”但 github问题在 microsoft/vscode-go repo :(

于 2020-02-17T17:00:46.617 回答
0

问题vscode-go100 “调试:通过 delve 'call' 支持函数调用”刚刚通过PR 101关闭并提交 5a7752c / CL 249377

Delve 支持函数调用。尽管它仍然是实验性的并且只能应用于有限的一组功能,但这是一个有用的功能,许多 vscode-go 用户渴望。

与其他 javascript/typescript 调试器不同,delve 对函数调用进行了特殊处理,并且需要与通常的表达式求值不同的调用路径。
那是因为 Go 是一种编译的、运行时管理的 GC 语言,从调试器中安全地调用函数是复杂的。
DAP 和 VS Code UI 也不区分函数调用和其他表达式求值,因此我们必须在相同的evaluateRequest上下文中实现这一点。

我们使用启发式来猜测call我们需要根据评估请求的请求采取哪条路由(或表达式评估)。

这是0.17.0 里程碑的一部分,尚未发布,目前可在nightly build中使用。

于 2020-09-07T06:51:20.287 回答