Сбой программы при выходе из тестовой среды - C ++ - PullRequest
6 голосов
/ 10 июня 2011

У меня есть программа, которая фантастически запускается при запуске из Visual Studio 2010 Express, но при ее сборке и извлечении возникают проблемы. Я настроил внешнюю среду тестирования так же, как когда она запускается из Visual Studio, поэтому проблем не должно быть. Я хочу прикрепить его к .exe, чтобы увидеть, где происходит сбой, но у меня нет неэкспресс-версий.

Есть предложения? Почему происходит сбой программы вне среды VSC ++ 2010 Express, но она прекрасно работает внутри.

Я бы опубликовал код, но это огромный проект, а не строка, которая могла бы вызвать ошибку.

Большое спасибо за ваше время.

Ответы [ 5 ]

2 голосов
/ 10 июня 2011

Википедия на помощь ?

Время также может быть фактором в heisenbugs. Выполнение программы под управлением отладчика может изменить время выполнения программы по сравнению с обычным выполнением. Чувствительные ко времени ошибки, такие как состояние гонки, могут не воспроизводиться, когда программа замедляется одноступенчатыми исходными строками в отладчике. Это особенно верно, когда поведение включает взаимодействие с объектом, не находящимся под управлением отладчика, например, при отладке обработки сетевых пакетов между двумя компьютерами, и только один находится под контролем отладчика.

Также обратите внимание, что User32.dll немного меняет свое поведение в режиме отладчика, чтобы облегчить отладку для вас. Это ничего не должно изменить, хотя.

2 голосов
/ 10 июня 2011

Вы можете отладить это, используя свободно доступные Инструменты отладчика для Windows .Есть много документации и кратких руководств, особенно chm, включенных в установку.В вашем случае вы можете попробовать следующее:

  1. Убедитесь, что у вас есть PDB для вашего приложения, где-то на общем ресурсе.
  2. Присоедините к работающему экземпляру приложения: windbg -p <PID>.Обратите внимание, что вы также можете запустить программу в контексте отладчика, выполнив windbg -g foo.exe.
  3. Воспроизвести сбой.
  4. Измените путь к символам на свои символы, а сервер общедоступных символов Microsoft наполучите правильные символы для компонентов: .sympath x:\YourPathToPDBs; SRV*x:\symbols*http://msdl.microsoft.com/download/symbols
  5. Скажите отладчику перезагружать символы, используя ваш путь: .reload
  6. Получите стек вызовов, нажав k в отладчике.

Это скелет, который нужно выяснить, где он падает.Затем вы можете пойти глубже и попытаться точно проанализировать причину сбоя, посмотрев на отладчик chm или другие ресурсы в MSDN или блог Тесс .Одна полезная команда - dv, чтобы вывести локальные переменные для определенного кадра.Если в стеке вызовов не указаны номера строк, введите .lines, а затем нажмите k или kb.

.
2 голосов
/ 10 июня 2011

Очень трудно знать наверняка, не зная, что такое сбой, но есть пара общих проблем, которые могут вызвать это:

  • Переменные среды не совпадают.Возможно, вы полагаетесь на что-то в vcvars32.bat в своей тестовой среде.
  • Переменная окружения PATH не та, и вы получаете какую-то плохую или несовместимую DLL.
  • Ваш код каким-то образом зависит от текущего рабочего каталога, который был при запуске из Visual Studio.1010 *
0 голосов
/ 02 сентября 2013

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

Одним из важных отличий при запуске приложения в Visual Studio и его запуске вне приложения является текущий рабочий каталог («CWD»).

Типичная структура каталогов для решения / проекта Visual C ++ выглядит следующим образом:

Solution     <- the location of your solution file
  Debug      <- where the Debug executables end up
  Release    <- where the Release executables end up
  Project    <- the location of your project file
    Debug    <- where Debug intermediate files end up
    Release  <- where Release intermediate files end up

Когда вы запускаете приложение из Studio, либо с помощью «Начать отладку», либо «Запускать без отладки», CWD по умолчанию является каталогом проекта, поэтому в этом случае Solution\Project.

Однако, когда вы выполняете снаружи простым двойным щелчком по приложению, CWD является каталогом приложения (например, Solution\Debug).

Если вы пытаетесь открыть файл из текущего каталога (что происходит, когда вы делаете std::ifstream ifstr("myfile.txt")), успешность его выполнения зависит от того, где вы находились, когда запускали приложение.

0 голосов
/ 10 июня 2011

Вы можете окружить весь код в функции Main блоком try catch.Когда вы ловите исключение, запишите в файл журнала трассировку стека.

Затем запустите исполняемый файл и проверьте файл журнала, чтобы узнать, где происходит сбой вашей программы.

PS: не забудьте поместить файл * .pdb вместе с файлом exe, иначене сможет получить информацию о трассировке стека.

...