2010-12-08 3 views
2

У меня есть большой кусок кода на C++, который я обернул SWIG и вызываю его с Java. Код C++ делает либеральное использование интеллектуальных указателей повышения.Советы по отладке SWIG-обернутого кода на C++ в Eclipse?

Некоторые из моих тестов JUnit завершены, но затем испытывают ошибки seg во время очистки. Трассировка стека указывает на ошибку памяти в завершении объекта, но это происходит в коде JNI, сгенерированном SWIG, и, похоже, связана с подсчетом ссылок на интеллектуальные указатели.

Хотелось бы пройти через все уровни кода. Это возможно? Я также был бы очень рад услышать опыт других людей с такой проблемой.

+0

Я полагаю, что вы, по крайней мере, сможете начать свой Java-процесс с отладчика C++, который вы обычно используете, и поместить точку прерывания в код JNI. Хотя это не перешагивает все слои кода ... – 2010-12-08 04:54:49

ответ

1

Вы можете подключить второй отладчик с собственным кодом к исполняемому Java-коду. Например, с помощью Visual Studio вы можете подключиться через «Debug> Attach to process».

SWIG поддерживает интеллектуальные указатели, но вы должны управлять своей жизнью явно на стороне Java. Если вы получаете право собственности на объект smart-pointer на стороне Java, его необходимо удалить. Имейте в виду, что Java не имеет временных объектов, выходящих за пределы области видимости, поэтому вы не сможете использовать такие выражения, как f(). G(). H(), в которых возвращаемые значения на каждом уровне являются интеллектуальными указателями.

Как отказоустойчивый финализатор, созданный SWIG, попытается удалить его для вас, если произойдет сбор мусора. Это отказоустойчивое будет вредным, если объект уже был удален на стороне C++.

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