libc: Fatal signal 4 (SIGILL), code 0, fault addr 0x7178 in tid 29091 (reach.reachlive)

这两天在更新GB/T28181协议的C++源码,放到Android Studio后重新编译,但运行时都好几秒就闪退一次,报的是这样的错误:

libc: Fatal signal 4 (SIGILL), code 0, fault addr 0x7178 in tid 29091 (reach.reachlive)_第1张图片

libc: Fatal signal 4 (SIGILL), code 0, fault addr 0x7178 in tid 29091 (reach.reachlive)_第2张图片

刚开始,感觉一筹莫展,想起以前也遇到过Fatal signal的错误,方便找到问题点,传送门:https://blog.csdn.net/toyauko/article/details/82416429

 

查了很多资料,Bugly给出的解析是:

illegal instruction

SIG是信号名的通用前缀。ILL是 illegal instruction(非法指令) 的缩写。SIGILL 是当一个进程尝试执行一个非法指令时发送给它的信号。

可执行程序含有非法指令的原因,一般也就是cpu架构不对,编译时指定的march和实际执行的机器的march不同。这种情况,因为工具链一样,连接脚 本一样,所以可执行程序可以执行,不会发生exec format error。但是会包含一些不兼容的指令。还有另外一种可能,就是程序的执行权限不够,比如在目态下运行的程序只能执行非特权指令,一旦CPU遇到特权指 令,将产生illegal instruction错误。

SIG是信号名的通用前缀。ILL是 illegal instruction(非法指令) 的缩写。SIGILL 是当一个进程尝试执行一个非法指令时发送给它的信号。

可执行程序含有非法指令的原因,一般也就是cpu架构不对,编译时指定的march和实际执行的机器的march不同。这种情况,因为工具链一样,连接脚 本一样,所以可执行程序可以执行,不会发生exec format error。但是会包含一些不兼容的指令。还有另外一种可能,就是程序的执行权限不够,比如在目态下运行的程序只能执行非特权指令,一旦CPU遇到特权指 令,将产生illegal instruction错误。

Swift 开发中,强制解包时为 nil

 

只说了可能是编译架构的不同造成的,之后也查了很多资料,发现C++里有个strncpy的函数,估计是这个与CPU不兼容,后来就直接加了两个头文件,居然好了!好了!了!

strncpy(callidBuf, uid, needlen);

两个头文件为

#include 
#include 

 

另:查了资料,还有另外的一种可能,会造成类似的闪退。在一些性能好的CPU,一些函数如int func(int arr...)可以不用返回值都不报错,但遇到不是那么好兼容的CPU,就会报错。。。。

所以遇到这种问题,需要检查下是否CPU架构不对、然后确保使用了系统函数,则需引入相应的头文件。最后就是代码要养成好习惯,对于非void的函数,一定别忘记return

你可能感兴趣的:(Android)