Что можно сделать, когда консольное приложение C ++ создает и запускает, но не запускает какой-либо код, по крайней мере, не тот, который видит отладчик? У меня есть программа с основной функцией:
int main (int argc, char *argv[])
Я ставлю точку останова на первой строке ( retval=0 ) и строка после него, чтобы быть в безопасности, и запустить. Он показывает окно консоли и зависает до тех пор, пока я не остановлю отладчик. Выходные данные отладки показывают количество загружаемых DLL, но не более того. Он заканчивается строкой, которая выглядит очень похожей на десятки:
‘fcmtsysmd.exe’ (Win32): Loaded ‘C:WindowsSysWOW64RpcRtRemote.dll’. Cannot find or open the PDB file.
Я знаю, что эта программа работает и функционирует в «нормальной» среде, потому что ее используют сотни людей, а я не изменил код. В моей среде разные вещи (потому что я переписываю наш процесс установки):
- У меня могут быть не все зависимости установлены правильно.
- Одна из зависимостей DLL, которая ранее вызывала ошибку, была заменена новой версией с изолированной ссылкой COM вместо обычной ссылки COM, потому что объект COM, к которому он пытался получить доступ, не зарегистрирован. (Я пытаюсь реализовать изолированный COM в нашей новой установке.)
Поэтому мой вопрос: если перед первой строкой кода возникает ошибка, как я могу отследить источник проблемы?
PRO100 и Cutting. Что если не работают на новых Windows?
Я не могу получить разумный стек вызовов, потому что даже если я сделаю один шаг (клавиша F10), чтобы запустить программу, она сразу же зависнет. Если я сломаюсь в этой точке, я вижу следующий стек вызовов:
ntdll.dll!7743fdd1() Unknown [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] ntdll.dll!7743fdd1() Unknown ntdll.dll!77475f86() Unknown ntdll.dll!77459809() Unknown
Когда я удаляю изолированные параметры COM из зависимой DLL, я могу получить исключение нарушения прав доступа и остановиться на некотором коде в отладчике. Он останавливается на функции, вызываемой во время инициализации статической переменной в другой DLL. Странно то, что когда я добавляю изолированные параметры COM в первую DLL и ставлю точку останова на другую DLL, точка останова даже не срабатывает.
Решение
Оказывается, что приложение зависало во время вызова CoCreateInstance, вызванного некоторой статической логикой инициализации в одной из зависимых библиотек DLL. Я предполагаю, что хитрость заключается в том, чтобы попытаться идентифицировать статическую логику инициализации в зависимых DLL и поставить там точки останова. К сожалению, нет никаких отладочных выводов, которые помогли бы определить, какая статическая инициализация DLL выполняется когда, поэтому невозможно определить, какая DLL является проблемой.
Я спрошу о том, как определить источник зависшего вызова CoCreateInstance, в отдельном вопросе, если вопрос о нем еще не решен: Приложение зависло во время CoCreateInstance при использовании изолированного COM
Окончательный ответ оказался в https://stackoverflow.com/a/34076433/78162 (который я должен был создать сам).
Почему программа pro100 не запускается
Другие решения
Других решений пока нет …
Источник: web-answers.ru
Почему не запускаются консольные приложения.
На ноуте установлен GCC 4.8.1 (minGW), на персональном — GCC 5.0.1 (minGW-w64). И на том и на другом стоит Windows 7 Ultimate x64, установленная с одного диска. Скомпилировал консольное приложение на ноуте, оно не запустилось на персональном, а скомпилированное на персональном не запускается на ноуте. В обоих случаях выдает системную ошибку, отсутствует файл libgcc_s_dw2-1.dll (на ПК) и libgcc_s_seh-1.dll (на ноуте).
В чем может быть проблема? И как обеспечить переносимость приложения, чтоб исправно юзалось на форточках начиная с XP SP2 и заканчивая 7-й, как минимум?
- Вопрос задан более трёх лет назад
- 743 просмотра
3 комментария
Оценить 3 комментария
Источник: qna.habr.com
Не запускается консольная программа
Сообщений: 39
Не запускается консольное приложение (C++)
Вроде нормально компилиться, но не запускает консоль. Подскажите пожалуйста, в чем может быть проблема.
#include #include void gener(int mas[], int n, int fr) < int yes = 0, *masy; for(int gen = 0; gen < n; gen++) < if(mas[gen] < 0) < yes++; if(yes == 1) < masy = >else if(yes > 1) < *masy = fr; >> > > int main(int argc, char * argv []) < const int N = 5, P = 21, Q = 34; int A[N], B[N]; for(int s = 0; s < N; s++) < printf(«A[%d]: «, s + 1); if(scanf_s(«%d», fprintf(stderr, «Error! Not number for writen»); return -1; >printf(«B[%d]: «, s + 1); if(scanf_s(«%d», fprintf(stderr, «Error!
Not number for writen»); return -1; >> printf(«—————————n»); for(int p = 0; p < N; p++) < printf(«A[%d]: %dtB[%d]: %dn», p + 1, A[p], p + 1, B[p]); >printf(«—————————n»); gener(A, N, P); gener(B, N, Q); for(int pp = 0; pp < N; pp++) < printf(«A[%d]: %dtB[%d]: %dn», pp + 1, A[pp], pp + 1, B[pp]); >getch(); return 0; >
1>—— Построение начато: проект: Zadacha2, Конфигурация: Debug Win32 —— 1>Сборка начата 11.05.2014 22:19:10. 1>InitializeBuildStatus: 1> Создание «DebugZadacha2.unsuccessfulbuild», так как было задано «AlwaysCreate».
1>FinalizeBuildStatus: 1> Файл «DebugZadacha2.unsuccessfulbuild» удаляется. 1> Обращение к «DebugZadacha2.lastbuildstate». 1> 1>Сборка успешно завершена. 1> 1>Затраченное время: 00:00:00.02 ========== Построение: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========
Источник: www.programmersforum.ru