MacOS下LLDB调试自行编译OpenSSL库触发EXC_BAD_INSTRUCTION问题
解决MacOS上lldb调试OpenSSL时的EXC_BAD_INSTRUCTION错误
问题场景
我在MacOS上调试OpenSSL的椭圆曲线点生成过程,特意编译了带调试符号且无优化的OpenSSL版本,但使用lldb调试时触发了非法指令错误。
测试代码(ec.c)
#include <crypto/ec.h> #include <stdio.h> int main() { EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_secp384r1); EC_POINT *point = EC_POINT_new(group); printf("done!\n"); return 0; }
编译与直接运行结果
直接编译并运行程序一切正常:
$ gcc ec.c -o ec -I../openssl/include ../openssl/libcrypto.dylib -ggdb3 -O0 $ DYLD_INSERT_LIBRARIES=../openssl/libcrypto.dylib ./ec done!
lldb调试时的错误
使用lldb启动程序后,触发了EXC_BAD_INSTRUCTION错误,停在OpenSSL的SVE探测函数处:
$ lldb ./ec (lldb) process launch --environment DYLD_INSERT_LIBRARIES=../openssl/libcrypto.dylib ./ec Process 3948 launched: '/Users/seanthomas/repos/ec/ec' (arm64) Process 3948 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=1, subcode=0x4a03000) frame #0: 0x00000001009651a8 libcrypto.3.dylib`_armv8_sve_probe libcrypto.3.dylib`: -> 0x1009651a8 <+0>: eor z0.d, z0.d, z0.d 0x1009651ac <+4>: ret libcrypto.3.dylib`: 0x1009651b0 <+0>: xar z0.d, z0.d, z0.d, #0x20 0x1009651b4 <+4>: ret Target 0: (ec) stopped.
解决方法
这个错误源于OpenSSL的SVE(可扩展向量扩展)探测逻辑在lldb环境下触发了非法指令,以下是三种可行的解决方式:
1. 重新编译OpenSSL并禁用SVE支持
重新配置OpenSSL编译选项,跳过SVE相关代码的编译:
cd ../openssl ./config no-sve --debug make clean && make
用新编译的libcrypto.dylib重新编译测试程序后,即可正常用lldb调试。
2. 在lldb中自动跳过SVE探测断点
无需重新编译,通过设置断点自动跳过出错的探测函数:
# 启动lldb后,先设置断点并添加自动继续命令 (lldb) breakpoint set -n _armv8_sve_probe (lldb) breakpoint command add > continue > DONE # 再启动程序 (lldb) process launch --environment DYLD_INSERT_LIBRARIES=../openssl/libcrypto.dylib ./ec
3. 使用DYLD_LIBRARY_PATH替代DYLD_INSERT_LIBRARIES
改用DYLD_LIBRARY_PATH指定库加载路径,替换DYLD_INSERT_LIBRARIES,避免触发特殊加载逻辑:
(lldb) process launch --environment DYLD_LIBRARY_PATH=../openssl ./ec
注意要确保../openssl目录下存在libcrypto.dylib,或者直接指定到库所在的具体目录。
内容的提问来源于stack exchange,提问作者Sean Thomas
相关产品推荐
相关产品推荐

