Win32:如何崩溃?

Win32: How to crash?

提问人:Ian Boyd 提问时间:4/28/2010 最后编辑:Ian Boyd 更新时间:1/18/2011 访问量:1206

问:

我试图弄清楚 Windows 错误报告的保存位置;我今天早些时候点击了“发送”,但我忘记了我想“查看详细信息”,以便我可以检查内存小型转储。

但是我找不到它们的存储位置(谷歌也不知道)。

所以我想编写一个会崩溃的虚拟应用程序,显示 WER 对话框,让我单击“查看详细信息”,这样我就可以进入保存转储的文件夹。

如何在 Windows 上崩溃?

编辑:我问的原因是因为我已经尝试过溢出堆栈,以及浮点除以零。Stack Overflow 使应用程序消失,但没有弹出 WER 对话框。浮点除以零会得到 +INF,但没有异常,也没有崩溃。

WinAPI Windows-XP Windows错误报告

评论

0赞 4/28/2010
我免费得到了其中一个带有窗户的
0赞 Ian Boyd 4/28/2010
@M28:您应该联系崩溃的应用程序的开发人员。就我而言,它是通过 ASP 脚本主机加载到 IIS6 工作空间中的进程内 COM 对象。
0赞 4/28/2010
它被称为 windows,我在哪里可以找到它的开发者?:乙
2赞 Javier 5/4/2010
没有冒犯,但你没有幽默感。
1赞 AndersK 11/21/2011
也许您可以从 BF3 开发人员那里获得一些如何使 Windows 崩溃的提示

答:

1赞 Billy ONeal 4/28/2010 #1

您假设内存转储仍然存在。发送转储后,AFAIK 将从计算机中删除转储。

转储本身应位于 %TEMP% 的某个位置。

至于崩溃,这并不难,只是做一些导致段错误的事情。

评论

0赞 Ian Boyd 4/28/2010
这已经够难了,我的前两次尝试都做不到。KevinK的想法,引用地址0x00000000奏效了。
0赞 Ian Boyd 4/28/2010
而且您似乎是对的,XP 上的内存转储一旦发送就会消失。Vista 将它们作为问题报告和解决方案中心的一部分保存。
3赞 KevenK 4/28/2010 #2

应该是一个好的开始:

int main(int argc, char* argv[])
{
   char *pointer = NULL;
   printf("crash please %s", *pointer);
   return 0;
}

评论

0赞 Billy ONeal 4/28/2010
可能希望将指针设置为 NULL 以外的其他内容,因为它可能是 printf 检查的。0xDEADBEEF也许?
0赞 Ian Boyd 4/28/2010
我使用了你的想法,我将 null 转换为一个对象,然后开始调用方法。繁荣
0赞 KevenK 4/28/2010
@Billy ONeal:这真的不是崩溃,而是试图取消引用空指针。 只是为了可爱,本来也一样好用。printfprintfchar *pointer = NULL; char crash = *pointer;
0赞 Billy ONeal 4/28/2010
啊,是的。我错过了那个小小的*字符:)
0赞 David 4/28/2010 #3

不确定这是否会触发“错误报告”对话框,但您可以尝试除以零。

评论

0赞 Billy ONeal 4/28/2010
这只会引发一个例外。它不会在 Win32 上崩溃。(请注意,我不是说C++异常,我指的是Win32 SEH)
1赞 Steve Hanov 5/4/2010 #4
void crash(void)
{
    char* a = 0;
    *a = 0;
}
6赞 Will Dean 7/15/2010 #5

你们都太啰嗦了!:-)

下面是一个紧凑的方法:

*((int*)0)=0;
0赞 GWLlosa 1/18/2011 #6

官方支持的故意触发崩溃的方法可以在这里找到:

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 键,然后按 滚动 LOCK 键两次。

无需编程;)这里没有轮子的重新发明:)

评论

0赞 Ian Boyd 1/18/2011
此方法如何知道我正在调试的进程是我的?(反问;你的答案是触发内核模式异常和蓝屏;我想触发用户模式进程的默认崩溃处理 - 我的进程)
0赞 GWLlosa 1/18/2011
我的错。我以为您正在尝试触发一般崩溃以查看转储文件,而不是特定的进程崩溃。
0赞 mupan 1/18/2011 #7

有趣的是知道如何使 Windows 崩溃。但为什么不看看

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

第一?我还发现了特定于应用程序的 crashdata 文件夹,例如

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

...\OpenOfficePortable\Data\settings\user\crashdata\.

评论

0赞 Ian Boyd 1/18/2011
为什么?为什么不看看那里?因为我不知道该路径 - 并且该文件夹在我的计算机上不存在。