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 &. Спасибо!
|
|
|
Записан
|
|
|
|
da-nie
|
 |
« Ответ #1 : Мая 25, 2018, 09:38:42 pm » |
|
Возможно, у вас другие части программы (это ведь не вся программа, верно? int10h вы же где-то вызывали.) что-то повреждают в процессе работы и к моменту вызова выполняется вовсе не указанный код. Попробуйте прогнать программу статическим анализатором, например, cppcheck.
|
|
|
Записан
|
И день и ночь в пути
|
|
|
qnx_user
|
 |
« Ответ #2 : Мая 25, 2018, 09:52:38 pm » |
|
Возможно, у вас другие части программы (это ведь не вся программа, верно? int10h вы же где-то вызывали.) что-то повреждают в процессе работы и к моменту вызова выполняется вовсе не указанный код. Попробуйте прогнать программу статическим анализатором, например, cppcheck.
Эта конкретная программа так работает. Специально написал чистый тест. int10 запускался из консоли. Можете сами попробовать. 
|
|
« Последнее редактирование: Мая 25, 2018, 09:57:24 pm от qnx_user »
|
Записан
|
|
|
|
da-nie
|
 |
« Ответ #3 : Мая 25, 2018, 10:10:13 pm » |
|
Тогда другие вопросы: P.S. программу собирал c ключом -T1. Что он означает?  Что у вас за система? Вы всё это в QNX4 делаете (я её никогда не видел, кроме демонстрационной дискеты, потому и не в курсе, похож ваш код на код для этой ОС или нет -а так, на MS-DOS похож)? Есть ли возможность посмотреть отладчиком, что за код создаётся и какие функции вызываются?
|
|
|
Записан
|
И день и ночь в пути
|
|
|
qnx_user
|
 |
« Ответ #4 : Мая 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(), потому что если его убрать то все без проблем работает.
|
|
« Последнее редактирование: Мая 25, 2018, 10:42:16 pm от qnx_user »
|
Записан
|
|
|
|
da-nie
|
 |
« Ответ #5 : Мая 26, 2018, 06:58:28 am » |
|
Set privity level of load file Интересный ключ.  У вас не может _getvideoconfig завершаться каком-либо исключением/сигналом? Хотя могу в IDA Pro посмотреть Это лучший вариант.  Тут надо знать что происходит внутрях функции _getvideoconfig(), потому что если его убрать то все без проблем работает. Но как бы функция-то стандартная и должна 100% всегда работать. Но тогда ещё вопрос: а не надо ли сперва инициализировать графическую библиотеку?
|
|
|
Записан
|
И день и ночь в пути
|
|
|
qnx_user
|
 |
« Ответ #6 : Мая 28, 2018, 08:50:18 am » |
|
Интересный ключ.  У вас не может _getvideoconfig завершаться каком-либо исключением/сигналом? Функция только заполняет структуру, адрес которой передается на вход, и вроде бы не формирует ошибок, она к сожалению не документирована в QNX, инфу по ней нашел из сторонних источников. Но тогда ещё вопрос: а не надо ли сперва инициализировать графическую библиотеку?
нет
|
|
« Последнее редактирование: Мая 28, 2018, 08:52:43 am от qnx_user »
|
Записан
|
|
|
|
da-nie
|
 |
« Ответ #7 : Мая 28, 2018, 10:02:36 am » |
|
Функция только заполняет структуру, адрес которой передается на вход, и вроде бы не формирует ошибок, она к сожалению не документирована в QNX, инфу по ней нашел из сторонних источников. Но эта функция откуда-то берёт данные. А что IDA показал?
|
|
|
Записан
|
И день и ночь в пути
|
|
|
qnx_user
|
 |
« Ответ #8 : Мая 28, 2018, 11:34:03 am » |
|
Но эта функция откуда-то берёт данные. А что IDA показал?
Ну это конечно. Прикрепил файл.
|
|
|
Записан
|
|
|
|
da-nie
|
 |
« Ответ #9 : Мая 28, 2018, 12:49:26 pm » |
|
Но это вы свою программу дизассемблировали. Но посмотреть-то надо как раз код функции getvideoconfig. Потому как она однозначно что-то портит.
|
|
|
Записан
|
И день и ночь в пути
|
|
|
A_O
|
 |
« Ответ #10 : Мая 28, 2018, 06:39:42 pm » |
|
Я попробовал поиграться с опциями компилятора, касающимися моделей памяти и поколения процессора. При некоторых сочетаниях ваш пример работает, например: "-2 -mh", "-2 -ml", "-mc". Похоже, что дело в передаче параметров - библиотека старая и рассчитана только на один какой-то способ адресации. У меня нет времени возиться, но интересно было бы проанализировать данные, возвращаемые функцией в структуре videoconfig, именно в тех случаях, когда ее вызов приводит к последующей ошибке, - по идее, они должны быть неправильными.
|
|
|
Записан
|
|
|
|
qnx_user
|
 |
« Ответ #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
|
 |
« Ответ #12 : Мая 29, 2018, 09:38:00 am » |
|
Еще немного поковырялся. 1). При некоторых сочетаниях опций программа просто падает (SIGSEGV). Причем падает даже в случае пустой функции main(). 2). Похоже, что _getvideoconfig во всех случаях возвращает одинаковые данные. Возможно, она сама обращается к каким-то библиотечным функциям (скорее всего, именно к функциям выделения памяти) и каким-то образом портит содержимое кучи.
|
|
« Последнее редактирование: Мая 29, 2018, 10:35:22 am от A_O »
|
Записан
|
|
|
|
da-nie
|
 |
« Ответ #13 : Мая 29, 2018, 10:23:00 am » |
|
Вот поэтому и интересно было бы глянуть результат работы IDA на этой функции.
|
|
|
Записан
|
И день и ночь в пути
|
|
|
qnx_user
|
 |
« Ответ #14 : Мая 29, 2018, 10:46:10 am » |
|
Вот поэтому и интересно было бы глянуть результат работы IDA на этой функции.
Я уже смотрел мельком, там внутрях функции вызываются еще некоторое кол-во функций, чтобы произвести реверсинг необходимо потратить некоторое время, как свободное время появится сделаю. Возможно, она сама обращается к каким-то библиотечным функциям (скорее всего, именно к функциям выделения памяти) и каким-то образом портит содержимое кучи.
Скорее всего так и есть.
|
|
|
Записан
|
|
|
|
|