Visual Studio 2008 C++ Executable (отладка и выпуск) не работает

надеюсь, кто-то может помочь.

В настоящее время я пишу движок для 2D-игр на C++. Когда я запускаю приложение из Visual Studio 2008, используя либо отладку, либо выпуск, все идет нормально.

Когда я затем запускаю исполняемые файлы (либо отлаживаю, либо выпускаю) из проводника Windows, ни одна из них не работает, а просто отображает пустое окно.

Кто-нибудь знает, что вызывает это?

  1. Загрузить проект в VS 2008
  2. Измените конфигурацию на «Отладка»
  3. Нажмите кнопку «Начать отладку».
  4. Приложение компилируется и строится, все в порядке
  5. Приложение запускается, все в порядке
  6. Закрыть приложение
  7. Окно вывода в VS показывает: «Программа« [16672] Mouse Engine v2.exe: Native »завершилась с кодом 0 (0x0)».
  8. Откройте окно проводника Windows и найдите исполняемый файл в папке Debug в проекте.
  9. Запустить исполняемый файл, отображается пустое окно.
  10. Измените конфигурацию на "Release"
  11. Нажмите кнопку «Начать отладку».
  12. Приложение компилируется и строится, все в порядке
  13. Приложение запускается, все в порядке
  14. Закрыть приложение
  15. Окно вывода в VS показывает: «Программа« [18872] Mouse Engine v2.exe: Native »завершилась с кодом 0 (0x0)».
  16. Откройте окно проводника Windows и найдите исполняемый файл в папке Release в проекте.
  17. Запустить исполняемый файл, отображается пустое окно.

Пожалуйста, доработайте формулировку вашего вопроса. Как бы то ни было, это не имеет смысла. (Я предполагаю, что вы можете запускать свое приложение из VS, но вы не можете запускать его автономно (например, из проводника). Это может быть связано с разрешением зависимостей DLL, которые могут дать сбой в последнем случае. Однако это недостаточно ответственно без больше информации от вас.)

Scheff's Cat 12.11.2018 13:09

Как минимум, вам нужно будет показать несколько снимков экрана с проблемой. Мы не можем просто гадать о причинах на пустом месте! У вас есть история того, что изменилось? (Полагаю, вы используете какую-то систему контроля версий?) Вы пробовали откатиться к последней удачной конфигурации?

Rags 12.11.2018 13:09

Привет, спасибо за ответ. Да, приложение отлично работает в VS (как в отладочной, так и в выпускной версиях). Это когда я запускаю приложения отдельно от проводника.

Ken Allen 12.11.2018 13:16

@Rags No. Скриншоты. Всегда. Дословные сообщения об ошибках и трассировки стека как текст.

Passer By 12.11.2018 13:21

Основываясь на вашей информации, невозможно быть более конкретным, чем «это вызвано ошибкой в ​​вашем коде». Инициализируйте все свои переменные и убедитесь, что вы не делаете никаких предположений о рабочем каталоге.

molbdnilo 12.11.2018 13:24

Сейчас пытаюсь сделать скриншоты, но не знаю, чем это поможет. Скриншоты при запуске из VS показывают нормальную тестовую игру с плитками спрайтов и текстом. Снимок экрана с запуском исполняемого файла из проводника Windows будет просто отображать пустое окно?

Ken Allen 12.11.2018 13:25

@KenAllen Скриншоты не содержат никакой информации, так что не делайте их. Код - вот что важно. Сузьте его и сделайте минимальный воспроизводимый пример.

molbdnilo 12.11.2018 13:26

Спасибо "молбднило". Все классы инициализируют все локальные переменные в своих функциях конструктора и освобождают их (указатели) в функциях деконструктора.

Ken Allen 12.11.2018 13:29

