go cmd/compile:为函数退出路径添加行号?

wfypjpf4  于 5个月前  发布在  Go
关注(0)|答案(5)|浏览(53)

在查看#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看到这里有一个机会。如果没有,我们可以关闭。

8hhllhi2

8hhllhi21#

在debug_line中,这些都被分配给了if x != 0 {行(在这种情况下是可以的)。我认为这反映了pclntab,我不知道在这种情况下是否重要。

cl25kdpy

cl25kdpy2#

啊,是的,-S输出反映了pclntab。在这里显示附近的行号可能会使二进制文件变小,因为它们会被编码为更小的值,但这可能不值得努力。
我想知道是否有必要编写一个工具,用于比较pclntab文件/行与dwarf文件/行之间的每个指令和标志不匹配,以寻找改进的机会。

exdqitrt

exdqitrt3#

取决于你所说的改进是什么。我们试图优化的是(大致按顺序)调试体验、性能分析准确性和二进制文件大小。改为使用is_stmt标志是为了在进行性能分析时获得更好的调试体验,同时准确地归属于任何非语句的事物。但它会增加二进制文件的大小。

gr8qqesn

gr8qqesn4#

所以你的意思是说,pclntab和dwarf之间存在有意的不匹配?那么,一个比较它们的工具将完全无助。:)

dwbf0jvd

dwbf0jvd5#

实际上,我认为它们应该匹配,但我不确定是否需要。pclntab缺少is_stmt标记,仅此而已。

相关问题