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

试图使用gdbdebugging程序,它报告OPENSSL_cpuid_setup中的SIGILL失败。
有了这个简单的代码,我有相同的行为:

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

它编译和运行良好,但从跟踪回溯开始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下运行这样的程序?

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

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

有关更多详细信息,请参阅OpenSSL FAQ中的第17项: 调试时,我在OpenSSL初始化过程中观察到SIGILL:为什么? 。

如果您仍然想使用GDB并对其进行调试,那么有机会忽略GDB的SIGILL:

 handle SIGILL nostop 

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