Python程序调用BOOST C++库出现Segmentation fault (core dumped)错误如何解决

在本机上( Arch 64 + 最新 BOOST )编译运行没有问题, 同步到阿里云上运行就这德行,

尝试 Static 链接到 BOOST 也是这样, 两边都是 Arch,都更新到最新。


Arch + BOOST + PYTHON3


请问如何调试看哪里出错了?
Python程序调用BOOST C++库出现Segmentation fault (core dumped)错误如何解决

14 回复

本地系统和云不一致,要重新编译吧


Segmentation fault 通常发生在Python通过ctypes或Cython调用C++库时,指针访问了非法内存地址。以下是排查和解决步骤:

1. 检查库依赖

import subprocess
result = subprocess.run(['ldd', 'your_boost_library.so'], 
                       capture_output=True, text=True)
print(result.stdout)  # 查看是否有未解析的依赖

2. 确保ABI兼容 C++库编译时必须添加extern "C"包装并禁用名称修饰:

// wrapper.cpp
#include <boost/your_header.hpp>

extern "C" {
    void* create_object() {
        return new YourBoostClass();
    }
    
    void process_data(void* obj, int param) {
        static_cast<YourBoostClass*>(obj)->process(param);
    }
    
    void delete_object(void* obj) {
        delete static_cast<YourBoostClass*>(obj);
    }
}

编译命令:

g++ -shared -fPIC wrapper.cpp -o libwrapper.so -lboost_xxx

3. Python端正确声明

import ctypes
import sys

lib = ctypes.CDLL('./libwrapper.so', mode=ctypes.RTLD_GLOBAL)

# 匹配C++函数签名
lib.create_object.restype = ctypes.c_void_p
lib.process_data.argtypes = [ctypes.c_void_p, ctypes.c_int]
lib.delete_object.argtypes = [ctypes.c_void_p]

# 使用示例
obj = lib.create_object()
try:
    lib.process_data(obj, 42)
finally:
    lib.delete_object(obj)

4. 调试方法

  • 在C++代码中添加std::cerr输出
  • 使用gdb python调试:
gdb --args python your_script.py
run
bt  # 发生segfault后查看堆栈

常见原因:

  1. 内存所有权问题(Python释放了C++对象)
  2. 线程不安全(在Python线程中调用非线程安全的C++函数)
  3. 数据类型不匹配(int/long混用)
  4. 库版本不兼容(编译和运行时的boost版本不同)

建议先用简单参数测试基础函数,再逐步复杂化。

总结:重点检查内存管理和ABI兼容性。

按说我编译了静态的应该没问题呀,并且,arch 都是滚到最新的系统

打开开关,看看 coredump 文件能不能捞到有价值的信息

你倒是把崩溃的栈发出来啊

gdb 看下堆栈啊





不熟悉 linux 下,哪儿看 coredump 文件?

一般跟你程序在一个目录下面,但是还有看你的 coredump 有没有开,你百度一把就知道怎么开了

觉得 C++这种东西就应该到目标机编译

放 docker 里跑,再也不用操心环境不一样的问题。。。

unlimit 好的,我去弄下看

unlimit -c 现实是 unlimited, 但是本地没有生成 core dump 文件

archlinux 需要用 coredumpctl 查看 core dump 文件,另外如果你的程序用到了 setuid/setgid,还需要打开一个内核参数才能生成 core dump 文件( https://unix.stackexchange.com/questions/15531/how-come-no-core-dump-is-create-when-an-application-has-suid-set )

coredumpctl list

# coredumpctl info pid


ok, 搞定! 谢谢楼上各位

回到顶部