@molbdnilo Это может быть сложно, учитывая масштаб программы. Насколько я могу судить, проблем нет, поскольку они отлично работают в VS как при отладке, так и при выпуске. Просто когда я пытаюсь запустить программы из их исполняемых файлов из проводника Windows, они просто показывают пустое окно (даже если они буквально только что работали из VS.

Ken Allen 12.11.2018 13:32

Будет ли это проблема с разрешениями Windows?

Ken Allen 12.11.2018 14:07

@PasserBy Я предположил, что публикация кода будет нежизнеспособной, так как будет слишком много для публикации - следовательно, что-то, что показало бы некоторый уровень информации о том, что происходило, было необходимо. Конечно, скриншоты не лучший вариант.

Rags 12.11.2018 14:11

Кто-нибудь действительно может ответить на это? Я так много работал над этим приложением, и меня действительно беспокоит то, что я не могу создать работоспособный исполняемый файл.

Ken Allen 12.11.2018 14:33

@KenAllen Может быть, попробуйте запустить DebugView docs.microsoft.com/en-us/sysinternals/downloads/debugview - возможно, он сможет захватить некоторые диагностические данные, которых вы не видите?

Rags 12.11.2018 14:42

@Rags Спасибо, я попробую.

Ken Allen 12.11.2018 14:54

Это может быть проблема Windows, так как у меня общие проблемы с зависанием рабочего стола. Я собираюсь сделать полную переустановку.

Ken Allen 12.11.2018 15:16

Если библиотеки DLL не загружаются, вы обычно получаете диалоговое окно с сообщением об ошибке (выяснить, какая именно DLL была проблемой, может быть непросто, но это не просто дает вам черный экран). Можете ли вы определить, потребляет ли приложение процессорное время, несмотря на черный экран? (т.е. он работает, но рисует некорректно)

Rags 12.11.2018 16:10

ищите "обходчик зависимостей", скорее всего, какая-то DLL, которая вам нужна, не находится в каталоге, где находится ваш .exe, но в основном это может быть много других вещей.

AndersK 12.11.2018 17:27

Временное добавление __debugbreak (); в main () - хороший способ отладить приложение, когда оно запускается таким образом. Сверяясь с моим хрустальным шаром, он говорит, что вы забыли скопировать файлы ресурсов в каталог сборки и не кричите достаточно громко, когда не можете их найти / открыть. Работает случайно в среде IDE, поскольку делает каталог по умолчанию таким же, как каталог проекта.

Hans Passant 12.11.2018 17:49

& Rags Ага, я проверил, и он выйдет, когда я нажму Esc (как я это запрограммировал). Думаю, дело не в моих текстурах.

Ken Allen 12.11.2018 18:23

@Hans Passant, что вы говорите, звучит интересно, хотя я воссоздал свои файловые структуры с текстурами в папках Debug и Release, и все равно не повезло :(

Ken Allen 12.11.2018 18:25

Хорошо, после некоторого глубокого изучения этого вопроса, мне удалось решить проблему. Все мои классы инициализируют свои собственные переменные, но я обнаружил, что инкапсулировал некоторый старый код в новый код. То есть у меня было тестирование старого кода для результата, вложенного в тестирование нового кода для того же результата с использованием разных переменных. Переменные старого кода не инициализировались. Угадайте, какая часть этого кода окружала, да, текстуры загрузки. Я собираюсь написать полный ответ на это завтра, чтобы любой, у кого возникла такая же проблема, мог получить полный список вещей для проверки. Спасибо всем за помощь.

Ken Allen 13.11.2018 19:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
21
126
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Некоторые вещи, на которые следует обратить внимание, отсутствуют зависимости, такие как файлы конфигурации и файлы данных, которые ваша программа не может найти.

Вы также можете попробовать Dependency Walker, чтобы убедиться, что все ваши DLL доступны. http://www.dependencywalker.com

Ответ принят как подходящий

Чтобы решить эту проблему, необходимо проверить несколько вещей.

  1. Убедитесь, что все переменные инициализированы. Кажется очевидным, но это может иметь решающее значение. Я нашел, что лучший способ решить эту проблему - использовать #DEFINE _LOG при запуске и выводить значения переменных в файл журнала в каждой функции, используя #IFDEF _LOG. Таким образом вы можете включить или выключить его.
  2. Если ваше приложение представляет собой просто пустое окно, проверьте, работает ли оно (используя процессорное время). Это хороший признак того, что что-то мешает ему найти файлы изображений или шрифтов.
  3. Убедитесь, что структура папок Debug или Release соответствует структуре папок вашего проекта, чтобы ссылки на файлы и текстуры работали.
  4. Убедитесь, что в настройках проекта для записи библиотеки времени выполнения установлено значение «Многопоточность» (/ MT). Это должно сделать ваше приложение менее зависимым от дополнительных dll.
  5. Проверьте, нет ли проблем в вашем коде. См. Пункт 1 с использованием файлов журнала, чтобы помочь в этом.

Другие вопросы по теме