bada
Сам пока еще не имею опыта подобной отладки на PSP. Но думаю, что offset записан в EPC (типа program counter), т.е. тебе надо искать в полученном от psp-objdump map-файле адрес 0326C560, и не обязательно что он там такой будет (в этом случае найди границы, между кототрыми он находится). Совершенно точно, что такая отладка предполагает какое-то знание ассемблера и представление причины, по которым комбинация набора значений регистров и инструкции вызвала GPF-сбой.
Следующий вопрос. Чем это может помочь? Очевидно, что ничем, если у тебя нет знания архитектуры.
Да, вдогонку. Я предполагаю что такая вот фигня (Cause 18) может получиться из-за ошибки доступа к данным. Например, к элементам структур с плохим выравниванием. Там целая эпопея. Я в соседней теме (PSP - подводные камни) помещу лог, который может быть будет тебе полезен.
Padawan
почитал лог, это что совсем так все плохо? та лааадддно...вон народа на ДС пишет .. им вобще даже на фриварном сдк класть на выравнивание, и ничего - пашет и сеет......вы уж меня и всех запугали ))))))
кстати...поборов все ашипки в коде, прога все равно виснит при перегрузке ((
по асму - вылет в <_malloc_r> .... единое место - в библиотеке пнг.....черт.....у кого есть либа на пнг чтоб работала? )))
bada
Тебе уже много раз говорил, что лучше свой pool manager, и без free.
Один раз делаешь например такое
dsMemoryPool* pool = &memoryPool[memoryPoolFreeIndex];
pool->memoryBlockID = sceKernelAllocPartitionMemory
(
SCE_KERNEL_PRIMARY_USER_PARTITION,
"dsEngine::MemoryPool",
SCE_KERNEL_SMEM_HIGH,
size,
(void*)4096
);
ASSERT(pool->memoryBlockID > 0,"error allocating kernel partition memory 0x%08x",pool->memoryBlockID);
pool->currentheap = static_cast<unsigned char*>(sceKernelGetBlockHeadAddr(pool->memoryBlockID));
pool->minheap = pool->currentheap;
pool->maxheap = pool->currentheap + size;
и забываешь резко про mallocs
=========================
2. Если не думать про align, это сразу exception BUS ERROR, это реальность ! На DS стоит ARM7-ARM9 которому насрать на выравнивание, но подозреваю что все равно там будет penalty
bada
> кстати...поборов все ашипки в коде, прога все равно виснит при перегрузке ((
> по асму - вылет в <_malloc_r> .... единое место - в библиотеке пнг.....черт.....у кого есть либа на пнг чтоб работала? )))
malloc он у многих не работает.
Соответственно middleware которое юзает malloc тоже может не работать.
Поцаны кладут на это ;)
neteraser
эээ кладут на это и все равно пишут malloc или пишут свой распределитель?
я вот просто в тихом шоке....а как это у меня 7(семь) месяцев все работало?????? и даже кучу кода уже написано...ага с виртуальным наследованием и ..ага....со сторонними бибилотеками....и без никаких выравниваний - вот он - МЕДНЫЙ ТАЗ!!
bada
> и без никаких выравниваний - вот он - МЕДНЫЙ ТАЗ!!
Если просто писать структуры, маллокировать и копировать по полям - компилятор сам за тебя выравнивания делает :)
А вот как только озадачиваешься memory mapped или работой с align 64 - тут то и начинается жопа
Updated: а где тебе потребовалось виртуальное наследование? Интересно подсчитать, какое там пенальти будет!
KVaks
дяденька, научите писать такие умные пулы, ато я ниразу не писал.....ну или скажите где подсмотреть
>> я вот просто в тихом шоке....а как это у меня 7(семь) месяцев все работало?????? и даже кучу кода уже написано...ага с виртуальным наследованием и ..ага....со сторонними бибилотеками....и без никаких выравниваний - вот он - МЕДНЫЙ ТАЗ!!
Я так от смеха и надорвусь :)
bada
Я уже дал тебе подсмотреть :) а в нем у тебя уже есть memory start и memory end (aka minheap maxheap)
делаешь malloc
void* uber_malloc(int size)
{
void* address = currentheap;
currentheap = currentheap + size; // таже нада учитывать alignment
return address;
}
в DEBUG ставишь там ASSERT
когда level reload делаешь currentheap = minheap, и ни одного free
это конечно сильно упрощенно, но можешь стартануть с этого, и по ходу добавлять функциональность.
bada
Это называет heap стекового типа. Только malloc() и общий discard(). Навороченные системы "умеют" также делать и free(), но в том же самом стековом порядке (LIFO)
KVaks
> На DS стоит ARM7-ARM9 которому насрать на выравнивание, но подозреваю что все равно там будет penalty
А куда же оно денется? Считывание информации с двух адресов памяти и объединение внутри процессора :)
кстати и memset тоже вылетает, ура товарищи!
а что это за число такое хитрое ? (void*)4096 ?
и "тоже учитывать элайнмент" это как и по какому месту?
bada
>пнг.....черт.....у кого есть либа на пнг чтоб работала? )))
Чорт, пропустил пост. Сейчас отвечу.
Залез в png.h, увидел структуру png_info_struct. Подсчитал поля, посочувствовал. ИМХО без серьезной переделки исходников png загрузить не удастся.
Подробнее - см. здесь http://www.gamedev.ru/community/ps2dev/forum/?id=1209, пост №3.
Димка
гммм....гмммм.....вобщето , по секрету - все грузицца без никаких....и все ээээндцать метров ресурсов у меня в пнг....воот....а то что по каким то странным причинам вдруг перестает работать - это все печально....просто там можно подменять считывание и выделение памяти, что я и сделал....но! в какойто произвольный момент - бам - доступ по нулю или вобще мертвый повис.....причем это настало когда на уровне уже так эээ3 перса со всеми анимациями и 3 врага + фон....тоесть оживленно , да
bada
Странно. Работать не должна :). В структуре, в которой идет int16, а потом int32, должно быть выравнивание адресов и добавление лишних двух байт.
Как только найду немного времени, посмотрю, как png загружает данные.
По поводу exception в malloc_r - могу только посоветовать заменить менеджер памяти на какой-то оладочный и смотреть уже там.
У меня в PS2 все основные падения в malloc_r происходили из-за записи в освобожденный блок.
Тема в архиве.