我维护一个用 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 编程经验比我多的用户来说不是不言而喻的话。
共享库函数的快速链接:
- TCOD_map_new 的源代码.
- TCOD_map_set_properties 的源代码.
他的 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/