Ошибка сегментации при создании экземпляра объекта из конкретной библиотеки - PullRequest
0 голосов
/ 07 декабря 2009

У меня есть приложение на C ++ (сильно укорочено, показано ниже);

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

void foobar()
{
 MyClass a;
}

int main(int argc, char** argv)
{
 std::cout << "Hello world!\n";

 return 0;
}

Где «MyClass» определен в статически связанной библиотеке (.a).

Однако, это приложение Segfaults сразу же после его запуска, и я никогда не попадаю в «Hello world».

Я могу создать экземпляр интерфейса из той же библиотеки, но не могу создать экземпляр класса, который реализует интерфейс. То есть;

void foobar()
{
 IMyClass a; // Having this in the application works.
 MyClass b;  // Segfault if this is in.
}

Как вы можете видеть из приведенного выше, код даже не нуждается в вызове, чтобы приложение перешло в segfault.

Я использую Netbeans 6.7.1 и GCC 4.3.2.

Теперь, я предполагаю, что что-то не так с компоновкой библиотеки, но я не могу сказать, что именно. Я также делаю ссылки в других библиотеках (все статически связаны). Приведенные выше классы взяты из первой связанной библиотеки (как минимум, первой в списке). Если я создаю экземпляр класса из второй библиотеки в списке, все работает нормально.

Возможно, проблема похожа (или связана) с моей другой проблемой: https://stackoverflow.com/questions/1844190/linking-with-apache-xml-security-causes-unresolved-references

У кого-нибудь есть предложения по поводу проблемы?

Ответы [ 4 ]

3 голосов
/ 07 декабря 2009

В библиотеке MyClass может быть некоторая статическая инициализация, которая может работать неправильно, если у вас нет исходного кода, его будет сложно найти и исправить.

1 голос
/ 07 декабря 2009

Если вы разрабатываете на Linux или OS X, вы можете получить гораздо больше информации об ошибке такого рода, откомпилировав ее в режиме отладки и запустив ее с использованием valgrind.

Компиляция в режиме отладки не является строго необходимой, но даст гораздо лучшую информацию о том, что происходит и где.

Я бы также скомпилировал библиотеку, содержащую MyClass, в режиме отладки.

Еще одна вещь, на которую нужно обратить внимание, это то, что библиотека скомпилирована с такими же флагами компилятора, так как этот вид сбоя может произойти, когда статические объекты имеют разные внутренние схемы при двух настройках компилятора. (Я потратил много времени на отслеживание этого процесса при компиляции части приложения с использованием -DREENTRANT в одной части моего кода, а не в другой, в обоих случаях сторонний компонент имел разную компоновку.)

0 голосов
/ 07 декабря 2009

Насколько я понимаю из кода, foobar никогда не вызывается? Просто объявив это вызывает segfault?

Я могу себе представить, что объявление переменной MyClass вызывает некоторую реализацию шаблона, которая реализует некоторую статическую инициализацию, которая завершается неудачей. Скажем, MyClass является производным от SomeBase <>, и невозможно выполнить инициализацию некоторого статического члена внутри SomeBase <>. Когда вы удаляете объявление переменной MyClass, шаблон не создается, и все идет хорошо ...

class MyClass : public SomeBase<MyClass>{};

template<typename TYPE>
class SomeBase<TYPE> { static CauseASegfault* m_casf; };

// some bad m_casf initialization here...
0 голосов
/ 07 декабря 2009

Stackoverflow.

Возможно, MyClass слишком большого размера для размещения в стеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...