项目需要添加新功能,在Linux中调用图像库方法,其他的大部分方法调用都没有问题,只有个别方法,一旦调用就报段错误。
开始gdb调试半天段错误,发现不了。中间用了nm命令查看静态库中方法是不是有问题(因为调用的方式是以静态库形式调用),用了bt查看堆栈,用了catchsegv捕捉段错误发生时寄存器和堆栈情况。都没能发现是哪里出的问题。后来为了清理思路,重头开始找。调用的方法Crop(img*, RECT),重写一个CropEx(img*, int, int, int, int)然后调用就没问题了,开始怀疑是RECT传参导致的。
经过查找发现在当前文件包含的头文件中RECT的声明是这样的:
typedef struct tagRect
{
int left;
int right;
int top;
int bottom;
}RECT;
但是在静态库中包含的头文件中RECT是这样声明的:
typedef struct tagRECT
{
int left;
int right;
int top;
int bottom;
}RECT;
一词只差:
一个大写一个小写,经过测试,确实是这个原因导致的段错误。
头文件一定要统一!
附:以下是这次很有帮助并且内容非常好的博客,给大家推荐一下
http://ju.outofmemory.cn/entry/173210 (Linux段错误日志分析--寄存器、堆栈)
扫描二维码关注公众号,回复:
10385618 查看本文章
https://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html (Linux环境下段错误的产生原因及调试方法)