记一次Linux查找段错误的历程

项目需要添加新功能,在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段错误日志分析--寄存器、堆栈)

https://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html  (Linux环境下段错误的产生原因及调试方法)

发布了87 篇原创文章 · 获赞 213 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/buknow/article/details/100079270