2013-08-23 3 views
7

Używam komputera z systemem Linux x86_64 do zbudowania mojego programu. Połączyłem udostępnioną bibliotekę z plikiem wykonywalnym. W moim projekcie wywołuje funkcję, która zadeklarowała vector<string> wewnątrz funkcji. Mój program zostanie zabity, gdy ta funkcja zostanie wywołana. Gdy debugowanie przez GDB poniżej jest wyjściem, które otrzymuję.Program otrzymany sygnał SIGILL, Nielegalna instrukcja

Program received signal SIGILL, Illegal instruction. 
0x00002aaaac4d2be7 in OC_Catalog_c::File_ToText (this=0x611aa0) at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:87 
87    : _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0) 
(gdb) bt 
0 0x00002aaaac4d2be7 in OC_Catalog_c::File_ToText (this=0x611aa0) at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:87 

Czy to jest problem z kompilacją mojej udostępnionej biblioteki? Uderzyłem w głowę na tyle. Proszę pomóż.

-Chaks

Dodajesz więcej informacji o zapytaniach: Tak, funkcja Wołam File_ToText jest funkcją wirtualną w klasie OC_Catalog_c. Zmienna składowa innej klasy ma obiekt klasy OC_Catalog_c, który również posiada funkcję wirtualną File_ToText.Użytkowanie tego obiektu wywołuje funkcję File_ToText z OC_Catlog_c z funkcji wirtualnej File_ToText. pokażę fragment kodu:

class Oc_Catalog_c 
{ 
    virtual vector<string> File_ToText    (void) const; 
} 

class B 
{ 
    const OC_Catalog_c*   m_pCatalog; 
    virtual vector<string> File_ToText    (void) const; 
} 

vector<string> B::File_ToText(void) const 
{ 
    vector<string> a_SubData; 
    a_SubData = m_pCatalog->File_ToText(); 
} 
+0

Zacznij od wklejenia fragmentu na początek, i powiedz więcej o bibliotece. – lpapp

+0

Jakie opcje są używane podczas kompilacji za pomocą g ++? Czy budujesz także wspólną bibliotekę, czy dostałeś ją gdzieś indziej? – idfah

+0

Przydałoby się również wiedzieć, na którym procesorze pracujesz, i jakiej wersji dystrybucji używasz Linuksa. – cordoro

Odpowiedz

9

Dziękujemy wam za pomoc. W końcu wymyśliłem problem, który był przyczyną tego błędu.
Debugowanie więcej i śledzenie instrukcji Stwierdziłem, że program nie działa zgodnie z instrukcją ud2a.
Zignorowałem jedno ostrzeżenie "ostrzeżenie: nie można przekazać obiektów typu POD" struct sqlrw_request_cb "przez" ... ", wywołanie zostanie przerwane w czasie wykonywania".
Rozwiązanie tych ostrzeżeń naprawiło mój problem związany z SIGILL.
Więcej informacji na ten link: ud2a instruction causing SIGILL

+0

Dziękuję za link. Zaoszczędził nam mnóstwo czasu. – naab