Nano Hash - криптовалюты, майнинг, программирование

Что бы это могло быть? [ошибка программы]

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

ОС: OSX, Снежный барс

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, и функция работает корректно вплоть до закрывающей фигурной скобки... так что точка сбоя должна быть в деструкторах локальных объектов (правильно? )

Самое смешное:

а) Программа (кажется) работает нормально, если она статически связана, она дает сбой только в том случае, если код встроен в *.dylib и загружается динамически.

б) программа одинаково не работает с двумя совершенно разными версиями 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/ сборка/оптимизированный выпуск/тест/gmp/gmp-0.cpp

Мета: уценка SO не работает! Так что придется копировать вручную.

С таким же успехом можно добавить ссылку на код Felix, так как он немного более читабелен и в нем есть кое-что интересное (например, определяемый пользователем синтаксис, и если вы перейдете в библиотеку, вы увидите, как создаются экземпляры классов типов)

http://felix-lang.org:1116/$/home/skaller/felix/felix/ сборка/оптимизированный выпуск/тест/gmp/gmp-0.flx

09.12.2010

Ответы:


1

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

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

бр,
Юха

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

10.12.2010
  • gmp src 5.01 от gnu, и да, это 64-битный AFAIK. 12.12.2010
  • Просто отметим: я специально НЕ хочу 32-битный код. Будь моя воля, я бы полностью запретил это в своей системе. Можно сделать в Linux, но не так просто на Mac. 29.12.2010

  • 2

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

    20.12.2010
  • Этот ответ кажется мне фальшивым. Конечно, это подделка для C. 21.12.2010
  • Этот ответ актуален только для Windows. 22.12.2010
  • Ответ фальшивый, но это разумное предположение: кажется, что это как-то связано с освобождением объектов, созданных в общей библиотеке, я бы не стал доверять Apple, чтобы это было правильно :) 29.12.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..