2017-06-28 15 views
0

_xdr_read_xtc関数を使ってxtc軌道を読み込むPythonのC拡張モジュールがあります。Python C拡張モジュールのSIGSEGV

モジュールは問題なく.soライブラリに組み込まれており、ほとんどの場合、うまく動作します。しかし、時には私は 'セグメンテーションフォールト(コアダンプ)'を取得します。

static PyObject * _xdr_read_xtc(PyObject *self, PyObject *args) 
{ 
    int natoms; 
    XDRFILE *xd; 
    xd = (XDRFILE *) malloc(sizeof(XDRFILE)); 
    if (xd == NULL){ 
     return NULL;} 

    XDRFILE *dummy; 
    dummy = xd; 

    if (!PyArg_ParseTuple(args, "ii", &xd, &natoms)){ 
     return NULL; 
    } 

    free(dummy); 

    int step = 0; 
    float time; 
    float prec; 
    matrix box; 
    rvec *x; 
    x = malloc(natoms * sizeof(*x)); 
    if (x == NULL){ 
     return NULL;} 

    // read frame 
    int status = read_xtc(xd, natoms, &step, &time, box, x, &prec); 

    if (status == 0 | status == 11){ 
     npy_intp dims[2]= {natoms, 3}; 

     PyArrayObject *matout = (PyArrayObject *) PyArray_SimpleNewFromData(2, dims, NPY_FLOAT, x); 
     PyArray_ENABLEFLAGS(matout, NPY_ARRAY_OWNDATA); 

     PyObject *Frame = Py_BuildValue("Oii", matout, status, step); 
     Py_DECREF(matout); 

     return Frame; 
    } 
    else{ 
     free(x); 
     return NULL; 
    } 
} 

Valgrindでデバッグすると、プロセス11(SIGSEGV)のデフォルト動作でプロセスが終了します。アドレス0x195688988 'のマップされた領域内にないアクセス:

int status = read_xtc(xd, natoms, &step, &time, box, x, &prec); 

コードに間違いがありますか?無効なポインタかもしれない?それとも記憶上の問題でしょうか?

ありがとうございます!

+0

[こちらの回答](https://stackoverflow.com/a/42154502/8051589)help?私は 'xd'(最初のパラメータ)は' xdrfile_open'で開かれ、 'natoms'(2番目のパラメータ)は' read_xtc_natoms'によって初期化されなければならないと思います。 –

+0

あなたの返信ありがとう!私はすでにその投稿をチェックしていました。xdとnatomsの引数は、xdrfile_openとread_xtc_natoms関数の結果です。 –

答えて

0

xdにメモリを割り当てて、XDRFILEを保持します。次にxddummyに移動し、整数(ファイルハンドル?)を解析し、xd/dummyに入れます。その後、無料でdummyを解放してxdを解放します。その後、フリーメモリにアクセスするread_xtc(xd, ...に電話します。あなたのメモリアロケータがそのページを放棄することを決めた場合、あなたはSIGSEGVを取得します。

free(dummy)を実際にメモリが不要になる場所に移動します。

+0

返信ありがとうございます! 私がダミーでやろうとしていたことは、メモリリークを修正することでした。実際には何も使用しませんでした(少なくとも、私はそれを意味しませんでした)。 mallocの後 XD::私は、変数のアドレスを印刷した場合、私は次の取得0000000000572910 ダミー:ParseTuple後0000000000572910 XD:ParseTuple後0000000000572790 ダミー:0000000000572910 は私が(ダミー)自由に移動しようとしますが、私ドンそれが問題を引き起こしているとは思わない。 –

+0

'x = malloc(...'と 'if(status ...'の両方の腕) '' xd'の値を '' dummy''にコピーしないでください。AFAICSファイルを開くには 'xdrfile_open()'を使う必要があります。これは 'XDRFILE'を返します。これは決して決してできない整数です'ParseTuple'。[this](http://svn.cgl.ucsf.edu/svn/chimera/trunk/libs/Trajectory/formats/Gromacs/_gromacs/_gromacsmodule.cpp)が役に立ちます。 – user2722968

+0

私は受け入れていますリンクは非常に有用だったので、この答えです! –

関連する問題