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 登录后复制
输入
我使用这四个输入点单步执行代码:
{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 调试器单步执行代码表明局部变量具有以下值:
问题
调试器显示的值没有意义。 denom
和 tolerance
如何成为 0
?对我来说完全是无稽之谈。我错过了什么吗?
解决方法
这是显示该问题的演示的简化版本:
1 package main
2
3 func main() {
4 a := f(1)
5 b := 1
6
7 c := a 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 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
行的断点。此时,变量a
和b
还没有得到它们的值(a
稍后在指令0x4608e2
处获取值,而b
在0x4608e7
处获取值)。
这就是为什么您一开始没有获得正确的值,后来它会“自行修复”。
此问题已报告为cmd/compile:变量 #58813 的 dwarf 位置错误一个>.
以上就是意外的 VS Code 调试器值的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!