Articles of 分段错误

是否有可能获得只包含调用堆栈,线程和本地variables的Linux核心?

我的公司正在利用Linux中的coredumpfunction(特别是CentOS)来追踪一些难以发现的问题。 不幸的是,我们有一堆小型虚拟机运行在有限的高清空间下,而完整的核心转储正在造成问题,因为这些堆占用了大量的空间。 发生分段错误时是否可以让Linux转储callstack,线程和本地variables? 我试图将转储限制为50兆,但似乎并不是所有需要的细节都在前50兆字节(ulimit -c 51200)。 我们可以像这样截断堆,但是我一直没有find什么大小的工作。 我知道有可能在需要的时候用一些额外的代码写出你自己的调用堆栈,但是我们正处在一个我们正在结束的阶段,这对于我们遇到的这些最后几个问题来说将是一个难题。

x86 GNU汇编奇怪的更改Seg错误

下面的x86汇编代码很好的组装,它用来在我学校的linux服务器上完美地运行,但是当我的linux虚拟机(ubuntu 14.04)使用相同的代码时,它突然间会导致分段错误。 堆栈规范改变了,这是一个GNU汇编器问题吗? 我错过了什么备忘录? 我在一台64位的机器上运行,这是构build操作系统骨干的热身,所以我需要能够使用16位真正的32位保护和64位模式所有在同一个程序。 所以我想我真正需要的是在同一个程序中使所有模式有效的小细节。 我知道在更改模式时使用.code16 / 32/64,但是我猜想我错过了什么(在任何操作系统教程中都找不到)是如何在64位体系结构上执行的。 .code32 .text .global _start _start: pushl $str1 pushl $len1 call print addl $8, %esp <-cleans up the stack pointer exit: movl $1, %eax movl $0, %ebx int $0x80 print: pushl %ebp movl %esp, %ebp movl $4, %eax movl $1, %ebx movl 12(%ebp), %ecx <- This is […]

Linux:处理分段错误并获取核心转储

当我的应用程序崩溃与分段错误,我想从系统中获得核心转储。 我通过事先configuration来做到这一点 ulimit -c unlimited 我还想在我的应用程序日志中显示出现分段错误。 我通过使用sigaction()来做到这一点。 但是,如果我这样做,信号没有达到其默认处理,核心转储不保存。 我怎样才能同时从我自己的信号处理器系统核心转储一个日志行?

Segfault在堆栈溢出

为什么linux内核在堆栈溢出时产生段错误? 当c中的alloca或Fortran创build临时数组溢出时,这可能会使debugging非常尴尬。 当然,运行时可能会产生更有用的错误。

是否有一个陷阱“段错误”?

我知道,如果有足够的上下文,我们可以希望从段落状态中有build设性的使用(即恢复)。 但是,这是值得的吗? 如果是,在什么情况下?

由于内存不足导致分割错误

这段代码给了我大约1/2的分段错误时间: int main(int argc, char **argv) { float test[2619560]; int i; for(i = 0; i < 2619560; i++) test[i] = 1.0f; } 我实际上需要分配一个更大的数组,是否有某种方式允许操作系统让我获得更多的内存? 我正在使用Linux Ubuntu 9.10

无效的读/写有时会产生分段错误,有时不会

示例代码: int main () { char b[] = {"abcd"}; char *c = NULL; printf("\nsize: %d\n",sizeof(b)); c = (char *)malloc(sizeof(char) * 3); memcpy(c,b,10); // here invalid read and invalid write printf("\nb: %s\n",b); printf("\nc: %s\n",c); return 0; } 在代码中看到我已经做了一些无效的读取和无效的写入,但是这个小程序工作正常,不会创buildcore dump 。 但是一旦在我的大型图书馆里,每当我做了1个字节的无效读取或无效写入,它总是在创build核心转储。 题: 为什么我有时会从无效读/写中获得核心转储,有时不会获得核心转储?

为什么glibc的fclose(NULL)会导致分段错误而不是返回错误?

根据man page fclose(3) : 返回值 成功完成后返回0。 否则,将返回EOF ,并将全局variableserrno设置为指示错误。 在这两种情况下,任何进一步访问(包括对fclose()另一个调用)都会导致未定义的行为。 错误 EBADF基础fp文件描述符无效。 fclose()函数也可能会失败,并为例程close(2) , write(2)或fflush(3)指定的任何错误设置errno 。 当然, fclose(NULL)应该会失败,但是我希望它正常地返回一个errno而不是直接通过分段错误死亡。 这种行为有什么理由吗? 提前致谢。 更新:我会把我的代码在这里(我试图strerror() ,特别是)。 FILE *not_exist = NULL; not_exist = fopen("nonexist", "r"); if(not_exist == NULL){ printError(errno); } if(fclose(not_exist) == EOF){ printError(errno); }

Linux上用C语言中的char数组和指针分割错误

所以我有以下程序: int main(){ char* one = "computer"; char two[] = "another"; two[1]='b'; one[1]='b'; return 0; } 它在“one [1] ='b'”这一行上进行段错误,这是合理的,因为指针“one”指向的内存必须位于只读内存中。 然而,问题是为什么不行“two [1] ='b'”段错误? 查看gcc的汇编输出: .file "one.c" .section .rodata .LC0: .string "computer" .LC1: .string "another" .text .globl main .type main, @function main: 我们看到两个string都在rodata部分,所以它们是只读的。 那么怎么会这样“two [1] ='b'这段代码没有段错?

为什么malloc有时不工作?

我正在将一个C项目从Linux移植到Windows。 在Linux上它是完全稳定的。 在Windows上,大多数时候都运行良好,但有时会出现分段错误。 我正在使用Microsoft Visual Studio 2010进行编译和debugging,看起来像有时我的malloc调用根本不分配内存,返回NULL。 机器有空闲的内存; 它已经通过了这个代码一千次,但它仍然发生在不同的位置。 就像我说的那样,它不会一直发生在同一个地方, 它看起来像一个随机错误。 有什么我必须在Windows上比在Linux上更小心吗? 我能做什么错了?