Ошибка сегментации, когда задан другой вход - PullRequest
2 голосов
/ 20 января 2010

Я занимаюсь обработкой изображений на 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, которое я представляю в том же каталоге, я получаю «Ошибка сегментации».

Когда я запускаю код, используя gdb, я получаю следующий вывод:

Программа получила сигнал SIGSEGV, ошибка сегментации.
0x009823a3 в strlen () из /lib/libc.so.6
Отсутствует отдельный 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 ]

1 голос
/ 20 января 2010

Сам код выглядит просто отлично.Я могу предложить несколько способов отладки -

  1. Попробуйте удалить вызов display ().Проблема все еще возникает?(Я бы предположил, что это так).
  2. Попробуйте выяснить, где в коде CImg есть функция strlen (), которая вызывает ошибку сегментации (с помощью отладчика).Это может дать дополнительные подсказки.
  3. Если он находится в обработке файла PGM, возможно, предоставленный файл PGM каким-то образом недопустим, и библиотека не обнаруживает ошибки - попробуйте открыть его в каком-либо другом средстве просмотра,и сохранить его снова (как PGM).Если новый работает, сравнение двух может выявить что-то.

Как только у вас будет больше информации, можно сказать больше.

РЕДАКТИРОВАТЬ -

Глядя на дополнительную информацию, которую вы предоставили, и обращаясь к самому коду, кажется, что 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, но я предполагаю, что простой поиск Google поможет.Попробуйте открыть файл и повторно сохранить его как PGM.

1 голос
/ 20 января 2010

Segfault возникает, когда вы пытаетесь получить доступ к памяти, к которой у вас нет доступа. Поэтому, пожалуйста, проверьте это в коде.

0 голосов
/ 20 января 2010

Еще одной «забавой отследить» причину ошибок сегментации являются несоответствия компиляторов между библиотеками - это особенно распространено при использовании библиотек C ++.

Что нужно проверить:

  1. Компилируете ли вы с тем же компилятором, который использовался для компиляции библиотеки CImg?
  2. Используете ли вы те же флаги компилятора?
  3. Были ли какие-либо определения, которые были заданы при компиляции библиотеки, которую вы сейчас не устанавливаете?

Каждый изэто укусило меня тонкими способами прежде.

...