Страниц: [1]
  Печать  
Автор Тема: Проблема с выделением памяти.  (Прочитано 1634 раз)
qnx_user
Full Member
***
Offline Offline

Сообщений: 122


Просмотр профиля
« : Мая 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 &.

Спасибо!
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 217



Просмотр профиля
« Ответ #1 : Мая 25, 2018, 09:38:42 pm »

Возможно, у вас другие части программы (это ведь не вся программа, верно? int10h вы же где-то вызывали.) что-то повреждают в процессе работы и к моменту вызова выполняется вовсе не указанный код. Попробуйте прогнать программу статическим анализатором, например, cppcheck.
Записан

И день и ночь в пути
qnx_user
Full Member
***
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #2 : Мая 25, 2018, 09:52:38 pm »

Возможно, у вас другие части программы (это ведь не вся программа, верно? int10h вы же где-то вызывали.) что-то повреждают в процессе работы и к моменту вызова выполняется вовсе не указанный код. Попробуйте прогнать программу статическим анализатором, например, cppcheck.
Эта конкретная программа так работает. Специально написал чистый тест. int10 запускался из консоли. Можете сами попробовать. Roll Eyes
« Последнее редактирование: Мая 25, 2018, 09:57:24 pm от qnx_user » Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 217



Просмотр профиля
« Ответ #3 : Мая 25, 2018, 10:10:13 pm »

Тогда другие вопросы:

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

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

И день и ночь в пути
qnx_user
Full Member
***
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #4 : Мая 25, 2018, 10:36:01 pm »

1.
Код:
-T level Set privity level of load file (0 .. 3 with default 3)

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

3. Отладчиком посмотреть могу, но он консольный (псевдографика) и не юзал его никогда, т.е. надо разбираться, asm код никогда не генерировал, нужно посмотреть в ключах компиляции. Хотя могу в IDA Pro посмотреть Smiley Только вызовы стандартные не думаю что это что-то даст если честно. Тут надо знать что происходит внутрях функции _getvideoconfig(), потому что если его убрать то все без проблем работает.
« Последнее редактирование: Мая 25, 2018, 10:42:16 pm от qnx_user » Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 217



Просмотр профиля
« Ответ #5 : Мая 26, 2018, 06:58:28 am »

Цитировать
Set privity level of load file

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

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

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

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

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

И день и ночь в пути
qnx_user
Full Member
***
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #6 : Мая 28, 2018, 08:50:18 am »

Цитировать
Интересный ключ. Smiley У вас не может _getvideoconfig завершаться каком-либо исключением/сигналом?
Функция только заполняет структуру, адрес которой передается на вход, и вроде бы не формирует ошибок, она к сожалению не документирована в QNX, инфу по ней нашел из сторонних источников.

Цитировать
Но тогда ещё вопрос: а не надо ли сперва инициализировать графическую библиотеку?
нет
« Последнее редактирование: Мая 28, 2018, 08:52:43 am от qnx_user » Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 217



Просмотр профиля
« Ответ #7 : Мая 28, 2018, 10:02:36 am »

Цитировать
Функция только заполняет структуру, адрес которой передается на вход, и вроде бы не формирует ошибок, она к сожалению не документирована в QNX, инфу по ней нашел из сторонних источников.

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

И день и ночь в пути
qnx_user
Full Member
***
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #8 : Мая 28, 2018, 11:34:03 am »

Но эта функция откуда-то берёт данные. А что IDA показал?
Ну это конечно. Прикрепил файл.
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 217



Просмотр профиля
« Ответ #9 : Мая 28, 2018, 12:49:26 pm »

Но это вы свою программу дизассемблировали. Но посмотреть-то надо как раз код функции getvideoconfig. Потому как она однозначно что-то портит.
Записан

И день и ночь в пути
A_O
Full Member
***
Offline Offline

Сообщений: 212


Просмотр профиля
« Ответ #10 : Мая 28, 2018, 06:39:42 pm »

Я попробовал поиграться с опциями компилятора, касающимися моделей памяти и поколения процессора. При некоторых сочетаниях ваш пример работает, например: "-2 -mh", "-2 -ml", "-mc". Похоже, что дело в передаче параметров - библиотека старая и рассчитана только на один какой-то способ адресации. У меня нет времени возиться, но интересно было бы проанализировать данные, возвращаемые функцией в структуре videoconfig, именно в тех случаях, когда ее вызов приводит к последующей ошибке, - по идее, они должны быть неправильными.
Записан
qnx_user
Full Member
***
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #11 : Мая 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
Даже получается поиграться с параметрами и изменения проходят успешно.
« Последнее редактирование: Мая 28, 2018, 08:48:07 pm от qnx_user » Записан
A_O
Full Member
***
Offline Offline

Сообщений: 212


Просмотр профиля
« Ответ #12 : Мая 29, 2018, 09:38:00 am »

Еще немного поковырялся.
1). При некоторых сочетаниях опций программа просто падает (SIGSEGV). Причем падает даже в случае пустой функции main().
2). Похоже, что _getvideoconfig во всех случаях возвращает одинаковые данные.
Возможно, она сама обращается к каким-то библиотечным функциям (скорее всего, именно к функциям выделения памяти) и каким-то образом портит содержимое кучи.
« Последнее редактирование: Мая 29, 2018, 10:35:22 am от A_O » Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 217



Просмотр профиля
« Ответ #13 : Мая 29, 2018, 10:23:00 am »

Вот поэтому и интересно было бы глянуть результат работы IDA на этой функции.
Записан

И день и ночь в пути
qnx_user
Full Member
***
Offline Offline

Сообщений: 122


Просмотр профиля
« Ответ #14 : Мая 29, 2018, 10:46:10 am »

Вот поэтому и интересно было бы глянуть результат работы IDA на этой функции.
Я уже смотрел мельком, там внутрях функции вызываются еще некоторое кол-во функций, чтобы произвести реверсинг необходимо потратить некоторое время, как свободное время появится сделаю.

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