-1

HTTP経由でテキストにアクセスしてダウンロードするpythonオブジェクトがあります。この python オブジェクトを実行し、c++ コードを使用してそのテキストを処理しています。いえ

/* CPPCode.cxx */
int main(...) {
    for(int i = 0; i < numURLs; i++) {
        // Python method returns a string
        PyObject *pyValue = PyObject_CallMethod(pyObjectInstance, pyFunctionName, par1, par2....);
        string valString = PyString_AsString(pHistValue);   
        // ... process string ... 
    }
} 

/* PyObject.py */
class PyClass:
    def PyFunction(...):
        try: urlSock = urllib.urlopen(urlName)
        except ...

        while(...) :
             dataStr = urlSock.readline()
             # do some basic string processing....

        return dataStr

ほとんどの URL は正常に動作します。C++ コードは適切な文字列を取得し、処理できます。すべて問題なく動作します。ブラウザー上で (基本的に) 他の URL と同じように見えるいくつかの特定の URL は、PyString_AsString() メソッドで segfault を引き起こします。

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000000000000b2
0x000000010007716d in PyString_AsString ()

Python メソッド (上記の疑似コードの「dataStr」) によって返される文字列を出力すると、問題ないように見えます。何がこの問題を引き起こしているのかわかりません---続行する方法についてのヒントをいただければ幸いです! ありがとう

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

解決:

私が使用していたテンプレートコードには呼び出しがありました

Py_DECREF(pyValue)

電話する前に

PyString_AsString(pyValue)

特定の関数呼び出しで割り当てが解除された理由はわかりません。「Gecco」が以下のコメントで述べているように、

PyString_AsString のドキュメントには次のように書かれています。「ポインタは、コピーではなく、文字列の内部バッファを参照します。文字列が PyString_FromStringAndSize(NULL, size) を使用して作成されたばかりでない限り、データを変更してはなりません。割り当てを解除してはなりません。 " '

4

3 に答える 3

1

PyString_AsStringドキュメントには次のように書かれています

このバッファの割り当てを解除しないようにしてください

于 2012-01-05T22:53:52.837 に答える
0

-g デバッグ フラグを指定して C コードをコンパイルすると (少なくとも GCC では)、gnu デバッガー gdb を使用して Python コードを実行できます。

$ gdb /path/to/python/compiled/against 
... blah ...
(gdb) run PyObject.py

そして、セグメンテーション違反をキャッチする必要があります。

于 2012-01-05T21:32:33.783 に答える
0

私の推測では、Py_DECREF はどういうわけか NULL 値を取得しています。

于 2012-01-06T02:52:52.317 に答える