【问题标题】:rogue missing c++ symbol - debugging strategies?流氓缺少 c++ 符号 - 调试策略?
【发布时间】:2012-05-08 15:50:33
【问题描述】:

我正在为 LAMMPS 构建/使用 python 模块,它是开源分子动力学模拟器(project homesource)。

python 模块通过将 C++ 应用程序编译为库,并使用 CDLL/ctypes 调用 C 函数接口来工作。在 python 中调用CDLL() 函数时,如果操作系统在库本身中找不到任何缺失的符号,并且无法从其他可用库中加载,则加载失败。

我缺少的特定符号是一个 C++ 错位名称__ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE,它可能是MPI_Win_set_errhandler(或一些具有类似名称的命名空间/面向对象的等价物)。对于上下文,我使用python/setup_serial.py 文件对其进行了编译,该文件应该使用虚拟 MPI 接口构建,并且根本不应该引用任何真正的 MPI 符号;所以这是一个潜入某处的流氓参考。我还对源代码进行了一些修改,但是当我禁用所有更改时,我得到了同样的错误。

我的问题是,找出在动态库中引用符号的位置给出这种错误的最佳调试策略是什么?到目前为止,我已经尝试在源代码中搜索引用到这个符号(或名称的一部分),但我没有找到任何实例(事实上,唯一的结果是来自 python 构建过程的二进制文件,我在导入时遇到了问题。)

我想我的下一步是以某种方式在二进制文件中搜索,但我不知道从哪里开始(或其他策略)。

【问题讨论】:

    标签: c++ python linker


    【解决方案1】:

    c++filt 是你的朋友

    $ c++filt __ZN3MPI3Win14Set_errhandlerERKNS_10ErrhandlerE
    MPI::Win::Set_errhandler(MPI::Errhandler const&)
    

    现在在该库上进行快速谷歌搜索 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=512616

    似乎存在部件升级但未重新编译的情况。第二件事是查看编译器的链接行,看看它包含哪些库。

    最后的最后手段是做类似的事情:

    readelf -s /path/to/libfoo.so
    

    然后开始四处寻找,看看它是否在某个地方定义。

    【讨论】:

    • 链接行非常长,但我已经检查过了,它确实包含在src/STUBS/(相对于项目根目录)下找到的虚拟 C MPI api 的链接。我不确定我是否理解为什么在官方 MPI 发行版中取消内联函数会破坏 API 的本地虚拟版本 - 除非我引用现在已更改的官方 MPI 头文件。
    • 我检查了我的系统文件夹,并且有一个 mpi.h,但它适用于 1.2.8 版 - 在 debian 线程上出现问题之前,所以即使它覆盖了本地头文件文件不应该破坏东西。
    • 唯一要添加的是你需要在 OS X 上使用gobjdump(在 macports 的 binutils 包下),因为 readelf 是 linux-only see here,但否则这是一个非常所需工具的良好综述。谢谢! :)
    猜你喜欢
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2018-08-29
    • 1970-01-01
    • 2022-09-29
    相关资源
    最近更新 更多