c - 为什么应用程序无法访问来自共享库的 malloc 内存?

标签 c pointers segmentation-fault malloc posix

我维护一个用 C 编写的库,Linux 上的用户可以直接从 Python 使用加载共享库和调用函数的模块访问它。该模块非常常用,就像这个版本的共享库一样,人们在做 popular tutorial .

用户遇到段错误。在 gdb 下运行他的 Python 脚本,他看到它在共享库中,在一个为结构分配内存并返回指针的函数中。他正在取回一个指针,但当他试图在后续调用共享库时使用它时,由于内存不可访问而发生段错误。

如果他以 root 身份运行 Python 脚本,则不会出现该问题。它也不会出现在备用 Linux 安装中。

总结一下:

  • 他的 Python 代码加载共享库。
  • 然后它调用一个函数,该函数返回指向共享库中分配的内存的指针。
  • 然后他调用共享库中的另一个函数,并将它返回给他的指针传入,共享库在它自己的指针上阻塞。
  • 只有当他以普通用户身份在“4.0.7-2-ARCH x86_64 GNU/Linux”上运行它时才会发生。当他切换到 root 并运行它时,它不会发生在该操作系统上。
  • 当他试图在 Ubuntu 机器上重现问题时,它并没有发生。

什么给了?这是一些 ARCH 错误吗?或者是否存在可以清除的编程细微差别?

您可以阅读 minutiae here其中包括足够的细节来重现问题,如果问题对于 Linux 编程经验比我多的用户来说不是不言而喻的话。

共享库函数的快速链接:

他的 Python 代码摘录以供后代使用并便于访问:

#!/usr/bin/env python2
import curses
import libtcodpy as libtcod

def main(stdscr):
    curses.start_color()
    curses.use_default_colors()

    map = libtcod.map_new(10, 10) # any numbers work

    libtcod.map_set_properties(map, 0, 0, True, True) # any in bounds integer coordinates fail
    stdscr.getch()

curses.wrapper(main)

最佳答案

我遇到了和你一样的问题。我的解决方案是我在调用函数中声明了字符串( malloc() ),而不是通过引用传递给被调用函数并填充内容。

关于c - 为什么应用程序无法访问来自共享库的 malloc 内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31375177/

相关文章:

c++ - 具有递归算法的 SIGSEGV

c - 我怎样才能压缩这个使用 ANSI 颜色的 printf ?

C 警告 : Function returns address of local variable

c - C 中的静态数组初始化

python - DataFrame.to_json() 的段错误

c - 由于 if 语句的 glCompileShader 段错误

C - 在 dev C 中使变量为空?

c - 操作系统架构: Kernel and Standard Library interoperability

c - (gcc) 用于无警告编译的多维数组或双指针

c++ - 最佳实践 : Should I create a typedef for byte in C or C++?