Как отладить - Python CTypes, вызывающий * glibc обнаружено * - PullRequest
3 голосов
/ 27 марта 2012

Я скомпилировал программу на C ++ в динамическую библиотеку, которую я сейчас вызываю в python через ctypes.Однако я получаю следующую ошибку:

*** glibc detected *** ../../bin/python: free(): invalid pointer: 0x00007fbdf8ae3500 ***

Как мне выяснить, является ли это ошибкой в ​​коде C ++ или в том, как я использую ctypes?

Библиотека C ++запускает успешно , когда она связана с программой на Си или если я скомпилирую ее как отдельную программу.В сочетании с ctypes он всегда вылетает в этой строке C ++:

// ... A bunch of code
if(tempBuffer) {
    delete[] tempBuffer;
    // More code below that never runs...

Код Python, который не работает:

def test(fileName):
    feedbackLib = cdll.LoadLibrary("./libpitch.so")

    # Set return type to a character pointer
    feedbackLib.getPitchString.restype = c_char_p
    feedbackLib.getPitchString.argtypes = [c_char_p]

    # Crashes Here!
    feedbackStr = feedbackLib.getPitchString(fileName)
    return feedbackStr

По какой-то причине я могу заставить программу Python работать успешно, если яизмените все вокруг так:

def test(fileName):
    # I've only changed this line
    feedbackLib = CDLL("./libpitch.so")

    # Set return type to a character pointer
    feedbackLib.getPitchString.restype = c_char_p
    feedbackLib.getPitchString.argtypes = [c_char_p]

    # No longer crashes!
    feedbackStr = feedbackLib.getPitchString(fileName)
    return feedbackStr 

Однако, если я начну добавлять вещи в вышеуказанную функцию (что мне нужно сделать), это даст мне другие ошибки glibc.


Вот информация о том, как я скомпилировал C ++ на случай, если это уместно.

Заголовок функции, которую я вызываю, используя extern "C", похоже, как заставить код C ++ работать с CTypes:

extern "C" char* getPitchString(char* filename);

g ++ команды:

$(CXX) $(LDFLAGS) -fPIC -c $(SRCS) $(LIBS)
$(CXX) -shared -Wl,-soname,libpitch.so -o libpitch.so $(OBJS) $(LIBS)

1 Ответ

2 голосов
/ 28 марта 2012

Оказывается, произошла ошибка в части кода C ++.Мне удалось получить эту часть в segfault независимо от Python / CTypes, и после отладки она, кажется, работает.

...