Этот ответ не решает проблему ОП, но решает аналогичную.
У меня была похожая проблема (я получил error: cannot lock ref ... is at ... but expected ...
), но это было потому, что в репо было две ветви с одинаковым именем, но с другим регистром. Может быть, этот ответ может помочь людям, которые попадают сюда, я не смог найти ответ в другом месте. Я удалил одну из веток, а затем удалил соответствующую ссылку из: .git/ref/.../branch_name
, затем git pull. Это происходит из-за того, что я работал над файловой системой без учета регистра, в то время как две ветви были перенесены в файловую систему с учетом регистра.
Например, две ветви - BRANCH1
и branch1
, и они оба под origin
дистанционно. Сначала удалите одну из ветвей, например BRANCH1
. Затем удалите его ссылку:
rm .git/refs/remotes/origin/BRANCH1
Затем git pull
, и все должно быть в порядке.
Я бы использовал предварительную загрузку библиотеки для этой задачи, потому что она не требует модификации выполняющейся программы. Если вы знакомы с обычным способом Unix для этого, то это почти вопрос замены LD_PRELOAD на DYLD_INSERT_LIBRARIES.
Первый шаг - создать библиотеку с таким кодом, как этот, а затем построить ее, используя обычные параметры связывания разделяемых библиотек ( gcc -dynamiclib
):
void *malloc(size_t size)
{
void * (*real_malloc)(size_t);
real_malloc = dlsym(RTLD_NEXT, "malloc");
fprintf(stderr, "allocating %lu bytes\n", (unsigned long)size);
/* Do your stuff here */
return real_malloc(size);
}
Обратите внимание, что если вы также отклоните calloc ()
и его вызовы реализации malloc ()
, вам может потребоваться дополнительный код для проверки как тебя зовут. Программы на C ++ должны быть довольно безопасными, потому что оператор new
в любом случае вызывает malloc ()
, но имейте в виду, что ни один стандарт не требует этого. Я никогда не встречал реализации, которая не использовала бы malloc ()
, однако.
Наконец, настройте рабочую среду для вашей программы и запустите ее (может потребоваться корректировка в зависимости от того, как ваша оболочка обрабатывает среду переменных):
export DYLD_INSERT_LIBRARIES=./yourlibrary.dylib
export DYLD_FORCE_FLAT_NAMESPACE=1
yourprogram --yourargs
См. страницу руководства dyld для получения дополнительной информации о переменных среды динамического компоновщика.
Этот метод довольно общий. Однако есть ограничения:
malloc ()
.
Наконец, настройте рабочую среду для своей программы и запустите ее (может потребоваться корректировка в зависимости от того, как ваша оболочка обрабатывает переменные среды):
export DYLD_INSERT_LIBRARIES=./yourlibrary.dylib
export DYLD_FORCE_FLAT_NAMESPACE=1
yourprogram --yourargs
См. страницу руководства dyld для получения дополнительной информации о переменных среды динамического компоновщика.
Этот метод довольно общий. Однако есть ограничения:
malloc ()
.
Наконец, настройте рабочую среду для своей программы и запустите ее (может потребоваться корректировка в зависимости от того, как ваша оболочка обрабатывает переменные среды):
export DYLD_INSERT_LIBRARIES=./yourlibrary.dylib
export DYLD_FORCE_FLAT_NAMESPACE=1
yourprogram --yourargs
См. страницу руководства dyld для получения дополнительной информации о переменных среды динамического компоновщика.
Этот метод довольно общий. Однако есть ограничения:
dlsym ()
для загрузки адреса malloc
, вызов не будет перенаправлен. Если, однако, вы не обманете его, также отвлекая dlsym
!
Если необходимую вам базовую статистику можно собрать в простой оболочке, быстрый (и своего рода грязный) трюк заключается в использовании некоторой замены макроса #define
.
void* _mymalloc(size_t size)
{
void* ptr = malloc(size);
/* do your stat work? */
return ptr;
}
и
#define malloc(sz_) _mymalloc(sz_)
Примечание : если макрос определен до определения _mymalloc, он в конечном итоге заменит вызов malloc внутри этой функции, оставляя вас с бесконечной рекурсией ... поэтому убедитесь, что это не кейс. Вы можете явно #undef
указать его перед определением функции и просто (пере) определить его после, в зависимости от того, где вы его включите, чтобы избежать этой ситуации.
Я думаю, что если вы определите malloc () и free () в своем собственном файле .c, включенном в проект, компоновщик разрешит эту версию.
Итак, как вы собираетесь реализовать malloc?
Метод malloc_default_zone
, упомянутый на http://lists.apple.com/archives/darwin-dev/2005/Apr/msg00050 .html , похоже, все еще работает, см., например, http://code.google.com/p/fileview/source/browse/trunk/fileview/fv_zone.cpp?spec=svn354&r=354 для пример использования, который кажется похожим на то, что вы намереваетесь.