首页 >后端开发 >Golang >意外的 VS Code 调试器值

意外的 VS Code 调试器值

WBOY
WBOY转载
2024-02-08 23:50:10515浏览

意外的 VS Code 调试器值

php小编草莓为您带来了一款令人意外的工具——VS Code调试器。作为一款功能强大的代码编辑器,VS Code的调试器功能提供了便捷的调试工具,帮助开发者更快速地定位和解决代码中的问题。无论是单步调试、断点调试还是查看变量值,VS Code调试器都能给予准确的反馈和提示,极大地提升了开发效率。让我们一起来探索这个令人惊喜的调试器吧!

问题内容

函数

我有这个函数来检测四面体的体积是否几乎为零,即它是否是平的:

import (
    "math"

    v3 "github.com/deadsy/sdfx/vec/v3"
)

// mathematica script is available here:
// https://math.stackexchange.com/a/4709610/197913
func iszerovolume(a, b, c, d v3.vec) (bool, float64) {
    ab := b.sub(a)
    ac := c.sub(a)
    ad := d.sub(a)

    // note that the `norm` function of mathematica is equivalent to our `length()` function.
    nab := ab.length()
    ncd := ac.sub(ad).length()
    nbd := ab.sub(ad).length()
    nbc := ab.sub(ac).length()
    nac := ac.length()
    nad := ad.length()

    // check for 0 edge lengths
    if nab == 0 || ncd == 0 ||
        nbd == 0 || nbc == 0 ||
        nac == 0 || nad == 0 {
        return true, 0
    }

    volume := 1.0 / 6.0 * math.abs(ab.cross(ac).dot(ad))
    denom := (nab + ncd) * (nac + nbd) * (nad + nbc)

    // tolerance derived from here:
    // https://math.stackexchange.com/a/4709610/197913
    tolerance := 480.0

    rho := tolerance * volume / denom

    return rho < 1, volume
}

输入

我使用这四个输入点单步执行代码:

{X: -1.572793602943422, Y: -4.157202807477221, Z: 5.603983008116483}
{X: -2.45160644054413, Y: -3.4214927673339854, Z: 6.135950530673543}
{X: -2.45160644054413, Y: -3.7163730403986044, Z: 5.603983008116483}
{X: -1.572793602943422, Y: -3.5355907043553003, Z: 6.482795845717191}

调试器

通过 vs code 调试器单步执行代码表明局部变量具有以下值:

问题

调试器显示的值没有意义。 denomtolerance 如何成为 0?对我来说完全是无稽之谈。我错过了什么吗?

解决方法

这是显示该问题的演示的简化版本:

 1  package main
 2  
 3  func main() {
 4      a := f(1)
 5      b := 1
 6  
 7      c := a < b
 8      _ = c
 9  }
10  
11  func f(i int) int {
12      if i > 0 {
13          return i
14      }
15      return -i
16  }

这是 delve 调试会话的输出:

(dlv) b 7
Breakpoint 2 set at 0x4608de for main.main() ./main.go:7
(dlv) c
> main.main() ./main.go:7 (hits goroutine(1):1 total:1) (PC: 0x4608de)
     2: 
     3: func main() {
     4:     a := f(1)
     5:     b := 1
     6: 
=>   7:     c := a < b
     8:     _ = c
     9: }
    10: 
    11: func f(i int) int {
    12:     if i > 0 {
(dlv) locals
a = 824633745824
b = 824633843808
(dlv) disass
TEXT main.main(SB) /home/zeke/src/temp/76380802/main.go
    main.go:3   0x4608c0    493b6610            cmp rsp, qword ptr [r14+0x10]
    main.go:3   0x4608c4    7639                jbe 0x4608ff
    main.go:3   0x4608c6    4883ec28            sub rsp, 0x28
    main.go:3   0x4608ca    48896c2420          mov qword ptr [rsp+0x20], rbp
    main.go:3   0x4608cf    488d6c2420          lea rbp, ptr [rsp+0x20]
    main.go:4   0x4608d4    b801000000          mov eax, 0x1
    main.go:4   0x4608d9    e842000000          call $main.f
=>  main.go:7   0x4608de*   4883f801            cmp rax, 0x1
    main.go:4   0x4608e2    4889442418          mov qword ptr [rsp+0x18], rax
    main.go:5   0x4608e7    48c744241001000000  mov qword ptr [rsp+0x10], 0x1
    main.go:7   0x4608f0    0f9c44240f          setl byte ptr [rsp+0xf]
    main.go:9   0x4608f5    488b6c2420          mov rbp, qword ptr [rsp+0x20]
    main.go:9   0x4608fa    4883c428            add rsp, 0x28
    main.go:9   0x4608fe    c3                  ret
    main.go:3   0x4608ff    90                  nop
    main.go:3   0x460900    e83bccffff          call $runtime.morestack_noctxt
    main.go:3   0x460905    ebb9                jmp $main.main

您会看到指令 0x4608de 被选为 :7 行的断点。此时,变量ab还没有得到它们的值(a稍后在指令0x4608e2处获取值,而b0x4608e7处获取值)。

这就是为什么您一开始没有获得正确的值,后来它会“自行修复”。

此问题已报告为cmd/compile:变量 #58813 的 dwarf 位置错误一个>.

以上是意外的 VS Code 调试器值的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除