C ++ исключение из дампов ядра конструктора на FreeBSD, но не на Linux или Mac OS X - PullRequest
2 голосов
/ 10 января 2011

Почему перечисленные ниже программы работают на Mac OSX и Linux, но не на FreeBSD?

Дампы ядра freebsd после возникновения исключения выдают следующее сообщение:

terminate called after throwing an instance of 'ObjectException'
  what():  error not allowed
[1]    28946 abort (core dumped)  ./bin/main

На всех трех платформах я использую компиляторы gnu

freebsd g ++ - версия: g ++ (GCC) 4.2.1 20070719

mac os x g ++ - версия: i686-apple-darwin10-g ++ - 4.2.1

linux g ++ - версия: g ++ (Gentoo 4.3.3 p1.0, pie-10.1.5)

freebsd uname -a: 8.1-RELEASE FreeBSD 8.1-RELEASE

Я использую cmake для создания Makefile, поэтому они также похожи на каждой платформе

Вот список:

Заголовок

#ifndef GUARD_Object_h
#define GUARD_Object_h

#include "boost/scoped_ptr.hpp"
#include "string"
#include "exception"

using std::string;

class Object
{
private:
    boost::scoped_ptr<string> _name;
public:
    Object(const string&);
    string getName();
};

class ObjectException:public std::exception
{
    virtual const char* what() const throw()
    {
        return "error not allowed";
    }
};

#endif

Main

#include "Object.h"

Object::Object(const string &name):_name (new string)
{
    *_name = name;
   if(*_name == "error") 
   {  
        throw ObjectException();
   }  
}

string Object::getName() 
{
    return *_name;
}

Главная

#include <iostream>
#include "Object.h"

int main() 
{
    try
    {
        new Object("error");
    } catch(ObjectException& ) {
        std::cout << "error found" << std::endl;
    }
}

Ответы [ 2 ]

2 голосов
/ 10 января 2011

У меня работает на FreeBSD 8.1-RELEASE-p2 и OSX 10.6.6.

В вашем пути поиска может быть плохая версия libstdc ++.Когда я делаю ссылку на FreeBSD 8.1, я получаю следующий вывод от ldd:

janm@midgard: test3 $ ldd a.out
a.out:
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x800649000)
    libm.so.5 => /lib/libm.so.5 (0x800854000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800973000)
    libc.so.7 => /lib/libc.so.7 (0x800a80000)

Если у вас все выглядит иначе, у вас может быть несоответствие библиотеки времени выполнения.Если у вас есть проблема, вы можете попробовать связать с "g ++ -static", чтобы статически связать библиотеку времени выполнения во время соединения.Если это работает, вам нужно починить ваш компьютер.

Обновление:

Похоже, ваш компилятор и библиотека времени выполнения не совпадают, и это, вероятно, вызвано проблемой конфигурации cmake.Вероятно, вы установили версию gcc в / usr / local, возможно, с использованием порта.

Если вы компилируете систему gcc, вам нужно связаться с библиотеками времени выполнения в / usr / lib.Если вы компилируете с помощью gcc в / usr / local, вам нужно связать с библиотеками в / usr / local.Если вы планируете отправлять двоичные файлы, вам, вероятно, следует использовать системный gcc или статическую ссылку.

Другой вариант - просто удалить порт gcc и повторить попытку, если вы действительно не заботитесь о gcc.порт.

2 голосов
/ 10 января 2011

Я скомпилировал и запустил ваш код на FreeBSD 8.1 без каких-либо проблем (используя g++ -I/usr/local/include -g Main.cpp Object.cpp).Может быть, вам нужно обновить (переустановить) boost на этом компьютере?

...