在gdb下运行时,SSL_library_init会导致SIGILL

时间:2014-09-07 09:37:03

标签: c linux openssl gdb raspberry-pi

尝试使用gdb调试程序,它无法在OPENSSL_cpuid_setup中报告SIGILL。
使用这个简单的代码,我的行为与:

相同
#include <openssl/ssl.h>
int main()
{
    SSL_library_init(); 
}

它编译并运行良好,但从backtrace后面的gdb报告开始

Program received signal SIGILL, Illegal instruction.
0xb6b2eb40 in ?? () from /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.0
(gdb) where
#0  0xb6b2eb40 in ?? () from /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.0
#1  0xb6b2b404 in OPENSSL_cpuid_setup () from /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.0
#2  0xb6fdf058 in call_init (l=<optimized out>, argc=1, argv=0xbefff7d4, env=0xbefff7dc) at dl-init.c:78
#3  0xb6fdf134 in _dl_init (main_map=0xb6fff958, argc=1, argv=0xbefff7d4, env=0xbefff7dc) at dl-init.c:126
#4  0xb6fcfda4 in _dl_start_user () from /lib/ld-linux-armhf.so.3
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

如何在gdb下运行这样的程序?

3 个答案:

答案 0 :(得分:11)

  

SSL_library_init在gdb ...

下运行时导致SIGILL

它实际上一直在做,而不仅仅是在GDB下。这是启动代码中的正常行为,因为库测试处理器功能。您可以通过发出handle SIGILL nostop安全地忽略它。

有关详细信息,请参阅OpenSSL常见问题解答中的第17项:When debugging I observe SIGILL during OpenSSL initialization: why?

答案 1 :(得分:1)

如果您仍想使用GDB并使用它进行调试,GDB可能会忽略SIGILL:

handle SIGILL nostop

答案 2 :(得分:-1)

我在BBB中遇到了类似的情况。但是,如果我忽略该信号并继续,则该过程正常进行。我不确定为什么,但在这种情况下似乎可以忽略信号。