Page 27 of 77

Re: Помогите новичку

Posted: Mon Jan 23, 2012 10:42 pm
by Serge
Как отладчик не ловит ? Он все исключения перехватывает, даже в ядре.

Re: Помогите новичку

Posted: Mon Jan 23, 2012 11:32 pm
by SoUrcerer
Пишет, что, мол, exception 0E. В поле дизассемблированного кода пусто. В регистрах какие-то значения.

Re: Помогите новичку

Posted: Tue Jan 24, 2012 2:08 am
by Serge
Очень даже ловит.
Посмотри значение eip. Вышел за границу памяти приложения. Отсюда страничное нарушение.
Или исключение было в ядре.

Re: Помогите новичку

Posted: Tue Jan 24, 2012 10:39 am
by SoUrcerer
Управление программой улетает на область памяти, и комп выполняет mov eax, al (00h 00h) пока память не кончится.
Я догадываюсь, чем такое поведение может быть вызвано в теории, но не догадываюсь, почему не происходит переход на Screen_Init.

Re: Помогите новичку

Posted: Tue Jan 24, 2012 5:17 pm
by Serge
Здесь только трассировка поможет. Ставишь в коде перед нужными функциями
asm volatile("int3");
и запускаешь в отладчике. Внимательно смотришь стек перед входом в функцию и после. Если после возврата из функции поменялось значение esp значит произошла путаница с cdecl и stdcall
объявлениями, надо проверять заголовочные файлы. Это одна из возможных причин.

Re: Помогите новичку

Posted: Tue Jan 24, 2012 5:35 pm
by SoUrcerer
Сурово, блин. Спасибо за помощь!

Re: Помогите новичку

Posted: Tue Jan 24, 2012 6:08 pm
by Serge
Долгая, нудная, неблагодарная работа.

Re: Помогите новичку

Posted: Tue Jan 24, 2012 10:20 pm
by Mario
Вот потому я и предлагал почесаться.

Re: Помогите новичку

Posted: Tue Jan 24, 2012 10:36 pm
by Serge
Mario
Твоё предложение мало поможет. А вот отладчик в исходных кодах для отладки программ на яву очень даже пригодился бы.

Re: Помогите новичку

Posted: Tue Jan 24, 2012 10:45 pm
by SoUrcerer
Что-то вроде GDB?

Re: Помогите новичку

Posted: Tue Jan 24, 2012 11:00 pm
by Serge
Только GUI. Без нескольких окон в отладчике делать нечего.

Re: Помогите новичку

Posted: Tue Jan 24, 2012 11:36 pm
by SoUrcerer
Ха, Serge, спасибо! Я разобрался получше с отладчиком, и выяснил, что мой компилятор "немного оптимизировал" код, в результате в лог выводилась информация уже после крэша. А крэш происходит в процедуре memset (что странно, раньше не происходил)

Re: Помогите новичку

Posted: Tue Jan 24, 2012 11:50 pm
by SoUrcerer
И опять тупняк.
screen.c

Code: Select all

/* extern for video.c */
FRAMEBUFFER *pFrameBuffer;    /* Pointer into current 'FrameBuffer' */
static FRAMEBUFFER FrameBuffers[NUM_FRAMEBUFFERS]; /* Store frame buffer details to tell how to update */

memset(FrameBuffers, 0, NUM_FRAMEBUFFERS * sizeof(FRAMEBUFFER));
screen.h

Code: Select all

#define HBL_PALETTE_LINES ((NUM_VISIBLE_LINES+1)*16)
/* Bit mask of palette colours changes, top bit set is resolution change */
#define HBL_PALETTE_MASKS (NUM_VISIBLE_LINES+1)


/* Frame buffer, used to store details in screen conversion */
typedef struct
{
  Uint16 HBLPalettes[HBL_PALETTE_LINES];
  Uint32 HBLPaletteMasks[HBL_PALETTE_MASKS];
  Uint8 *pSTScreen;             /* Copy of screen built up during frame (copy each line on HBL to simulate monitor raster) */
  Uint8 *pSTScreenCopy;         /* Previous frames copy of above  */
  int OverscanModeCopy;         /* Previous screen overscan mode */
  bool bFullUpdate;             /* Set TRUE to cause full update on next draw */
} FRAMEBUFFER;

/* Number of frame buffers (1 or 2) - should be 2 for supporting screen flipping */
#define NUM_FRAMEBUFFERS  2
Похоже, эта команда забивает всё-всё нулями.
Нужно убедиться, что зависает точно на ней/строго после неё, затем посмотреть на sizeof(FRAMEBUFFER) и если всё похоже на правду, то ковырять memset, правильно?

Re: Помогите новичку

Posted: Wed Jan 25, 2012 12:09 am
by Serge
Возможно, но буфер статический, все размеры и адреса определяются ещё на этапе компиляции. memset скорее всего без ошибок. Надо смотреть map файл, где именно этот буфер, какой у него размер и что там может потереться.

Re: Помогите новичку

Posted: Wed Jan 25, 2012 12:35 am
by SoUrcerer
В map-файле нет FrameBuffers. Это нормально?