-1

У меня есть объект python, который обращается и загружает некоторый текст через HTTP. Я запускаю этот объект python и обрабатываю этот текст, используя код C++. I.e.Sporadic segfault в C++ расширение python

/* 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 

Большинство ссылок отлично работает --- C++ код получает правильную строку, я могу обрабатывать его, все счастливы и здоровы. Несколько конкретных URL, которые выглядят (в основном) так же, как другие на браузер, приводят к Segfault в методе PyString_AsString():

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

Если я распечатать строку, которая должна быть возвращена методом питона ('dataStr' в псевдокоде выше), это выглядит отлично! Я понятия не имею, что может вызвать эту проблему --- любые советы о том, как обрабатывать, будут оценены! Thanks

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

РЕШЕНИЕ:

код шаблона я использовал был вызов

Py_DECREF(pyValue) 

, прежде чем я назвал

PyString_AsString(pyValue) 

Почему это было быть высвобождены наверняка участн я не знаю. Как говорит Gecco в комментариях ниже,

Документация PyString_AsString гласит: «Указатель ссылается на внутренний буфер строки, а не на копию. Данные не должны быть изменены каким-либо образом, если только строка не была создана используя PyString_FromStringAndSize (NULL, размер). Он не должен быть освобожден ». '

+0

И что это за таинственный URL? –

+0

http://www.wunderground.com/history/airport/PAFM/2012/01/05/DailyHistory.html?HideSpecis=0&format=1 – DilithiumMatrix

+0

Необъяснимое segfault: Это довольно часто связано с некоторыми ошибками выделения памяти. Проверьте код _entire_, чтобы обеспечить правильное распределение и бесплатную использованную память ... – gecco

ответ

1

PyString_AsString документация говорит: «Указатель ссылается на внутренний буфер строки, а не копировать данные не должны быть изменены каким-либо образом, если строка не была просто создана при PyString_FromStringAndSize (NULL, размер) Он должен.. не освобождается. "

Пожалуйста, убедитесь, что вы не освобождает этот буфер

0

При компиляции кода C с флагом -g отладки (в GCC, по крайней мере), то вы можете запустить свой код питона с помощью отладчика GNU GDB:

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

и вы должны поймать свой Segfault.

+0

Вот моя полная обратная трассировка от GDB 'code' Полученный сигнал программы EXC_BAD_ACCESS, Не удалось получить доступ к памяти. Причина: 13 по адресу: 0x0000000000000000 0x00007fff80237c00 в StrLen() (Gdb) BT # 0 0x00007fff80237c00 в StrLen() # 1 0x0000000100088e1e в PyString_FromFormatV() # 2 0x00000001000d3fdc в PyErr_Format() # 3 0x000000010008510a в PyString_AsStringAndSize () # 4 0x0000000100085183 в PyString_AsString() # 5 0x000000010000f6f3 в callPythonWHistoryMethod() в stl_vector.h: 137 # 6 0x0000000100010555 в основной() в stl_vector.h: 137 – DilithiumMatrix

+0

Таким образом, вы можете теперь подтолкнуть код, чтобы увидеть, что нарушение все - например, что такое «pHistValue»: попробуйте «(gdb) print pHistValue» и посмотрите, что вы ожидали – danodonovan

0

Мое предположение является Py_DECREF каким-то образом получает значение NULL.

+0

Мое понимание что когда ссылки на объект равны нулю, он освобождается (например, в какао, например). – DilithiumMatrix

+0

Да, когда он достигнет нуля, он освободится. Хорошо поймай, я исправлю это. – Demolishun

 Смежные вопросы

  • Нет связанных вопросов^_^