Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запуск приложения из под среды и не из под среды
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Script. Интеграция WebKit
mezmay
Работаю онлайн с картами яндекса. Загружаю созданную мной html-страничку в QWebView.
Если запускать приложение из под среды Visual Studio 2008 то все работает правильно.
А если запускать экзешник (приложив к нему Qt-шные dll), то одна функция яндекс карт не включается, а именно "линейка".

Подключил яваскрипт-консоль. Пишу лог. При попытке включить "линейку" в лог пишется строка:

message: TypeError: Result of expression 'this.__objectLayer.add' [[object Object]] is not a function.
lineNumber: 11
sourceID: http://api-maps.yandex.ru/1.1.15/_YMaps.js

Чтобы проверить, нет ли у меня ошибок в коде, я перенес включение линейки в текст хтмл страницы,
и полученную страницу открываю в браузере fancybrowser из Qt-ных примеров. (еще и в опере открыл для надежности - работает)
С fancybrowser та же проблема - если запускать его из под среды, то линейка работает, а если запускать экзешник - то не работает.
В чем может быть проблема? Может какой-то dll не хватает, а программа не ругается?
(Например если забыть положить рядом с Qt-ным экзешником папку imageformats, то картинки отображаться не будут)
Вот список того что я приложил к экзешнику:

phonon4.dll
QtCore4.dll
QtGui4.dll
QtNetwork4.dll
QtWebKit4.dll
QtXmlPatterns4.dll

+ все папки из plugins

Qt 4.6.3
igor_bogomolov
забыл QtScript4.dll
возможно еще QtScriptTools4.dll
mezmay
Добавил, не работает...
P.S. Я туда все содержимое папки bin на всякий случай кинул)
igor_bogomolov
тогда не знаю в чем может быть проблема. Сделай минимальный компилируемый пример и выложи здесь, попробуем разобраться
mezmay
Можно компилировать стандартный пример fancybrowser.

Как я уже выяснил, если откомпилировать его в режиме дебаг и запускать экзешник, то все ок, и при открытии в нем приложенной хтмл-страницы линейка включена (при нажатии на карту появляются красные точки соединенные линиями).
если откомпилировать в режиме релиз - не работает. Вывод - дело в опциях компилятора. Вопрос - как все таки откомпилировать в режиме релиз?
Litkevich Yuriy
mezmay, запусти (!) свою программу в Dependency Wallker и посмотри, что программа пытается подгружать во время выполнения.
mezmay
Итак, что мы имеем. Правильная программа, без ошибок (я про fancybrowser) работает в режиме дебаг и неправильно работает в режиме релиз. (При этом в обоих режимах работает из под среды...). Экзешники, полученные в результате компиляции дебага и релиза отличаются, как я понимаю, зависимостями (отладочная информация не влияет на работу). А именно - релизный экзешник зависит от:
1. Релизных dll Visual Studio
2. Релизных dll Qt

Дебажный экзешник - соответственно от дебаг-версий этих dll.
Ломаю голову что это может означать... глючат релизные dll Qt?...

Цитата
mezmay, запусти (!) свою программу в Dependency Wallker и посмотри, что программа пытается подгружать во время выполнения.


а как анализировать эту информацию? ну получу я списки dll, и что с ними делать?

mezmay
dependency walker выдал в обоих случаях:
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module

и еще показал ошибку контрольной суммы у Qtcored4.dll и Qtcore4.dll для дебага и релиза соответственно
Litkevich Yuriy
Цитата(mezmay @ 2.11.2010, 0:05) *
in a delay-load dependent
стало быть это dll'ка не из каталога %QTDIR%/bin, т.к. они все загружаются при старте приложения. Отложенная загрузка - обычно проблема с плагинами.
посмотри на какой именно плагин ругается.

Цитата(mezmay @ 2.11.2010, 0:05) *
и еще показал ошибку контрольной суммы у Qtcored4.dll и Qtcore4.dll для дебага и релиза соответственно
такое я как-то видел, сути не понял и на работу моей программы не влияло.
mezmay
Цитата
стало быть это dll'ка не из каталога %QTDIR%/bin, т.к. они все загружаются при старте приложения. Отложенная загрузка - обычно проблема с плагинами.
посмотри на какой именно плагин ругается.

Ни на какой конкретный, просто варнинг и все
Litkevich Yuriy
Цитата(mezmay @ 2.11.2010, 1:04) *
Ни на какой конкретный
конкретные в дереве помечаются и в списке, обычно красным цветом. В окне сообщения только резюме пишется
igor_bogomolov
mezmay, у меня все работает. Проверял на Windows Vista Qt4.7.0
mezmay
Запустил релиз fancybrowser ИЗ ПОД Dependecy Walker'a.

РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

что теперь делать то? застрелиться?
почему экзешник то работать не хочет?
Что Dependecy Walker добавляет?
mezmay
Открыл справку Dependecy Walker'a. Там рассматривается случай когда приложение, запускаемое из под Dependecy Walker'a может работать лучше, чем запускаемое само по себе:

-----
Q: My application runs better when being profiled by Dependency Walker than when I run it by itself. Why is this?
A: I've had several reports of applications that normally crash, will not crash when being profiled under Dependency Walker. Dependency Walker acts as a debugger when you are profiling your application. This in itself, makes your program run differently.

First, there is the overhead of Dependency Walker that slows the execution of your application down. If your application is crashing due to some race condition, this slow down alone might be enough to avoid the race condition. If this is the case, it is a design issue of the application and you are just getting lucky when it doesn't crash.

Second, normally when threads block on critical sections, events, semaphores, mutexes, etc., they unblock on a first-in-first-out (FIFO) basis. This is not guaranteed by the OS, but is usually the case. When being run under a debugger, FIFO queues are sometimes randomized, so threads may block and resume in a different order than they would when not running under a debugger. This might be relieving a race condition or altering the execution enough to make things work. Again, the application is just getting lucky when it doesn't crash.

Finally, applications running under the debugger automatically get a system debug heap. All memory functions are handled slightly different. Allocations are padded with guard bytes to check to see if you are writing outside of a region you have allocated (buffer overrun/underrun). Allocations might also be laid out differently in memory then when not under the debugger. So, if you are writing past the end of a buffer under the debugger, you might be trashing guard bytes, freed memory, or just something not very critical. However, when not running under the debugger, you might be trashing something critical (like a pointer), and your app crashes.

For the debug heap, you can turn this off in Dependency Walker and see if your application crashes when being profiled. If it does then, then you probably suffer a buffer overrun, stray/bad/freed pointer, etc. To do this, start a command prompt. Type "SET _NO_DEBUG_HEAP=1". Then start Dependency Walker from that command line. This should disable the debug heap for that instance of Dependency Walker. Note, this only works on Windows XP and beyond.
-----

Отсюда я понял, что приложение в Dependecy Walker'e запускается в замедленном, отладочном режиме и с поддержкой system debug heap. Обработка всех функций памяти немного отличается. Вывод - ошибка в приложении, которая не проявляется в отладочном режиме и проявляется в боевом.
Еще там советуется отключить поддержку system debug heap, запустив Dependecy Walker из командной строки, установив параметр _NO_DEBUG_HEAP=1.
Запустил в таком режиме, и fancybrowser перестал корректно работать.

Что получается ? - глючит Qt?

Я использую Qt 4.6.3 под Windows XP. Переходить на 4.7.0 не вариант потому что 4.7.0 не работает с картами гугла, а мне это обязательно нужно
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.