QNX.ORG.RU

Разработка => Программирование под QNX 4.x => Тема начата: qnx_user от Мая 25, 2018, 09:33:31 pm



Название: Проблема с выделением памяти.
Отправлено: qnx_user от Мая 25, 2018, 09:33:31 pm
Здравствуйте!

Столкнулся со странной проблемой, есть тестовый код:

Код:
#include <stdio.h>
#include <graph.h>
#include <malloc.h>

static struct videoconfig vc;

int main()
{
void *p;

p = malloc( 4 );
if ( NULL == p ) {
printf( "Error allocating memory\n" );
}
free( p );

_getvideoconfig( &vc );

p = malloc( 512 );
if ( NULL == p ) {
printf( "Error allocating memory\n" );
}
free( p );

return 0;
}

после вызова _getvideoconfig() функция malloc() отказывается выделять блок памяти. Если поиграться с размерами выделяемого блока в вызовах malloc(), то можно заметить что при различных комбинациях 2-й вызов функции malloc() отрабатывает по разному. Подскажите с чем связано такое поведение?

P.S. программу собирал c ключом -T1. Предварительно запустил int10 &.

Спасибо!


Название: Re: Проблема с выделением памяти.
Отправлено: da-nie от Мая 25, 2018, 09:38:42 pm
Возможно, у вас другие части программы (это ведь не вся программа, верно? int10h вы же где-то вызывали.) что-то повреждают в процессе работы и к моменту вызова выполняется вовсе не указанный код. Попробуйте прогнать программу статическим анализатором, например, cppcheck.


Название: Re: Проблема с выделением памяти.
Отправлено: qnx_user от Мая 25, 2018, 09:52:38 pm
Возможно, у вас другие части программы (это ведь не вся программа, верно? int10h вы же где-то вызывали.) что-то повреждают в процессе работы и к моменту вызова выполняется вовсе не указанный код. Попробуйте прогнать программу статическим анализатором, например, cppcheck.
Эта конкретная программа так работает. Специально написал чистый тест. int10 запускался из консоли. Можете сами попробовать. ::)


Название: Re: Проблема с выделением памяти.
Отправлено: da-nie от Мая 25, 2018, 10:10:13 pm
Тогда другие вопросы:

Цитировать
P.S. программу собирал c ключом -T1.

Что он означает?  ::)
Что у вас за система? Вы всё это в QNX4 делаете (я её никогда не видел, кроме демонстрационной дискеты, потому и не в курсе, похож ваш код на код для этой ОС или нет -а так, на MS-DOS похож)? Есть ли возможность посмотреть отладчиком, что за код создаётся и какие функции вызываются?


Название: Re: Проблема с выделением памяти.
Отправлено: qnx_user от Мая 25, 2018, 10:36:01 pm
1.
Код:
-T level Set privity level of load file (0 .. 3 with default 3)

2. Система QNX4, тема создана в соответствующей ветке не с проста ;)

3. Отладчиком посмотреть могу, но он консольный (псевдографика) и не юзал его никогда, т.е. надо разбираться, asm код никогда не генерировал, нужно посмотреть в ключах компиляции. Хотя могу в IDA Pro посмотреть :) Только вызовы стандартные не думаю что это что-то даст если честно. Тут надо знать что происходит внутрях функции _getvideoconfig(), потому что если его убрать то все без проблем работает.


Название: Re: Проблема с выделением памяти.
Отправлено: da-nie от Мая 26, 2018, 06:58:28 am
Цитировать
Set privity level of load file

Интересный ключ. :) У вас не может _getvideoconfig завершаться каком-либо исключением/сигналом?

Цитировать
Хотя могу в IDA Pro посмотреть

Это лучший вариант. :)

Цитировать
Тут надо знать что происходит внутрях функции _getvideoconfig(), потому что если его убрать то все без проблем работает.

Но как бы функция-то стандартная и должна 100% всегда работать. Но тогда ещё вопрос: а не надо ли сперва инициализировать графическую библиотеку?


Название: Re: Проблема с выделением памяти.
Отправлено: qnx_user от Мая 28, 2018, 08:50:18 am
Цитировать
Интересный ключ. :) У вас не может _getvideoconfig завершаться каком-либо исключением/сигналом?
Функция только заполняет структуру, адрес которой передается на вход, и вроде бы не формирует ошибок, она к сожалению не документирована в QNX, инфу по ней нашел из сторонних источников.

