为什么 LLDB 在 MacOS 上使用用户编译的库生成 EXC_BAD_INSTRUCTION?

问题描述 投票:0回答:3

我想在 MacOS 上调试 OpenSSL,看看它是如何创建一个椭圆曲线点的。因此,我使用调试符号编译了 OpenSSL,没有进行任何优化。但是,当我用

lldb
运行时,它不起作用

$ cat 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 并尝试在 main 处中断时发生的情况:

$ 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.
(lldb) 

有人知道如何解决这个问题吗?

c macos lldb
3个回答
3
投票

不知道对你有没有帮助。但也许,在 Arm arch 上的 libcrypto.3.dylib 中存在错误。

我也遇到了这个问题。当我在 shell 中通过 cmd 行运行程序时,它会起作用。但是当我想使用 lldb 在 VSCode 中调试这个程序时它遇到了这个问题。

但是,当我删除 libcrypto.3.dylib 和 libssl.3.dylib 时,使用标记 OpenSSL_1_1_1m 构建 openssl,然后重建程序。它有效!


1
投票

是的,确认 Mac M1/M2 上的问题。恢复到旧版本的 openssl,问题得到解决。我在我的 MacOs 应用程序中使用 openssl lib,在调试模式下启动应用程序时,它会立即崩溃。


0
投票

确认:Ventura 13.2.1, MacBookPro M2 Max.

首先安装 OpenSSL 3.1.0,(来自 https://www.openssl.org/source/),使用 terminal.app

  1. ./配置
  2. 制作
  3. 须藤安装

当生成的库与 Mosquitto 客户端的测试 C 源链接时(同样在 Xcode 中),它生成了运行时 EXC_BAD_INSTRUCTION。即:

Xcode 14.2 immediate crash on

然后使用相同的 3 个“terminal.app”步骤从相同的链接/站点(不删除 3.1.0)安装 openSSL 3.0.8。

在 Xcode 中运行相同的测试程序不会崩溃。

非常感谢您的解决方案。那会花我很长时间才能找到。

© www.soinside.com 2019 - 2024. All rights reserved.