pybind11模块调试异常:直接导入被终止,lldb附加后正常
解决直接运行Python导入pybind11模块时进程被终止的问题
问题现象
直接运行Python解释器导入pybind11模块时进程被终止:
Python 3.9.17 (main, Jul 23 2023, 14:18:04) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import module_name [1] 63586 killed /Users/esalimbe/Desktop/pybind11_sandbox/python3.9/bin/python3.9
但用lldb附加到Python进程后,导入模块及调用函数均正常:
Python 3.9.17 (main, Jul 23 2023, 14:18:04) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import module_name >>> module_name.__doc__ 'This is a test' >>> module_name.some_fn_in_python(1,2) 3.0
排查与解决步骤
查看系统崩溃日志
打开macOS的Console.app,在左侧「报告」->「崩溃报告」中找到对应Python进程的崩溃日志,重点关注Signal类型:- 若为
SIGKILL:大概率是Gatekeeper权限、隐私权限或内存资源不足导致系统杀死进程; - 若为
SIGSEGV:属于内存访问错误,但lldb附加后正常的话,更可能是地址空间布局随机化(ASLR)或代码签名问题。
- 若为
检查并修复模块代码签名
用以下命令检查模块的签名状态:codesign -dv --verbose=4 /path/to/module_name.so如果无有效签名,用自签名证书给模块签名(适合开发环境):
codesign -s - /path/to/module_name.so验证编译与运行环境一致性
确保编译pybind11模块时使用的Python解释器和运行时完全一致(包括虚拟环境路径):# 查看运行时Python路径 which python3.9检查setup.py或CMake配置文件,确认编译时指定的Python解释器路径与上述输出一致,不一致则重新编译模块。
临时禁用ASLR排查
运行Python时临时关闭ASLR,测试是否还崩溃:sudo sysctl -w kern.aslr.enable=0 /Users/esalimbe/Desktop/pybind11_sandbox/python3.9/bin/python3.9如果问题消失,说明编译模块时的ASLR相关选项不匹配,重新编译时确保添加Clang的
-fPIE/-pie编译选项。检查文件权限
确认虚拟环境目录和模块文件的权限为当前用户可读写:ls -ld /Users/esalimbe/Desktop/pybind11_sandbox/python3.9 ls -l /path/to/module_name.so权限不足时用
chmod调整:chmod -R u+rwx /Users/esalimbe/Desktop/pybind11_sandbox/python3.9 chmod u+rx /path/to/module_name.so
内容的提问来源于stack exchange,提问作者Etienne Salimbeni
相关产品推荐
相关产品推荐

