我正在测试我公司编写的应用程序。其中一个场景是查看该应用程序崩溃时系统状态会发生什么。那里有一个应用程序可以强制崩溃我的应用程序吗?我宁愿不在代码本身写崩溃(即空指针取消引用)。使用任务管理器终止进程不会产生相同的结果。
答案 0 :(得分:9)
假设有Windows,请参阅Application Verifier。
它可以进行故障注入(低资源模拟),使各种API调用以可配置的速率失败。例如。堆分配,虚拟分配,WaitForXxx,注册表API,文件系统API等。
您甚至可以在启动期间未指定任何故障时指定宽限期(以毫秒为单位)。
答案 1 :(得分:5)
在Windows上,您可以将WinDbg附加到进程,损坏某些寄存器或内存并分离。例如,您可以将某些活动应用程序线程的指令指针设置为0。
windbg -pn notepad.exe
在连接之后,当前线程被设置为调试线程,因此您需要更改为应用程序线程以使其与RIP寄存器更新崩溃
0:008> ~0s
0:000> rrip=0
0:000> qd
答案 2 :(得分:2)
最好的方法是从 windows.h
调用 RaiseException APIRaiseException(0x0000DEAD,0,0,0);
或者您可以从 ntoskrnl.exe 执行运行时链接到 KeBugCheckEx ()并在您的代码中调用它。
示例:
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
HINSTANCE h = LoadLibrary("ntoskrnl.exe");
cout<<h<<endl;
void* a;
a = (void*) GetProcAddress(h,"KeBugCheckEx");
int(*KeBugCheckEx)(ULONG,ULONG_PTR,ULONG_PTR,ULONG_PTR,ULONG_PTR);
KeBugCheckEx = (int(*)(ULONG,ULONG_PTR,ULONG_PTR,ULONG_PTR,ULONG_PTR))a;
cout << a;
KeBugCheckEx(0,0,0,0,0); //crash in module ntoskrnl.exe means that call success!
}
答案 3 :(得分:1)
您还没有说明您正在运行哪个操作系统,但如果它是Linux(或其他类UNIX系统),您只需kill -9
您的进程。这个信号无法被捕获,并且会很快地从你的过程中拉出地毯。
如果你不是类UNIX系统,我不能帮助你,抱歉,你可能会找到一些有用的信息here(寻找“taskkill”)。
答案 4 :(得分:1)
您可以覆盖全局新运算符。然后,您可以使用计数器并在特定值处执行空指针取消引用以强制应用程序崩溃。只需更改何时执行取消引用,您就可以轻松改变崩溃的时间。
答案 5 :(得分:1)
您可以使用winapiexec
工具:
winapiexec64.exe CreateRemoteThread ( OpenProcess 0x1F0FFF 0 1234 ) 0 0 0xDEAD 0 0 0
用进程ID替换1234
并运行命令,该进程将崩溃。
答案 6 :(得分:0)
这个“系统状态”在哪里定义?如果这是unix,你可以向进程发送一个信号9 ......
如果你真的需要,你可以与另一个进程(或线程)共享所有应用程序内存,并让该线程随机写入一些不幸的内存位置的随机数据 - 我认为NASA为他们的一些太空项目做了这个,但是我真的无法提供参考。
真正的问题是你为什么要这样做 - 你/你真正/测试什么?
例如,如果这是一些控制某些规定药物的医疗服务的程序......请对服务进行单元测试,分析API,并寻找缺陷。
答案 7 :(得分:0)
自己制作一个缓冲区溢出。
#include <string.h>
void doSomething(char *Overflow)
{
char Buffer[1];
strcpy(Buffer, Overflow);
}
int main()
{
doSomething("Muhaha");
}
你的程序会崩溃
答案 8 :(得分:0)
如果系统在UNIX / Linux上运行,你可以向它发送一个信号:SIGQUIT应该产生一个核心转储,你也可以发送它SIGSEGV如果你想测试它得到一个“分段错误”。那些分别是信号3和11。
如果系统是Windows,我不知道在不同的应用程序中引发信号的方法,但如果您可以修改应用程序来处理将调用raise()的特定Windows消息号,您可以模拟它。 raise()导致信号被提升,而不必实际编写执行非法操作的代码。然后,您可以将消息发布到应用程序,该应用程序将具有引发此信号的处理程序。
答案 9 :(得分:0)
另一种方法是在一个好的调试器中运行应用程序,将断点设置为特定的代码行,并且中提琴,您的应用程序已经“崩溃”。现在,这可能不会导致所有线程停止运行,具体取决于所使用的调试器。或者,您可以在调试器中运行应用程序,并在一段时间后“停止”应用程序。
这不会导致内核崩溃应用程序(并可能转储核心)崩溃,但它可能会做你想做的事情。
答案 10 :(得分:-1)
从您的代码中调用abort()
函数。其他程序无法可靠地“崩溃”您的程序 - 它们有自己的进程上下文,它与程序的上下文隔离开来。您可以在Windows API或其他特定于平台的函数中使用类似TerminateProcess()
的内容,但这与使用任务管理器大致相同。