У меня возникли проблемы с выяснением этого ... поэтому пришло время обратиться за помощью.
ОС: OSX, Snow Leopard
gcc: версия gcc для Xcode, 4.2.1
Библиотека: gmp, gmpxx
Проблема: в конце происходит сбой функции с:
flx_run(94749) malloc: *** error for object 0x7fff706d1500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Program received signal SIGABRT, Aborted.
0x00007fff835cd886 in __kill ()
(gdb) bt
#0 0x00007fff835cd886 in __kill ()
#1 0x00007fff8366deae in abort ()
#2 0x00007fff83585a75 in free ()
#3 0x00000001000bca45 in flxusr::gmp__hyphen_0::_init_ ()
Previous frame inner to this frame (gdb could not unwind past this frame)
Я не вызываю free () в функции init, и функция работает правильно вплоть до закрывающей фигурной скобки .. поэтому точка сбоя должна быть в деструкторах локальных объектов (верно?)
Самое смешное:
a) Программа (кажется) работает нормально, если она статически связана, она завершается сбоем только в том случае, если код встроен в * .dylib и динамически загружается.
b) сбой программы одинаков с двумясовершенно разные версии gmp / gmpxx.[4.3 или что-то и 5.01]
в) обе версии статической и динамической компоновки прекрасно работают на Ubuntu 10.5 LTS
Код сгенерирован моим компилятором, это не рукописный код.Код пользователя запускается программой драйвера верхнего уровня.Система успешно выполняет несколько сотен регрессионных тестов.однако в этом конкретном тестовом примере используется следующий рукописный код:
namespace flx { namespace gmp {
string flx_mpf_get_str(mpf_class const &a)
{
mp_exp_t x;
std::string s = a.get_str(x,10,0);
char b[100];
std::snprintf(b,100,"e%ld",(long)x);
return std::string(".")+s+b;
}
}}
, но он выглядит хорошо для меня.Фрейм стека функции содержит несколько объектов mpz_class, mpq_class и mpf_class.
Помимо ошибок в gmp / gmpxx, единственное, о чем я могу думать, это то, что моя система времени выполнения или сгенерированный код повреждает память.«Освобожденный» адрес, который не был выделен, является подозрительным (его нет рядом с кучей).Я построил версию gmp с флагом -g, но больше не получаю информации (что говорит о том, что это не плохо, внутри деструктора класса gmpxx).
Мне нужны идеи!Я понятия не имею, где искать сейчас.Заранее спасибо:)
Ссылка на источник
http://felix -lang.org: 1116 / $ / home / skaller / felix / felix / build / release-optimized / test / gmp / gmp-0.cpp
Meta: Уценка SO не работает!Так что вам придется копировать вручную.
Можно добавить ссылку на код Феликса, так как он немного более читабелен и содержит некоторые забавные вещи (например, пользовательский синтаксис и если вы переходите кбиблиотека, в которой вы видите экземпляры классов типов)
http://felix -lang.org: 1116 / $ / home / skaller / felix / felix / build / release-optimized / test / gmp/gmp-0.flx