给出不同输入时的分段错误

时间:2010-01-20 04:34:00

标签: c++ segmentation-fault cimg

我在C ++中做一些图像处理工作。为此,我使用CImg.h库,我认为这对我的工作有益。

这是我写的一小段代码,它只是读取图像并显示它。

#include "../CImg.h"
#include "iostream"

using namespace std;
using namespace cimg_library;

int main(int argc,char**argv)
{
     CImg<unsigned char> img(argv[1]);
     img.display();  
     return 0;  
}

当我将lena.pgm作为输入时,此代码显示图像。好像我给了一些其他图像,例如我在同一目录中出现的ddnl.pgm,我得到了“Segmentation Fault”。

当我使用gdb运行代码时,我得到如下输出:

  

编程接收信号SIGSEGV,分段故障   来自/lib/libc.so.6的strlen()中的0x009823a3   缺少单独的debuginfos,请使用:debuginfo-install glibc-2.9-2.i686 libX11-1.1.4-5.fc10.i386 libXau-1.0.4-1.fc10.i386 libXdmcp-1.0.2-6.fc10.i386 libgcc -4.3.2-7.i386 libstdc ++ - 4.3.2-7.i386 libxcb-1.1.91-5.fc10.i386

有人可以告诉我这是什么问题吗?以及如何解决它。

谢谢大家

3 个答案:

答案 0 :(得分:1)

当您尝试访问不允许访问的记忆时,会出现Segfault。 所以请在代码中查看。

答案 1 :(得分:1)

代码本身看起来很好。我可以建议一些方法来继续调试 -

  1. 尝试删除display()调用。问题是否仍然存在? (我认为确实如此)。
  2. 尝试找出CImg代码中导致分段错误的strlen()的位置(通过使用调试器)。这可能会提供额外的提示。
  3. 如果它在PGM文件处理中,可能提供的PGM文件在某种程度上无效,并且库不进行错误检测 - 尝试在其他查看器中打开它,并再次保存(如PGM)。如果新的有效,比较两者可能会发现一些事情。
  4. 获得更多信息后,可以说更多信息。

    编辑 -

    查看您提供的额外信息并查阅代码本身,在尝试检查您要打开的文件类型时,CImg似乎失败了。

    相关的代码行是 -

    if (!cimg::strcmp(ftype,"pnm")) load_pnm(filename);
    

    这是第一次使用'ftype',这使我得出它的值无效的结论。

    'ftype'的值只有几行 -

    const char *const ftype = cimg::file_type(0,filename);
    

    file_type()函数本身会尝试根据其标题猜出要打开的文件,可能是因为根据扩展名打开它 - 失败。只有一种理智的方法是返回一个无效的值,这会导致strcmp()失败 - 当它无法将文件标识为它熟悉的任何内容时,它会返回NULL(实际上为0)。

    所以,我重申我的建议,你试图验证这确实是一个有效的文件。我不能指出任何能够打开/保存PGM文件的工具,但我猜一个简单的谷歌搜索会有所帮助。尝试打开文件并将其重新保存为PGM。

答案 2 :(得分:0)

追踪分段错误的另一个“乐趣”是库之间的错误匹配 - 这在使用C ++库时尤其普遍。

要检查的事项是:

  1. 您是否使用与编译CImg库相同的编译器进行编译?
  2. 您使用相同的编译器标志吗?
  3. 编译你现在没有设置的库时是否有任何定义?
  4. 之前每一个都以微妙的方式咬我。