Что бы это могло быть? [программная ошибка] - PullRequest
0 голосов
/ 09 декабря 2010

У меня возникли проблемы с выяснением этого ... поэтому пришло время обратиться за помощью.

ОС: 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

Ответы [ 2 ]

0 голосов
/ 20 декабря 2010

Вы не можете освободить память, выделенную динамической библиотекой. Возможно, это проблема здесь. Проверьте этот ответ: Пространство памяти общих библиотек

0 голосов
/ 10 декабря 2010

Где вы взяли источник gmp? Это может быть 32-битная версия (по крайней мере, macports не предлагает 64-битные источники). Snow Leopard, с другой стороны, является 64-битным (по умолчанию).

Лично я заставляю весь код 32-битным с помощью gcc -m32. Вы можете попробовать то же самое.

ш
Юха

edit: Как заставить / usr / bin / gcc -> / usr / bin / gcc -m32?

...