Segmentation fault(Core Dump)问题

最近做项目时,python调用c编译的动态链接库出现Segmentation fault(Core Dump)问题。

搜了下资料看,这个问题的原因是,空间段错误造成的。有如下几个可能的原因:

出现这种错误可能的原因(其实就是访问了内存中不应该访问的东西):

1、内存访问越界:

(1) 数组访问越界,因为下标出超出了范围。

(2) 搜索字符串的时候,通过字符串的结尾符号来判断结束,但是实际上没有这个结束符。

(3)使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,超出了字符中定义的可以存储的最大范围。使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

2、多线程程序使用了线程不安全的函数。

3、多线程读写的数据未加锁保护。

对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成核心转储

4、非法指针

(1)使用NULL指针

(2)随意使用指针类型强制转换,因为在这种强制转换其实是很不安全的,因为在你不确认这个类型就应该是你转化的类型的时候,这样很容易出错,因为就会按照你强制转换的类型进行访问,这样就有可能访问到不应该访问的内存。

5、堆栈溢出

不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。  

我这里出现的问题现象分析步骤:

(1)年龄检测没有问题,性别检测不行。

(2)两部分模型都一样,代码也基本一样,因此比较两部分代码。发现:年龄检测include的ncnn头文件与性别不一样。

(3)发现:性别检测里include的ncnn头文件是旧版本的,但是ncnn静态库已经是最新的。导致头文件定义的结构体和库中不一致,导致内存读取问题。

(4)解决:将性别检测里include的ncnn头文件改成与年龄检测一致,问题解决。

猜你喜欢

转载自blog.csdn.net/weixin_41770169/article/details/89532731
今日推荐