分段错误(核心转储)- 知道发生在哪里,但不明白原因

分段错误(核心转储)- 知道发生在哪里,但不明白原因

我正在使用 Pythin 3.6、opencv 和 ffmpeg,在尝试保存图像时出现“分段错误(核心转储)”错误。

我知道当进程试图以操作系统和处理器不能或不允许的方式访问内存时会发生此错误,但仍然无法意识到如何解决这个问题。

简短的程序描述:

我正在从多个目录读取视频,分别读取每个视频,使用 ffmpeg 进行一些操作,并保存视频的每一帧。

可能有助于解决此问题的线索:

  1. 我的程序在我的视频上运行,我拍摄了相同的视频,重新编码它们,再次尝试并出现这个分段错误(不明白为什么重新编码会产生这个问题)。

  2. 我有 python 的 C 扩展,我相信问题就在那里。这是文件:https: github.com/chaoyuaw/pytorchcoviar/blob/master/data_loader/coviar_data_loader.c

  3. 它发生在不同的文件上,假设我在 1k 视频上运行该程序,它发生在前几个视频上,大多数不同但彼此接近。

当我尝试“连接点”并且出现触摸内存的错误时,我不允许这样做,我只是一无所知...我尝试使用“valgrind”,并得到了这个输出(注意允许附加图像:

运行屏幕截图:valgrind --leak-check=yes

多一个:

运行屏幕截图:valgrind -v

我已经阅读了 valgrind“快速入门”,并且还在阅读更多材料,也许你们有什么想法?

我很高兴得到你的帮助。谢谢!

编辑:经过一周的调试后更新(至少尝试调试..)所以这就是“分段错误”发生的地方,在这一行:

npy_intp *dims_bgr = PyArray_SHAPE(bgr_arr);

完整功能代码为:

static PyObject *load(PyObject *self, PyObject *args)
{
  PyObject *arg1 = NULL; // filename.
  int gop_target, pos_target, representation, accumulate;

  if (!PyArg_ParseTuple(args, "siiii", &filename,
      &gop_target, &pos_target, &representation, &accumulate)) return NULL;

  PyArrayObject *bgr_arr = NULL;
  PyArrayObject *final_bgr_arr = NULL;
  PyArrayObject *mv_arr = NULL;
  PyArrayObject *res_arr = NULL;

  if(decode_video(gop_target, pos_target,
                &bgr_arr, &mv_arr, &res_arr, 
                representation,
                accumulate) < 0) {
    printf("Decoding video failed.\n");

    Py_XDECREF(bgr_arr);
    Py_XDECREF(mv_arr);
    Py_XDECREF(res_arr);
    return Py_None;
  }
  if(representation == MV) {
    Py_XDECREF(bgr_arr);
    Py_XDECREF(res_arr);
    return mv_arr;

  } else if(representation == RESIDUAL) {
    Py_XDECREF(bgr_arr);
    Py_XDECREF(mv_arr);
    return res_arr;

  } else {
    Py_XDECREF(mv_arr);
    Py_XDECREF(res_arr);

    npy_intp *dims_bgr = PyArray_SHAPE(bgr_arr);
    int h = dims_bgr[1];
    int w = dims_bgr[2];

    npy_intp dims[3];
    dims[0] = h;
    dims[1] = w;
    dims[2] = 3;
    PyArrayObject *final_bgr_arr = PyArray_ZEROS(3, dims, NPY_UINT8, 0);

    int size = h * w * 3 * sizeof(uint8_t);
    memcpy(final_bgr_arr->data, bgr_arr->data + size, size);

    Py_XDECREF(bgr_arr);
    return final_bgr_arr;
}

我认为“bgr_arr”可能是空向量,还有其他想法吗?我也尝试过使用 gdb,但我得到的最有用的东西是这个输出:

0 在 coviar_data_loader.c:559 处加载(self=,args=) 1 0x0000000000502d6f 在 ?? () 中 2 0x0000000000506859 在 _PyEval_EvalFrameDefault () 中 3 0x0000000000504c28 在 ?? () 中 4 0x0000000000506393 在 PyEval_EvalCode () 中 5 0x0000000000634d52 在 ?? () 6 PyRun_FileExFlags () 中的 0x0000000000634e0a 7 PyRun_SimpleFileExFlags () 中的 0x00000000006385c8 8 Py_Main () 中的 0x000000000063915a 9 main () 中的 0x00000000004a6f10

我会非常高兴得到您的帮助。

相关内容