查找由python脚本调用的一个C模块的一行,即segfaults

时间:2014-06-29 06:40:44

标签: python c segmentation-fault

我有一个caller.py,它反复调用some_c_thing.so中的例程,这些例程是从some_c_thing.c创建的。当我运行它时,会出现段错误 - 我有没有办法检测哪个c代码行是segfaulting?

3 个答案:

答案 0 :(得分:1)

这可能有效:

  1. 确保使用调试符号( gcc -g开关)编译本机库。

  2. 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
    
  3. 如果本机库代码发生崩溃,那么这应该显示该行。

    如果本机库代码只是破坏了某些内容或违反了某些后置条件,并且在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中)的变量数或变量类型是否正确。如果不对齐,通常它是一个段错误。