2013-07-02 2 views
0

Я скомпилировал программу, использующую freeglut, optix, cuda и другие библиотеки (некоторые из них динамически загружены). Он компилируется и запускается без проблем в Visual Studio, но он сбой, если я выполняю его за пределами Visual Studio. Обе версии выпуска и отладки работают в VS, они оба сбой без какой-либо информации в Windows 8, если я попытаюсь выполнить их напрямую.64-разрядный exe сбой за пределами визуальной студии, но работающий внутри визуальной студии

У меня уже есть все необходимые библиотеки DLL, которые не работают.

В чем может быть проблема?

+2

Возможно, вы могли бы сравнить среду, с которой визуальная студия сталкивается со средой по умолчанию? (путь, зависимый ходок - кажется, ВСЕГДА имеет место для меня). – Huy

+0

Черт возьми, ты был прав .. там пропал путь .. сделай это ответом, и я приму это. –

+0

Попробуйте проверить свой код с помощью набора правил Viva64: http://www.viva64.com/en/viva64-tool/ –

ответ

2

Вы можете попробовать сравнить среду между визуальной студией и средой по умолчанию.

Dependency walker должен быть идентифицирован любой недостающий DLL.

+0

Это, скорее всего, не поможет, если его отладочная сборка существенно отличается. Скорее всего, его компилятор создал значительно другой код, или его отладочная куча (всегда включенная в VS) защищает его. –

+0

Хм, ты читал его сообщения? См. Его комментарии. – Huy

+0

Возможно, это и решило его проблему, но это не было бы первым, что я попробовал бы, и это не основное различие между средами. –

3

Большинство таких наблюдений обычно происходят из неопределенного поведения - с использованием неинициализированной переменной, оборванных указателей/рефлексов, буфер переполнения.

Вы можете попытаться использовать Application Verifier, с некоторой удачей он может переупорядочить используемую память, чтобы вы могли вызвать проблему при отладке, чтобы помочь ее углу.

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

2

Загрузить WinDBG, затем Файл> Открыть исполняемый файл и запустить программу под WinDBG. Когда он выйдет из строя, вы получите дополнительную информацию. My answer here описывает проблему в .net, но эта концепция применима и к родному C++.

1

Visual studio запускает исполняемые файлы в режиме «отладки», что означает отладчик.

Что это значит? Если вы проверите реализацию msvcrt, если среда выполнения обнаруживает отладчик (IsDebuggerPresent), то по-разному выполняет заготовку.

Что это значит? Это означает, что размеры буфера «подталкиваются» вверх, это означает, что выделение памяти по умолчанию очищено (нет необходимости в memset) и т. Д.

Это может привести к появлению множества ошибок, которые могут быть скрыты, или некоторые более тонкие ошибки, которые должны быть скрыты ,

Смежные вопросы