我有一个caller.py,它反复调用some_c_thing.so中的例程,这些例程是从some_c_thing.c创建的。当我运行它时,会出现段错误 - 我有没有办法检测哪个c代码行是segfaulting?
答案 0 :(得分:1)
这可能有效:
确保使用调试符号( gcc 的-g
开关)编译本机库。
在 gdb 下运行python并让它崩溃:
gdb --args python caller.py
run # tell gdb to run the program
# script runs and crashes
bt # print backtrace, which should show the crashing line
如果本机库代码发生崩溃,那么这应该显示该行。
如果本机库代码只是破坏了某些内容或违反了某些后置条件,并且在Python解释器的代码中发生了崩溃,那么这将没有用。在这种情况下,你的选项是代码审查,添加调试打印(第一步是只记录每个C函数的入口和出口,以检测哪个是崩溃前调用的最后一个C函数,然后为变量值添加更细粒度的日志记录等),最后使用调试器通过使用常用的调试器技术(断点,步进,监视......)来查看会发生什么。
答案 1 :(得分:0)
将Python和.so文件排除在等式之外。查看传递了什么参数,如果有的话,从一个能够单步执行C代码和二进制文件的调试器中调用例程。
以下是a link to an article,描述了一个简单的C调试过程,以防您不熟悉调试C(命令行界面)。这是using NetBeans to debug C上的另一个链接。另外using Eclipse ......
这可能会有所帮助:gdb: break in shared library loaded by python(也可能会变成一个骗子)
答案 2 :(得分:-1)
segfault ...检查传递给该c函数(在.so中)的变量数或变量类型是否正确。如果不对齐,通常它是一个段错误。