我试图使一个Python程序接口与不同的崩溃进程(这是我的手)。不幸的是,我正在使用的程序甚至不会可靠地崩溃!所以我想做一个快速的c++程序,它会故意崩溃,但我不知道最好和最短的方法来做到这一点,有人知道在我的
int main() {
crashyCodeGoesHere();
}
使我的c++程序可靠地崩溃
我试图使一个Python程序接口与不同的崩溃进程(这是我的手)。不幸的是,我正在使用的程序甚至不会可靠地崩溃!所以我想做一个快速的c++程序,它会故意崩溃,但我不知道最好和最短的方法来做到这一点,有人知道在我的
int main() {
crashyCodeGoesHere();
}
使我的c++程序可靠地崩溃
当前回答
*((unsigned int*)0) = 0xDEAD;
其他回答
在GCC或clang中使用__builtin_trap(),在MSVC中使用__debugbreak()。不处理这些断点/陷阱将导致未处理的断点异常/崩溃。 使用abort()或exit()的其他建议:这些可能由其他线程处理,使得更难看到传播崩溃的线程的堆栈。
#include <thread>
void intentionalCrash()
{
auto noop = [](){return;};
// Thread t1 is in a joinable state.
// When program returns t1 will be out of scope.
// Destructing a joinable thread creates a crash.
std::thread t1(noop);
}
int main()
{
intentionalCrash();
return 0;
}
*( ( char* ) NULL ) = 0;
这将产生一个分割错误。
int i = 1 / 0;
您的编译器可能会警告您这一点,但在GCC 4.4.3下它编译得很好 这可能会导致SIGFPE(浮点异常),这在实际应用程序中可能不像SIGSEGV(内存分段违反)那样可能导致其他答案,但它仍然是崩溃。在我看来,这样可读性更强。
另一种方法,如果我们要欺骗和使用signal.h,是:
#include <signal.h>
int main() {
raise(SIGKILL);
}
这保证杀死子进程,与SIGSEGV形成对比。
这是上面回答中给出的一个更有保证的abort版本。它负责处理sigabrt被阻塞时的情况。实际上,您可以使用任何信号来代替具有使程序崩溃的默认操作的abort。
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
sigset_t act;
sigemptyset(&act);
sigfillset(&act);
sigprocmask(SIG_UNBLOCK,&act,NULL);
abort();
}