Сейчас на форуме: vsv1, r0lka, -Sanchez-, testrev1337, johnniewalker (+3 невидимых) |
eXeL@B —› Крэки, обсуждения —› Помогите пофиксить чужой баг (Borland C++) |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 16 января 2010 01:31 · Поправил: SergX · Личное сообщение · #1 Описание софта: Есть софтинка CarTest-injector нужная мне для работы. Под неё уже сделано всё железо. Прога эта управляет стендом для чистки/проверки автомобильных бензиновых форсунок. Она формирует сигнал нужной формы на 4-ый пин COM порта (DTR). Ни как не проверяет наличие адаптера и не ждёт никакого ответа, просто посылает импульсы. Прога написана на Borland C++ и ни чем не пакована, защиты тоже нет. Не проблема конечно и самому написать аналог, но жалко времени, которого и так нет… Описание бага: Прога проверялась мной на нескольких стационарных компах и на нескольких ноутах. На ноутах при нажатии на кнопку “Start”, тест который должен идти 60сек доходит до 100% за 15-20сек при этом и частота импульсов левая… На стационарных всё нормально. Читал на форумах что у многих та же хрень. Что нарыл: Прога юзает файл IOPORT.DLL который вовсе не DLL а какая-то хрень. Событие при создание главного окна - 004025F0 Процедура кнопки СТАРТ - 00401784 Тут процедура СТАРТ начинает что-то чудить с IOPORT.DLL - 00401A93 Процедура кнопки СТОП - 00402488 Используется два VCL таймера, обработчик первого - 004025AC, со вторым не разобрался… Софт тут: Просьба ко всем у кого есть 3 свободные минуты: проверьте сколько времени у вас будет длится тест после нажатия кнопки “START” (без изменения настроек). В идеале должно быть 60сек. И напишите какой у вас результат по времени, проц и версия маздая. Буду благодарен за любые советы. |
|
Создано: 16 января 2010 08:02 · Личное сообщение · #2 Тип ЦП Mobile DualCore Intel Pentium T4200, 2000 MHz (10 x 200) Операционная система Microsoft Windows XP Professional SP 3 Время у меня меньше одной секунды Но при запуске программа ругалась из-за не подсоединения блока. Может, из-за этого тест так коряво проходит. А так программа старая, поэтому, скорее всего, время теста зависит от производительности системы или железа. |
|
Создано: 16 января 2010 08:19 · Поправил: SER[G]ANT · Личное сообщение · #3 Nabu пишет: А так программа старая, поэтому, скорее всего, время теста зависит от производительности системы или железа. При чем тут производительность железа, если там установлен таймер ? 60 секунд они и в Африке 60 секунд. SergX пишет: Просьба ко всем у кого есть 3 свободные минуты: проверьте сколько времени у вас будет длится тест после нажатия кнопки “START” (без изменения настроек). В идеале должно быть 60сек. И напишите какой у вас результат по времени, проц и версия маздая. DualCore AMD Athlon II X2 250, 3000 MHz (15 x 200) Windows XP Pro SP3 Результат: Статический тест: Текущий расход мл - 150 Динамический тест: Текущий расход мл - 7,2525 Оба теста проходили положенные 60 секунд. |
|
Создано: 16 января 2010 09:22 · Личное сообщение · #4 SergX ADM Sempro 2300 Win XP SP2 Оба теста - проходили за 70 сек (1 мин 10 сек) Глянул на код Возможно, причина неадекватности в том, что при нажатии на старт програма запускает поток и ставит ему прио 5 (tpHighest) - как про меня ето уже слишком, такой приоритет только у критических системных процессов Попробуйте уменьшить прио хотя б до простого tpHigher (4): Code:
2) IOPORT.DLL - не реальная длл а user data file, после чтения первих 10 бт проверяет первую и последнюю букву (F, y) в сигнатуре файла "Forsunky" ) 3) на главном окне - два таймера, но у второго нету обработчика. А 1й - неясно как запукаеться (по умолчанию у него Enabled = False) |
|
Создано: 16 января 2010 10:10 · Личное сообщение · #5 |
|
Создано: 16 января 2010 10:55 · Личное сообщение · #6 |
|
Создано: 16 января 2010 12:17 · Поправил: SergX · Личное сообщение · #7 Nabu пишет: Время у меня меньше одной секунды Но при запуске программа ругалась из-за не подсоединения блока. Просто у тебя COM порта нету. Забыл об этом предупредить. Порт как устройство нужен для работы проги, но подключено ли что-то не важно. sendersu пишет: Попробуйте уменьшить прио хотя б до простого tpHigher (4): спс, попробую. это я не заметил. sendersu пишет: IOPORT.DLL - не реальная длл а user data file, после чтения первих 10 бт проверяет первую и последнюю букву (F, y) в сигнатуре файла "Forsunky" Это я видел, потом прога догружает остальное и что-то сним делает. Пока что не разобрался, запутано слишком. Обращение к IOPORT.DLL есть всегда перед работой с портом. Думаю что там код который оно грузит, обрабатывает и выполняет. Скорее всего в IOPORT.DLL небольшая прога писаная на асме которая непосредственно и управляет портом, а интерфейс ей только передаёт настройки. Буду ковырять в этом направлении. sendersu пишет: А 1й - неясно как запукаеться (по умолчанию у него Enabled = False) Как запускается, тоже не понял, но этот таймер как-раз отвечает за завершение теста. Он сам себя выключает и вызывает обработчик кнопки "СТОП". Но проблема не только в нём. Nabu пишет: В том то и дело как установлен этот таймер. Пару раз мне встречалось такое, что авторы программ использовали алгоритмы, которые зависели от производительности. Тут использован стандартный VCL таймер самой Borland C++. Он убогий и может давать погрешность но не на столько... |
|
Создано: 16 января 2010 12:36 · Поправил: SVLab · Личное сообщение · #8 Имеются определенные различия в работе COM порта на 9х системах и на XP. Некоторые прямо бросаются в глаза. Например на 9х драйвер порта грузится при запуске системы всегда, независимо от того, подключено к порту что-нибудь или нет, а в XP, если при старте система ничего не находит, то и драйвер не грузится. Кто переходил с 9х на XP и имел внешний dial-up модем, с этим знакомы. Возможно, есть и другие, невидимые глазу различия, из-за чего на этой программе лезут всякие баги. Эта программа, судя по внешнему виду, предназначена для 9х, для XP вроде была версия, в названии которой прямо указывалась аббревиатура ХР. То что прожка не проверяет наличие устройства при работе, возможно разрабы посчитали достаточным сообщение, выдаваемое при запуске, или при взломе поменяли лишний переход. Ноуты вещь специфическая. Попробуй найти старый ноут с COM портом, который предназначался для работы с 9х, и там попробовать (на 9х). А высокий приоритет ставится, скорее всего, для того, что бы повысить точность таймеров, дабы не мешали менее приоритетные события. |
|
Создано: 16 января 2010 12:55 · Личное сообщение · #9 SergX пишет: Как запускается, тоже не понял, но этот таймер как-раз отвечает за завершение теста. Он сам себя выключает и вызывает обработчик кнопки "СТОП". Но проблема не только в нём. я ради интереса менял интервал таймера. Все оставалось так же. Но прогрессбар доходил до 98%, а потом было ожидание равное поставленному мной интервалу. |
|
Создано: 16 января 2010 13:05 · Поправил: SergX · Личное сообщение · #10 Сигнал на порт у меня есть на всех компах. На ноутах частота импульсов увеличена пропорционально ускорению времени прохождения теста. Пробовал тыкать в ноут карточку с дополнительными СОМ портами, разницы нет. SVLab пишет: для XP вроде была версия, в названии которой прямо указывалась аббревиатура ХР. Да есть такая, с ней та же история. Подробностей не помню, но тоже на ноутах не работала нормально. SVLab пишет: То что прожка не проверяет наличие устройства при работе, возможно разрабы посчитали достаточным сообщение, выдаваемое при запуске, или при взломе поменяли лишний переход. Прога вроде скачана с офф сайта и не ломана. Наличие устройства определить не возможно так как в нём нет никаких мозгов. Устройство состоит из 4-х полевиков которые получая сигнал от порта открываются и подают 12v на форсунки. Nabu пишет: Но прогрессбар доходил до 98%, а потом было ожидание равное поставленному мной интервалу. Замечал не раз небольшую (2-6 сек) задержку на 98%. Значит этот таймер можно оставить в покое, проблема не в нём. |
|
Создано: 16 января 2010 13:29 · Личное сообщение · #11 SergX пишет: Прога вроде скачана с офф сайта и не ломана /*401DD0*/ PUSH 30 /*401DD2*/ PUSH 0049B592//Внимание! /*401DD7*/ PUSH 0049B531//Данная версии программы не является зарегестрированной и не будет работать на данном компьютере! /*401DDC*/ PUSH 0 /*401DDE*/ CALL <JMP.&USER32.MessageBoxA> ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 16 января 2010 13:59 · Поправил: ToBad · Личное сообщение · #12 Проверил на двух стационарных компах: Athlon 64 X2 7750 (2.71Ггц), XP SP3 - оба теста в норме по времени, загрузка проца 40-50%. Athlon 64 3000+ (1.81Ггц) , XP SP2 - загрузка проца от 98 при старте и падает до 80% под конец теста. Тест проходит на 10-15 секунд дольше, подвисает на 98%... Ты не пробывал промониторить что идёт на ком порт? Может данные с ноутов вообще не посылаются? А так найти место где стартует процесс и идёт первое переключение состояния DTR и протрейсить в файл до момента когда тест заканчивается. Ес-но сделать это на правильном и неправильном компе. Думаю там в основном циклы. В общем разницу думаю заметишь если программа не так работает. Но как мне кажется дело в ошибке расчёта интервалов между импульсами, а если в трейслоге ты это увидишь - то без труда найдёшь место ошибочного расчёта.... p.s. А как вам это?: Слишком большая скорость процессора! Данный класс работает только для процессоров до 4 млрд.герц! До этого идёт расчёт интервалов для работы циклов, непосредственно перед установкой SetCommTimeouts. Вот и ответ, есть ограничения в работе класса, автор что-то пытается вычислить, но ошибается, это сообщение никто не видит, но таймауты порта устанавливаются не правильно, из за этого на ноутах и быстрее.... |
|
Создано: 16 января 2010 14:40 · Личное сообщение · #13 ClockMan совершенно прав, прога ломана. По адресу 40159A есть переход который обходит сообщение: Слишком большая скорость процессора! Данный класс работает только для процессоров до 4 млрд.герц! Если прыжок выполнить, то получаем сообщение и на любом компе программа пробегает секунд за 20... IOPORT.DLL - это скорее всего ключик привязки к компу. Видимо сломали неплохо, но не учли то, что на некоторых компах появятся должно это сообщение. Нужно смотреть что и как считает на нормальных компах и на ноутах. То есть обрати внимание на адрес 4015DE где rdtsc. Видимо на мобильных платформах как то особенно работает и выдаёт некорректные результаты, либо автор далее что то закосячил... Думаю разгадка тут. В общем внимательно изучи работу sub_401544 и разницу работы sub_4015D8 на обычных процах и на мобильных. |
|
Создано: 16 января 2010 14:42 · Поправил: SVLab · Личное сообщение · #14 Если скачана с оффсайта и неломана, значит это демка, иначе зачем там мессадж по адресу 401dde О, уже этот вопрос мусолится Если там такое простое устройство, что нельзя проверить его подключение, каким боком тогда здесь другой мессадж по адресу 4076d7 "Блок не найден! Проверьте правильность подсоединения блока и его питания!" |
|
Создано: 16 января 2010 14:52 · Поправил: ToBad · Личное сообщение · #15 SergX вот интересная ссылочка которая возможно прольёт свет на проблему: forum.ixbt.com/topic.cgi?id=26:38128 Например это интересный момент: забудьте Вы про rdtsc. сказали же, что есть проблемы с синхронизацией на многоядерниках, и частота плавает при включенных Enhanced Intel SpeedStep Technology (EIST) / AMD Cool 'n' Quiet. p.s. Начинаю думать, что проблема не в кривом сломе, а в работе rdtsc на разных процах. Раз на остальных компах работает нормально и свои функции выполняет по словам топикстартера. |
|
Создано: 16 января 2010 15:46 · Личное сообщение · #16 |
|
Создано: 16 января 2010 17:42 · Личное сообщение · #17 |
|
Создано: 16 января 2010 18:12 · Личное сообщение · #18 Он сказал, что прога работает на стационарных. Какая разница, где взял и кто ломал или не ломал. Речь о глюке, об ошибке которая только на мобильных платформах возникает. Кто хорошо понимает работу rdtsc на си и нюансы работы на мобильных платформах или хотя бы имеет ноут для теста - думаю без труда пофиксит.... |
|
Создано: 16 января 2010 19:55 · Личное сообщение · #19 То что прога работает на стационарах, никак не указывает на то, что она не была криво поломана. Отличие COM портов на ноутах может быть аппаратным, обычно уровни сигналов там не соответствуют стандарту RS232. SergX, конечно, говорил, что "Наличие устройства определить не возможно так как в нём нет никаких мозгов", но зачем тогда сообщение "Блок не найден! Проверьте правильность подсоединения блока и его питания!". По моему, для этого особые мозги устройству и ненужны, достаточно проверить уровни. На ноуте они могут быть другими, и хотя устройство подключено, программа просто его не видит, а из-за кривого взлома не выводит это сообщение. Ну эт так конечно, просто размышления. (Но то что уровни ноутбучных COM могут отличаться от стационарных, это точно). |
|
Создано: 16 января 2010 21:58 · Поправил: ToBad · Личное сообщение · #20 SVLab пишет: Но то что уровни ноутбучных COM могут отличаться от стационарных, это точно SergX говорил, что ставил внешнюю плату с портами, значит этот вариант исключён. Фишка в том, что весь процесс при нормальных условиях должен занимать где то минуту, ибо играют роль продолжительность импульсов и время между ними. Со слов топикстартера ясно, что на ноутах всё работает так же, только за 20 секунд, то есть ускорено в 3 раза. Перед открытием порта и настройкой таймаутов идет проверка быстродействия машины (sub_4015D8), где за счёт ошибки rdtsc специфичной для мобильных платформ мы и получаем неверный расчёт в ходе которого всё происходит в 3 раза быстрее и естественно оборудование подключаемое на ком порт уже не воспринимает это. p.s. В общем так получается, мы запоминаем значения вызвав функцию с инструкцией rdtsc, затем по адресу 401563 делаем секундную паузу sleep, затем ещё раз функу с rdtsc. Таким образом автор вычисляет на сколько изменился TSC (Time Stamp Counter) за секунду. Так или иначе проблема тут. У кого ещё остались сомнения - поменяйте интервал sleep в большую и меньшую сторону. Тут и ошибка про 4Ггц всплывёт, и проход за 15-20 секунд как на ноуте увидите на стационарном.... p.p.s. Пишу это сообщение, а сам думаю, нужно дату поста глянуть, может это 2007 оживили.... |
|
Создано: 16 января 2010 22:41 · Поправил: SVLab · Личное сообщение · #21 Но он не сказал, какую именно плату. Если там нет преобразователя уровней, ее порты ничем не будут отличаться от ноутбучных, а, вообще, много внешних COM эмуляторов, которые не работают с тем или иным оборудованием. Если б можно было подключить эту плату к стационарнику и проверить, тогда аппаратную проблему можно было бы точно исключить или подтвердить в зависимости от результата Насчет rdtsc может ты и прав, но если б эта ошибка была именно и только в ноутбучных процессорах, она была бы где нибудь описана. Ну если все от Sleep зависит, можно и в обратную сторону развернуть, чтобы на ноутах нормально работало? |
|
Создано: 16 января 2010 23:50 · Поправил: Adminka · Личное сообщение · #22 ToBad пишет: по адресу 401563 делаем секундную паузу sleep, затем ещё раз функу с rdtsc. Таким образом автор вычисляет на сколько изменился TSC (Time Stamp Counter) за секунду. Так или иначе проблема тут. У кого ещё остались сомнения - поменяйте интервал sleep в большую и меньшую сторону. У меня на ноуте код этой функции (начинается по 401544) вообще не выполняется (ни при запуске, ни при нажатии кнопки), если только это прога не обламывает брейкпоинты, но она же их не обламывает. А ProgressBar, как у Nabu, мгновенно доходит до конца. На стационарном всё как положено, минуту, а на ноуте вот так, даже не за 15-20 сек, а вообще меньше чем за секунду. |
|
Создано: 17 января 2010 00:49 · Личное сообщение · #23 |
|
Создано: 17 января 2010 01:03 · Поправил: Adminka · Личное сообщение · #24 |
|
Создано: 17 января 2010 01:40 · Личное сообщение · #25 |
|
Создано: 17 января 2010 01:46 · Поправил: ToBad · Личное сообщение · #26 Adminka пишет: но ToBad сказал, что ещё перед открытием порта проверяется быстродействие машины Я мог обмануть... Первый вызов идёт после конфигурирования порта, установление таймаутов и т.д. Если порта нет, то конечно туда не попадает. Но как я понимаю топикстартер и все остальные кто озабочен работой программы догадались проверять на ноутах с портом... ))) SVLab пишет: А не может ли быть проблема в том, что во время Sleep ноутбучный проц переводится в режим с пониженной тактовой частотой? Вроде как вики грозится что нет: В современных процессорах Intel, счетчик TSC не зависит от использования технологий энергосбережения и увеличивается на 1 каждый такт, вне зависимости от того, работал ли процессор или находился в состоянии сна. В некоторых реализациях счетчики TSC могут иметь синхронные значения на многоядерной системе. |
|
Создано: 17 января 2010 02:18 · Личное сообщение · #27 |
|
Создано: 17 января 2010 03:38 · Личное сообщение · #28 Полез все-таки в гугль. Здесь говорится об ошибке rdtsc, возникающей при переходе ноута в режим пониженного энергопотребления при выполнении sleep coding.derkeiler.com/Archive/Assembler/comp.lang.asm.x86/2004-11/0004.html А вот официальная дока с багами Pentium M (в том числе rdtsc) download.intel.com/support/processors/mobile/pm/sb/25266532.pdf. Есть такая же для Celeron M, а как с ноутбучными двухядерными, х.з. Проскакивала инфа и о баге с rdtsc на некоторых двухядерных AMD |
|
Создано: 17 января 2010 03:55 · Поправил: ToBad · Личное сообщение · #29 Не очень впечатляющая перспектива: There was an ACPI daemon that put the CPU into a low power mode during the sleep( ) fcn. To test this, I recompiled the kernel without ACPI support. А в биосе поддержку ACPI нельзя отключить? В общем нужно гуглить: rdtsc fix |
|
Создано: 17 января 2010 04:20 · Личное сообщение · #30 |
. 1 . 2 . >> |
eXeL@B —› Крэки, обсуждения —› Помогите пофиксить чужой баг (Borland C++) |