我试图使一个Python程序接口与不同的崩溃进程(这是我的手)。不幸的是,我正在使用的程序甚至不会可靠地崩溃!所以我想做一个快速的c++程序,它会故意崩溃,但我不知道最好和最短的方法来做到这一点,有人知道在我的

int main() {
    crashyCodeGoesHere();
}

使我的c++程序可靠地崩溃


当前回答

这是上面回答中给出的一个更有保证的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();
}

其他回答

你可以在c++代码中使用汇编,但是INT 3只适用于x86系统,其他系统可能有其他的陷阱/断点指令。

int main()
{
    __asm int 3;

    return 0;
}

INT 3导致中断并调用由OS设置的中断向量。

int i = 1 / 0;

您的编译器可能会警告您这一点,但在GCC 4.4.3下它编译得很好 这可能会导致SIGFPE(浮点异常),这在实际应用程序中可能不像SIGSEGV(内存分段违反)那样可能导致其他答案,但它仍然是崩溃。在我看来,这样可读性更强。

另一种方法,如果我们要欺骗和使用signal.h,是:

#include <signal.h>
int main() {
    raise(SIGKILL);
}

这保证杀死子进程,与SIGSEGV形成对比。

int* p=0;
*p=0;

这也应该崩溃。在Windows上,它与AccessViolation一起崩溃,我猜它应该在所有操作系统上都是一样的。

我唯一的闪光是abort()函数:

它以异常的程序终止终止进程。它生成SIGABRT信号,默认情况下,该信号导致程序终止,并向主机环境返回一个不成功的终止错误代码。程序终止时不执行自动或静态存储持续时间对象的析构函数,也不调用任何atexit(在程序终止前由exit()调用)函数。它从不返回调用者。

写入只读内存会导致分割错误,除非你的系统不支持只读内存块。

int main() {
    (int&)main = 0;
}

我在Windows 7上用MingGW 5.3.0测试了它,在Linux Mint上用GCC测试了它。我认为其他编译器和系统也会有类似的效果。