程序收到SIGILL信号,非法指令。

18

我正在使用Linux x86_64机器构建我的程序。 我已经将一个共享库链接到可执行文件中。在我的项目中,我调用了一个在函数内部声明了vector<string>的函数。当调用该函数时,我的程序被杀死。 通过GDB调试时,以下是我得到的输出。

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

这个问题是我的共享库编译的问题吗?我已经对它头疼了很久,请帮忙。

-Chaks

为了回答你的问题,我增加了一些信息: 是的,我调用的函数File_ToText是类OC_Catalog_c的一个虚函数。 另一个类的成员变量有一个OC_Catalog_c类的对象,该对象也有一个虚函数File_ToText。我使用那个对象从虚函数File_ToText中调用OC_Catlog_c的File_ToText函数。 以下是代码片段:

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();
}

你在使用g++编译时都用了哪些选项?你是否也在构建共享库,还是从其他地方获取的? - idfah
了解您正在运行的处理器以及使用的Linux发行版和版本可能也很有用。 - cordoro
这是英特尔至强处理器。我也在构建共享库。函数调用在共享库中。我正在使用automake来构建我的项目选项,大多数选项都是默认的。我通过链接各种静态库来制作共享库。每个静态库都有这些选项:AM_LIBTOOLFLAGS = --tag=-static和-fPIC以进行特定说明。 - CVS
就我个人而言,我曾经在使用内联汇编时遇到过SIGILL错误,其中汇编器可以发出主机无法执行的操作码。这些库是在不同的机器上使用-mcpu=native或类似选项进行编译的吗? - Emmet
1
有人能给出关于如何调试这个问题的建议吗?完全没有头绪问题出在哪里...请给出建议。 - CVS
显示剩余7条评论
1个回答

18

感谢大家提供的帮助。 我终于找到了导致这个错误的问题。
进行更多的调试并跟踪指令,我发现程序在ud2a指令处失败了。
我忽略了一个警告“warning: cannot pass objects of non-POD type 'struct sqlrw_request_cb' through '...'; call will abort at runtime”。
解决这些警告后,与SIGILL相关的问题得到了解决。
有关更多说明,请参见此链接: ud2a指令引起SIGILL


谢谢提供链接,节省了我们很多时间。 - naab
6
当我的函数返回类型为 std::vector<std::string> 时,我曾面临过这个错误,但是由于疏忽没有在函数中添加返回语句,并错误地忽略了编译器的警告! :D - Sam
@Sam 我也可以确认忘记返回语句可能是导致这个问题的原因。我使用clang-11.1.0编译,从LLDB得到了完全相同的消息。 - Dean Seo
是的,似乎没有人注意到 vector<string> B::File_ToText( void ) const 函数没有返回任何内容。 - wrapperapps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接