相关疑难解决方法(0)

为什么我不能忽略SIGSEGV信号?

这是我的代码,

#include<signal.h>
#include<stdio.h>

int main(int argc,char ** argv)
   {
     char *p=NULL;
     signal(SIGSEGV,SIG_IGN); //Ignoring the Signal
     printf("%d",*p);
     printf("Stack Overflow"); //This has to be printed. Right?
   return 0;
    }
Run Code Online (Sandbox Code Playgroud)

在执行代码时,我遇到了分段错误.我使用SIG_IGN忽略了信号.所以我不应该得到分段错误.对?然后,printf()打印'*p'值后的语句也必须执行.对?

c unix signals

17
推荐指数
3
解决办法
1万
查看次数

从分段故障中恢复的最佳实践

我正在研究用C++编写的多线程进程,我正在考虑使用google-coredumper修改SIGSEGV处理,以便在发生分段错误时保持进程活跃.

然而,使用google-coredumper似乎已经成熟,有机会陷入无限循环的核心转储,除非我以某种方式重新初始化线程和可能导致核心转储的对象.

在尝试通过核心转储使进程保持活动时,我应该记住哪些最佳实践?我应该注意哪些"陷阱"?

谢谢!

c c++ segmentation-fault

10
推荐指数
4
解决办法
5275
查看次数

为什么在AMD64上对mmap内存的未对齐访问有时会出现段错误?

我有这段代码在AMD64兼容CPU上运行Ubuntu 14.04时会出现段错误:

#include <inttypes.h>
#include <stdlib.h>

#include <sys/mman.h>

int main()
{
  uint32_t sum = 0;
  uint8_t *buffer = mmap(NULL, 1<<18, PROT_READ,
                         MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
  uint16_t *p = (buffer + 1);
  int i;

  for (i=0;i<14;++i) {
    //printf("%d\n", i);
    sum += p[i];
  }

  return sum;
}
Run Code Online (Sandbox Code Playgroud)

如果使用分配内存,则仅此段错误mmap.如果我使用malloc,堆栈上的缓冲区,或全局变量,它不会段错误.

如果我将循环的迭代次数减少到少于14的次数,则不再是段错误.如果我从循环内打印数组索引,它也不再是段错误.

为什么未对齐的内存访问能够访问未对齐地址的CPU上的段错误,为什么只有在这种特定情况下呢?

c gcc mmap x86-64 auto-vectorization

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

如果汇编程序中没有退出系统调用会发生什么?

在汇编程序中,.text加载时0x08048000.在.data.bss部分来之后.

如果我没有exit在该.text部分中添加系统调用会发生什么?难道导致.data.bss被解释为代码造成"不可预测"的结果吗?程序何时终止 - 可能在执行每条"指令"之后?

我可以很容易地编写一个程序没有exit系统调用,但如果测试的.data,并.bss会得到执行的是我仍然不知道,因为我想我会知道那是在最罩产生的嘲笑,真正的机器代码.

我认为这个问题更多的是关于CPU和操作系统如何处理这种情况而不是汇编语言.

linux assembly operating-system termination

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

如果段错误不可恢复,为什么将其称为错误(而不是中止)?

我对术语的以下理解是这样的

1) 中断
是由硬件发起的“通知”,用于调用操作系统运行其处理程序

2) 陷阱
是由软件发起的“通知”,用于调用操作系统运行其处理程序

3) 故障
是处理器在发生错误但可恢复时引发的异常

4) 中止
是处理器在发生错误但不可恢复时引发的异常

为什么我们称其为asegmentation fault而不是a segmentation abortthen?

分段错误
是指当您的程序尝试访问操作系统尚未分配的内存或不允许访问的内存时。

我的经验(主要是在测试C代码时)是,每当程序抛出异常时,它segmentation fault都会回到绘图板 - 是否存在程序员实际上可以“捕获”异常并用它做一些有用的事情的场景?

x86 operating-system kernel x86-64 interrupt

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

如何从 C++ 上的分段错误中恢复?

我有一些生产关键代码必须继续运行。

将代码视为

while (true){
   init();
   do_important_things();  //segfault here
   clean();
}
Run Code Online (Sandbox Code Playgroud)

我不能相信代码没有错误,并且我需要能够记录问题以便稍后进行调查。

这次,我知道代码中的某个地方抛出了分段错误,我需要至少能够记录该错误,然后重新开始一切。

阅读这里有一些解决方案,但每个解决方案后面都是一场激烈的争论,声称该解决方案实际上弊大于利,没有真正的解释。我还找到了我考虑使用的这个答案,但我不确定它是否适合我的用例。

那么,从 C++ 分段错误中恢复的最佳方法是什么?

c++ error-handling signals exception segmentation-fault

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

是否可以检查内存地址是否有效?

一位客户带着一个应用程序来找我,但他们丢失了该应用程序的源代码。加载某些文件时,该应用程序似乎随机崩溃。我怀疑该问题是由于竞争条件造成的,其中删除了指针,然后未将其设置为 NULL 或未检查有效性。

当使用 OllyDBG 逐步执行程序集时,我发现崩溃总是发生在同一位置,因此这在某种程度上重新强化了我的理论。这是有时会崩溃的装配线,有时是关键字。

MOV EDI,DWORD PTR DS:[EAX]

是否可以通过本机汇编或通过内联汇编调用(或类似的方式)提取地址的 C++ 来验证内存地址是否有效且存在?

c++ assembly

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