Цитировать
Но тогда ещё вопрос: а не надо ли сперва инициализировать графическую библиотеку?
нет


Название: Re: Проблема с выделением памяти.
Отправлено: da-nie от Мая 28, 2018, 10:02:36 am
Цитировать
Функция только заполняет структуру, адрес которой передается на вход, и вроде бы не формирует ошибок, она к сожалению не документирована в QNX, инфу по ней нашел из сторонних источников.

Но эта функция откуда-то берёт данные. А что IDA показал?


Название: Re: Проблема с выделением памяти.
Отправлено: qnx_user от Мая 28, 2018, 11:34:03 am
Но эта функция откуда-то берёт данные. А что IDA показал?
Ну это конечно. Прикрепил файл.


Название: Re: Проблема с выделением памяти.
Отправлено: da-nie от Мая 28, 2018, 12:49:26 pm
Но это вы свою программу дизассемблировали. Но посмотреть-то надо как раз код функции getvideoconfig. Потому как она однозначно что-то портит.


Название: Re: Проблема с выделением памяти.
Отправлено: A_O от Мая 28, 2018, 06:39:42 pm
Я попробовал поиграться с опциями компилятора, касающимися моделей памяти и поколения процессора. При некоторых сочетаниях ваш пример работает, например: "-2 -mh", "-2 -ml", "-mc". Похоже, что дело в передаче параметров - библиотека старая и рассчитана только на один какой-то способ адресации. У меня нет времени возиться, но интересно было бы проанализировать данные, возвращаемые функцией в структуре videoconfig, именно в тех случаях, когда ее вызов приводит к последующей ошибке, - по идее, они должны быть неправильными.


Название: Re: Проблема с выделением памяти.
Отправлено: qnx_user от Мая 28, 2018, 07:46:23 pm
Я попробовал поиграться с опциями компилятора, касающимися моделей памяти и поколения процессора. При некоторых сочетаниях ваш пример работает, например: "-2 -mh", "-2 -ml", "-mc". Похоже, что дело в передаче параметров - библиотека старая и рассчитана только на один какой-то способ адресации. У меня нет времени возиться, но интересно было бы проанализировать данные, возвращаемые функцией в структуре videoconfig, именно в тех случаях, когда ее вызов приводит к последующей ошибке, - по идее, они должны быть неправильными.
Да, у меня сегодня появились мысли что проблема в адресации памяти, спасибо за ответ, покопаю в эту сторону.

P.S. Вроде проблем с выводом нет:
Код:
Количество пикселов на оси x:     0
Количество пикселов на оси y:     0
Количество символов в строке:     80
Количество текстовых строк:       25
Количество используемых цветов:   32
Кол-во бит видеопамяти на пиксел: 0
Количество страниц видеопамяти:   8
Тек. режим работы видеоадаптера:  3
Тип активного видеоадаптера:      Super VGA
Тип активного дисплея:            Цветной аналоговый
Объем видеопамяти в килобайтах:   256
Error allocating memory
Даже получается поиграться с параметрами и изменения проходят успешно.


Название: Re: Проблема с выделением памяти.
Отправлено: A_O от Мая 29, 2018, 09:38:00 am
Еще немного поковырялся.
1). При некоторых сочетаниях опций программа просто падает (SIGSEGV). Причем падает даже в случае пустой функции main().
2). Похоже, что _getvideoconfig во всех случаях возвращает одинаковые данные.
Возможно, она сама обращается к каким-то библиотечным функциям (скорее всего, именно к функциям выделения памяти) и каким-то образом портит содержимое кучи.


Название: Re: Проблема с выделением памяти.
Отправлено: da-nie от Мая 29, 2018, 10:23:00 am
Вот поэтому и интересно было бы глянуть результат работы IDA на этой функции.


Название: Re: Проблема с выделением памяти.
Отправлено: qnx_user от Мая 29, 2018, 10:46:10 am
Вот поэтому и интересно было бы глянуть результат работы IDA на этой функции.
Я уже смотрел мельком, там внутрях функции вызываются еще некоторое кол-во функций, чтобы произвести реверсинг необходимо потратить некоторое время, как свободное время появится сделаю.

Возможно, она сама обращается к каким-то библиотечным функциям (скорее всего, именно к функциям выделения памяти) и каким-то образом портит содержимое кучи.
Скорее всего так и есть.