【问题标题】:Unable to Call Function in Go debugger无法在 Go 调试器中调用函数
【发布时间】:2020-02-01 16:31:38
【问题描述】:

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

我的工作环境是 Visual Studio Code。

调试时,当我尝试从调试控制台调用函数时,出现以下错误: “不使用'call'不允许函数调用”,如果我尝试使用“call fib(10)”,我会得到“无法评估表达式:“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
 }
} 

【问题讨论】:

    标签: go visual-studio-code delve


    【解决方案1】:

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

    【讨论】:

    • 这个答案对任何人有什么帮助?您甚至使用与提问者相同的环境吗?
    • @GrantBirchmeier 没关系,因为所有 go UI 调试器都在后台使用 delve。我证明它在控制台调试器模式下运行良好。
    • 嗯,这很重要,因为我和提问者有同样的问题,你的回答对我没有任何帮助。
    • 尝试运行dlv version,我会尽力帮助你。
    【解决方案2】:

    问题vscode-go issue 100 "debug: support function calls via delve 'call'" 刚刚被PR 101commit 5a7752c / CL 249377 关闭

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 2020-03-25
    • 2019-07-25
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2022-09-28
    • 2019-08-27
    相关资源
    最近更新 更多