Win32: Как вылететь?

я пытаюсь выяснить, где сохраняются отчеты об ошибках Windows; сегодня я нажал Отправить, но забыл, что хочу "просмотреть подробности", чтобы изучить минидампы памяти.

Но я не могу найти, где они хранятся (и гугл не знает).

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

Как я могу вылететь в Windows?

Редактировать: Причина, по которой я спрашиваю, заключается в том, что я пытался переполнить стек и выполнить деление с плавающей запятой на ноль. Переполнение стека приводит к тому, что приложение исчезает, но диалоговое окно WER не появляется. Деление с плавающей запятой на ноль приводит к +INF, но без исключения и без сбоя.


person Ian Boyd    schedule 28.04.2010    source источник
comment
Я получил один из них с окнами, БЕСПЛАТНО   -  person    schedule 28.04.2010
comment
@ M28: Вам следует связаться с разработчиком приложения, которое дает сбой. В моем случае это наш внутрипроцессный COM-объект, загруженный в рабочее пространство IIS6 через узел сценариев ASP.   -  person Ian Boyd    schedule 28.04.2010
comment
Это называется Windows, где мне найти его разработчика? :Б   -  person    schedule 28.04.2010
comment
@ М28. мне было бы очень интересно узнать, где у вас происходит сбой в самой Windows. Даже сбои в Windows Explorer или Internet Explorer вызваны сторонними расширениями. Windows — самая проверенная часть программного обеспечения. Вероятность того, что вы нашли ошибку в самой Windows, очень мала.   -  person Ian Boyd    schedule 28.04.2010
comment
Без обид, но у тебя нет чувства юмора.   -  person Javier    schedule 04.05.2010
comment
возможно, вы можете получить несколько советов, как разбить Windows от разработчиков BF3.   -  person AndersK    schedule 21.11.2011


Ответы (6)


Должно быть хорошее начало:

int main(int argc, char* argv[])
{
   char *pointer = NULL;
   printf("crash please %s", *pointer);
   return 0;
}
person KevenK    schedule 28.04.2010
comment
Возможно, вы захотите установить указатель на что-то, отличное от NULL, так как это, вероятно, проверяется printf. 0xDEADBEEF возможно? - person Billy ONeal; 28.04.2010
comment
я воспользовался вашей идеей, я присвоил объекту значение null, а затем начал вызывать методы. бум - person Ian Boyd; 28.04.2010
comment
@Billy ONeal: на самом деле происходит сбой не printf, а попытки разыменовать нулевой указатель. printf нужно было просто быть милым, char *pointer = NULL; char crash = *pointer; тоже сработало бы. - person KevenK; 28.04.2010
comment
О да. Я пропустил этот маленький символ * :) - person Billy ONeal; 28.04.2010

Вы все такие многословные! :-)

Вот компактный способ сделать это:

*((int*)0)=0;
person Will Dean    schedule 15.07.2010

Вы предполагаете, что дампы памяти все еще существуют. Как только они отправляются, насколько я знаю, дампы удаляются с машины.

Сами дампы должны находиться где-то в %TEMP%.

Что касается сбоя, это не сложно, просто сделайте что-нибудь, что вызовет segfault.

person Billy ONeal    schedule 28.04.2010
comment
Это настолько сложно, что мои первые две попытки не смогли этого сделать. Идея KevinK, ссылаясь на адрес 0x00000000, сработала. - person Ian Boyd; 28.04.2010
comment
И похоже вы правы, дампы памяти, на ХР, пропадают после отправки. Vista хранит их как часть Центра отчетов и решений о проблемах. - person Ian Boyd; 28.04.2010

Не уверен, что это вызовет диалоговое окно «Отчет об ошибках», но вы можете попробовать разделить на ноль.

person David    schedule 28.04.2010
comment
Это просто вызывает исключение. На Win32 не вылетает. (Обратите внимание, что я не имею в виду исключения C++, я имею в виду Win32 SEH) - person Billy ONeal; 28.04.2010

Официально поддерживаемые способы преднамеренного запуска сбоя можно найти здесь:

http://msdn.microsoft.com/en-us/library/ff545484(v=VS.85).aspx

В принципе:

Для USB-клавиатур необходимо включить в реестре сбой, вызванный клавиатурой. В разделе реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\kbdhid\Parameters создайте значение с именем CrashOnCtrlScroll и установите его равным значению REG_DWORD 0x01.

Потом:

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

После того, как это будет завершено, сбой клавиатуры может быть инициирован с помощью следующей последовательности горячих клавиш: Удерживая нажатой крайнюю правую клавишу CTRL, дважды нажмите клавишу SCROLL LOCK.

Программирование не требуется ;) Здесь не нужно изобретать колесо :)

person GWLlosa    schedule 17.01.2011
comment
Как этот метод узнает, какой процесс является моим, который я отлаживаю? (Риторический вопрос; ваш ответ — запустить исключение режима ядра и синий экран; я хочу запустить обработку сбоев по умолчанию для процесса пользовательского режима — мой процесс) - person Ian Boyd; 18.01.2011
comment
Виноват. Я думал, вы пытаетесь вызвать общий сбой, чтобы просмотреть файлы дампа, а не сбой конкретного процесса. - person GWLlosa; 18.01.2011

Интересно узнать, как сломать Windows. Но почему бы не взглянуть на

%allusersprofile%\Application Data\Microsoft\Dr Watson\ 

первый? Также обратите внимание на папки с данными о сбоях для конкретных приложений, я нашел, например.

...\FirefoxPortable\Data\profile\minidumps\ 

а также

...\OpenOfficePortable\Data\settings\user\crashdata\.
person mupan    schedule 17.01.2011
comment
Почему? Почему бы не посмотреть туда? Потому что я не знаю об этом пути, и этой папки не существует на моей машине. - person Ian Boyd; 18.01.2011