相关疑难解决方法(0)

在C中生成Segfault的最简单的标准符合方式是什么?

我认为问题就是这么说的.涵盖从C89到C11的大多数标准的示例将是有帮助的.我虽然这个,但我猜它只是未定义的行为:

#include <stdio.h>

int main( int argc, char* argv[] )
{
  const char *s = NULL;
  printf( "%c\n", s[0] );
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

正如一些投票要求澄清:我希望有一个程序通常有编程错误(我能想到的最简单的是段错误),这是保证(按标准)中止.这与最小的段错误问题有点不同,它不关心这种保险.

c iso segmentation-fault

58
推荐指数
6
解决办法
2万
查看次数

代码故意崩溃

可能重复:
使C++程序崩溃的最简单方法是什么?

我在代码库中经常看到一个构造,程序以某种方式进入无效状态,代码会故意做错,只是为了强制崩溃.它通常是这样的:

if(<something is wrong>)
{
    int *ptr = NULL;
    *ptr = 0;
}
Run Code Online (Sandbox Code Playgroud)

这当然会导致空引用异常并以不可恢复的方式崩溃程序.我只是想知道这是否真的是最好的方法呢?首先,它读得不好.如果没有评论,您可能没有意识到此处发生的崩溃是有意的.其次,几乎没有办法从中恢复.它不会抛出异常,因此其他代码无法处理它.它只会使程序死亡,无法回溯.它也没有提供很多线索,说明为什么它必须在这里崩溃.它会在所有版本中崩溃,不像断言.(我们确实有一个非常强大的断言系统,但在这种情况下并不总是这样.)

这是我们在整个地方使用的风格,我无法试图说服任何人.我只是好奇这个行业有多常见.

c++ crash assert coding-style

6
推荐指数
1
解决办法
8175
查看次数

MessageBox"异常程序终止"使我的应用程序保持运行

...的种类.正如这个极其简单的例子所示,

在此输入图像描述

很少(到目前为止只报告过一次),碰巧我的一个应用程序崩溃了.我想像通常那样在发生非特定异常时终止它.我的策略是(低级别)记录问题,然后终止.该应用程序是子系统的一部分,如果检测到任何问题,我想(重新)启动它.它是用C++ - Builder 6构建的,可以在Windows上运行(XP ... 7,也是8).我了解到abort()最有可能导致错误消息.该应用程序有一个GUI,这就是为什么显示一个消息框而不是只是一个(解除阻塞)输出stderr.

并且只要用户不接受消息框,我的应用程序就会明显运行,例如它处理定时器(上面示例中的生命周期增加)或进程间消息,完全没有意识到问题.

阅读了一些答案后,什么是使C++程序崩溃的最简单方法?raise(SIGABRT)和abort()方法之间的区别,我尝试了以下内容

void mySignalHandler(int sig)
{
    // low-level error reporting here
    exit(-1);
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    signal(SIGABRT, mySignalHandler);
    // some more initialisation here
}
Run Code Online (Sandbox Code Playgroud)

如果或被调用,我的应用程序也可以正常终止.(我也希望阻止Windows"寻找问题的解决方案".)abort()raise(SIGABRT)

从您的角度来看,这是(为abort注册信号处理程序并在那里调用exit)可靠吗?......或者至少可以建立一些东西?

c c++ windows abort c++builder-6

6
推荐指数
1
解决办法
2107
查看次数

轻松破解VB.NET程序的方法

我有一个与硬件交互的程序,但我需要测试程序崩溃/中止的时间或任何导致程序异常退出以查看软件崩溃时设置到硬件状态的情况.

在C++中,我看到一篇关于使用abort()调用的帖子(什么是使C++程序崩溃的最简单方法?),但我不确定VB的等价物是什么.我最接近的是调试时,按下Stop Debugging按钮,但我认为有一个更好的解决方案.

是否有任何特定的代码会导致此类事件发生,或者是否有类似的调用abort()会使其在心跳中发生?

vb.net crash abort

5
推荐指数
1
解决办法
1825
查看次数

什么是"*((char*) - 1)='x';" 代码意味着?

我在阅读redis源代码时遇到问题,有人能告诉我debug.c_redisAssert函数中最后一个语句的用法是什么:

*((char*)-1) = 'x';
Run Code Online (Sandbox Code Playgroud)

c undefined-behavior redis

4
推荐指数
1
解决办法
1130
查看次数

段错误的最小C/C++程序?

我正在尝试设置我的服务器处理核心转储的方式.为了测试它,我需要一个总是段错误的程序.

是否有一个简单的示例程序总是会出现段错误?

c c++ linux segmentation-fault

1
推荐指数
2
解决办法
1195
查看次数

int main = 0,已编译但崩溃

我有一个非常简单的程序,如下所示。

int main = 0;

此程序a.c与文件编译的罚款gcc-4.8gcc-5gcc-6gcc-7gcc-8和应用程序执行时坠毁。

a.cppg++-4.8和编译的文件相同的程序可以正常运行,g++-5并且应用程序在执行时崩溃。但是在更高版本的g ++中,它会给出编译时错误。

以下是我的问题。

  1. 为什么a.cpp使用g ++-4.8和5可以正常编译,而不能用更高版本编译?它是在旧版g ++中出错还是在c ++标准中有所改进?
  2. 如果编译成功,那么为什么应用程序崩溃?

下面是详细的编译器和编译/执行输出。

+ gcc-4.8 --version
gcc-4.8 (Ubuntu 4.8.5-4ubuntu8) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

+ gcc-4.8 c.c
+ ./a.out
Segmentation fault      (core dumped) …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc g++

-3
推荐指数
1
解决办法
153
查看次数