получаем различные результаты в логах в зависимости от запуска под дебаггером или без:
Когда запускаем под дебаггером (или через ‘sdb launch -m debug’), в логе, то, то я ожидаю:
Не вызываются перегруженные операторы если их запуск расположен в динамически подгруженной библиотеке (в примере это ArrayList из ‘libosp-appfw.so’). Проблема проявляется как на реальном девайсе так и в эмуляторе.Похоже, что undefined символы из динамических библиотек (н-р new/delete – _Znaj/_ZnajRKSt9nothrow/_ZdaPv/etc) остаются слинкованными с реализацией из “libstdc++.so”, вместо того, чтобы использовать определенные мной.
Почему так происходит только при запустке? Почему в дебаггере другое, но корректное поведение?
Как правильно перегрузить глобыльные операторы new и delete на Tizen платформе?
проблема перегрузки глобальных операторов new и delete
#include <new> #include <stdlib.h> #include <FBaseLog.h> #include <FBaseColArrayList.h> static bool MEM_LOG = false; void *operator new(::size_t size) throw(std::bad_alloc) { if (MEM_LOG) { AppLog("%d", size); } return ::malloc(size); } void *operator new [] (::size_t size) throw(std::bad_alloc) { if (MEM_LOG) { AppLog("%d", size); } return ::malloc(size); } void *operator new(::size_t size, const ::std::nothrow_t &) throw() { if (MEM_LOG) { AppLog("%d", size); } return ::malloc(size); } void *operator new [] (::size_t size, const ::std::nothrow_t &) throw() { if (MEM_LOG) { AppLog("%d", size); } return ::malloc(size); } void operator delete(void *p) throw() { if (MEM_LOG) { AppLog("%p", p); } ::free(p); } void operator delete [] (void *p) throw() { if (MEM_LOG) { AppLog("%p", p); } ::free(p); } void operator delete(void *p, const ::std::nothrow_t &) throw() { if (MEM_LOG) { AppLog("%p", p); } ::free(p); } void operator delete [] (void *p, const ::std::nothrow_t &) throw() { if (MEM_LOG) { AppLog("%p", p); } ::free(p); } void dump_global_new_delete_override_for_system_class() { MEM_LOG = true; AppLog("================================================================"); Tizen::Base::Collection::ArrayList* p = new Tizen::Base::Collection::ArrayList(); p->Construct(); delete p; AppLog("================================================================"); MEM_LOG = false; } extern "C" _EXPORT_ int OspMain(int argc, char *pArgv[]) { AppLog("Application started."); dump_global_new_delete_override_for_system_class(); return 0; }получаем различные результаты в логах в зависимости от запуска под дебаггером или без: Когда запускаем под дебаггером (или через ‘sdb launch -m debug’), в логе, то, то я ожидаю: Но когда запускаем в run mode (или ‘sdb launch -m run’ или тапая иконку на девайсе), лог содержит только: Не вызываются перегруженные операторы если их запуск расположен в динамически подгруженной библиотеке (в примере это ArrayList из ‘libosp-appfw.so’). Проблема проявляется как на реальном девайсе так и в эмуляторе. Похоже, что undefined символы из динамических библиотек (н-р new/delete – _Znaj/_ZnajRKSt9nothrow/_ZdaPv/etc) остаются слинкованными с реализацией из “libstdc++.so”, вместо того, чтобы использовать определенные мной. Почему так происходит только при запустке? Почему в дебаггере другое, но корректное поведение? Как правильно перегрузить глобыльные операторы new и delete на Tizen платформе?BY
16 Apr 2025
Tizen Studio
BY
04 Nov 2024
Tizen Studio
BY
02 Apr 2024
Tizen Studio