Go进程未按设计要求进行执行,出现异常结束的情况。往往会报诸如:unexpected fault address、signal SIGSEGV: segmentation violation code=0x32XXXX等报错信息。定位思路如图1所示。
问题现象:
基于Go语言开发软件,在迁移到鲲鹏后进行测试,出现异常结束。
定位过程:
出现unexpected fault address报错,确认是程序异常退出问题。
1 | go mod init main |
其中main是工程文件夹。
1 | dlv debug test.go |
其中test.go是源码文件。
例如:有两个函数A和B,经过monkey补丁的处理:monkey.patch(A, B),最后在执行A函数的时候,实际上执行的是B函数。即A () à B ()。
1 2 | mov rdx, main.b.f; jmp [rdx]; |
功能为main.b.f函数的地址赋予rdx寄存器,最后通过跳转指令jmp跳到rdx寄存器并执行。
1 2 3 | mov x10, main.b.f; ldr x11, [x10] br x11; |