在查看#31193时注意到。
func count(x uint) {
if x != 0 {
count(x - 1)
}
}
编译为:
"".count STEXT size=70 args=0x8 locals=0x10
0x0000 00000 (count_test.go:8) TEXT "".count(SB), ABIInternal, $16-8
0x0000 00000 (count_test.go:8) MOVQ (TLS), CX
0x0009 00009 (count_test.go:8) CMPQ SP, 16(CX)
0x000d 00013 (count_test.go:8) JLS 63
0x000f 00015 (count_test.go:8) SUBQ $16, SP
0x0013 00019 (count_test.go:8) MOVQ BP, 8(SP)
0x0018 00024 (count_test.go:8) LEAQ 8(SP), BP
0x001d 00029 (count_test.go:9) MOVQ "".x+24(SP), AX
0x0022 00034 (count_test.go:9) TESTQ AX, AX
0x0025 00037 (count_test.go:9) JNE 49
0x0027 00039 (<unknown line number>) MOVQ 8(SP), BP
0x002c 00044 (<unknown line number>) ADDQ $16, SP
0x0030 00048 (<unknown line number>) RET
0x0031 00049 (count_test.go:10) DECQ AX
0x0034 00052 (count_test.go:10) MOVQ AX, (SP)
0x0038 00056 (count_test.go:10) CALL "".count(SB)
0x003d 00061 (count_test.go:10) JMP 39
0x003f 00063 (count_test.go:8) CALL runtime.morestack_noctxt(SB)
0x0044 00068 (count_test.go:8) JMP 0
请注意<unknown line number>
条目。在我看来,这些可能是函数关闭括号的属性:作为函数退出时执行的代码。
我不知道在这里添加行号是否对调试有益,或者对二进制大小有益。我只是想提一下,以防@dr2chase看到这里有一个机会。如果没有,我们可以关闭。
5条答案
按热度按时间8hhllhi21#
在debug_line中,这些都被分配给了
if x != 0 {
行(在这种情况下是可以的)。我认为这反映了pclntab,我不知道在这种情况下是否重要。cl25kdpy2#
啊,是的,
-S
输出反映了pclntab。在这里显示附近的行号可能会使二进制文件变小,因为它们会被编码为更小的值,但这可能不值得努力。我想知道是否有必要编写一个工具,用于比较pclntab文件/行与dwarf文件/行之间的每个指令和标志不匹配,以寻找改进的机会。
exdqitrt3#
取决于你所说的改进是什么。我们试图优化的是(大致按顺序)调试体验、性能分析准确性和二进制文件大小。改为使用is_stmt标志是为了在进行性能分析时获得更好的调试体验,同时准确地归属于任何非语句的事物。但它会增加二进制文件的大小。
gr8qqesn4#
所以你的意思是说,pclntab和dwarf之间存在有意的不匹配?那么,一个比较它们的工具将完全无助。:)
dwbf0jvd5#
实际上,我认为它们应该匹配,但我不确定是否需要。pclntab缺少is_stmt标记,仅此而已。