精华内容
下载资源
问答
  • SIGSEGV

    2017-07-26 19:53:00
    SIGSEGV
    SIGSEGV
    展开全文
  • SIGBUS SIGSEGV

    2020-04-29 17:20:15
    SIGSEGV 只读映射区写数据 SIGBUS 一些硬件内存对齐要求

    SIGSEGV

    只读映射区写数据

    SIGBUS

    一些硬件内存对齐要求

    展开全文
  • (转载)如何避免 SIGSEGV如何避免SIGSEGV良好的编程习惯永远是最好的预防方法。良好的习惯包括:尽量按照C标准写程序。之所以说是尽量,是因为C标准有太多平台相关和无定义的行为,而其中一些实际上已经有既成事实的...

    ca56232b3bbedf9a539d07f37fffb99a.gif

    3144d8b7615c79d9f638db40d5689d26.gif

    a218af6549b45ee526caf607ebff1358.gif

    0f8df0e29816ae721419de940fb833d1.gif

    (转载)如何避免 SIGSEGV

    如何避免SIGSEGV

    良好的编程习惯永远是最好的预防方法。良好的习惯包括:

    尽量按照C标准写程序。之所以说是尽量,是因为C标准有太多平台相关和无定义的行为,而其中一些实际上已经有既成事实的标准了。例如C标准中,一个越界的指针导致的是无定义的行为,而在实际情况中,一个越界而未解引用的指针是不会带来灾难后果的。借用CU的一个例子,如下:

    1 #include

    2 #include

    3

    4 int main () {

    5     char a[] = "hello";

    6     char* p;

    7

    8     for ( p = a+5; p>=a; p-- )

    9         printf ("%c\n", *p);

    10

    11 }

    虽然循环结束后,p指向了数组a前一个元素,在C标准中这是一个无定义的行为,但实际上程序却是安全的,没有必要为了不让p成为一个野指针而把程序改写为:

    1 #include

    2 #include

    3

    4 int main () {

    5     char a[] = "hello";

    6     char* p;

    7

    8     for ( p = a+5; p!=a; p-- ) {

    9         printf ("%c\n", *p);

    10     }

    11     printf ("%c\n", *p);

    12 }

    当然,或许世界上真有编译器会对“越界但未解引用”的野指针进行处理,例如引发一个SIGSEGV。笔者无法100%保证,所以大家在实践中还是各自斟酌吧。

    彻底的懂得你的程序。和其它程序员不同的是,C程序员需要对自己的程序完全了解,做到精确控制。尤其在内存的分配和释放方面。在操作每一个指针前,你都应该清楚它所指向内存的出处(栈、堆、全局区),并清楚此内存的生存周期。只有明白的使用内存,才能最大限度的避免SIGSEGV的产生。

    大量使用assert。笔者偏好在程序中使用大量的assert,凡是有认为不该出现的情况,笔者就会加入一个assert做检查。虽然assert无法直接避免SIGSEGV,但它却能尽早的抛出错误。离错误越近,就越容易root cause。很多时候出现SIGSEGV时,程序已经跑飞很远了。

    打开-Wall  –Werror编译选项。如果程序是自己写的,0 warning应该始终是一项指标(0 warning不包括因为编译器版本不同而引起的warning)。一种常见的SIGSEGV来源于向函数传入了错误的参数类型。例如:

    1 #include

    2 #include

    3 #include

    4

    5 int main () {

    6     char buf[12];

    7     int buff;

    8

    9     strcpy (buff, "hello");

    10

    11 }

    这个例子中,本意是要向buf拷贝一个字符串,但由于有一个和buf名称很相近的buff变量,由于一个笔误(这个笔误很可能就来自你编辑器的自动补全,例如vim的ctrl – p, ctrl – n),strcpy如愿的引发了SIGSEGV。实际在编译期间,编译器就提示我们warning: passing argument 1 of `strcpy' makes pointer from integer without a cast,但我们忽略了。

    这就进一步要求我们尽量使用编译器的类型检查功能,包括多用函数少用宏(特别是完成复杂功能的宏),函数参数多用带类型的指针,少用void*指针等。此例就是我们在2.2节提到的不经意的行为。

    少用奇技淫巧,多用标准方法。好的程序应该逻辑清楚,干净整洁,像一篇朗朗上口的文章,让人一读就懂。那种充满晦涩语法、怪异招数的试验作品,是不受欢迎的。很多人喜欢把性能问题做为使用不标准方法的借口,实际上他们根本不知道对性能的影响如何,拿不出具体指标,全是想当然尔。笔者曾经在项目中,将一个执行频繁的异常处理函数用汇编重写,使该函数的执行周期从2000多个机器周期下降到40多个。满心欢喜的提交了一个patch给该项目的maintainer,得到的答复是:“张,你具体测试过你的patch能带来多大的性能提升吗?如果没有明显的数据,我是不愿意将优雅的C代码替换成这晦涩的汇编的。”于是我做了一个内核编译来测试patch,耗时15分钟,我的patch带来的整体性能提升大约为0.1%。所以,尽量写清楚明白的代码,不仅有利于避免SIGSEGV,也利于在出现SIGSEGV后进行调试。

    当你的一个需求,标准的方法不能满足时,只有两种可能:1.从一开始的设计就错了,才会导致错误的需求;2.你读过的代码太少,不知道业界解决该问题的标准方法是什么。计算机已经发展了几十年,如果你不是在做前沿研究,遇到一定得用非标准方法解决的问题的机会实在太小了。正如我们经常用gdb跟踪发现SIGSEGV发生在C库里,不要嚷嚷说C库有bug,大部情况是一开始你传入的参数就错了。

    小结

    无论如何我们应该感谢SIGSEGV,是它让我们能在不重启机器的情况下调试程序。相比那些由于内存使用错误而不得不一次又一次重启机器来debug的内核工程师,SIGSEGV让我们的生活变得轻松。理解SIGSEGV同时,我们也更加理解程序。希望这篇文档对初学C语言的同志有些许帮助。

    展开全文
  • SIGSEGV 11

    千次阅读 2014-02-19 12:34:31
    在POSIX兼容的平台上,SIGSEGV是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。SIGSEGV的符号常量在头文件signal.h中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用。通常...

    SIG是信号名的通用前缀。SEGV是segmentation violation(段违例)的缩写。

    在POSIX兼容的平台上,SIGSEGV是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。SIGSEGV的符号常量在头文件signal.h中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用。通常,它是信号#11

    对于不正确的内存处理(见段错误),计算机程序可能抛出SIGSEGV。操作系统可能使用信号栈向一个处于自然状态的应用程序通告错误,由此,开发者可以使用它来调试程序或处理错误。

    在一个程序接收到SIGSEGV时的默认动作是异常终止。这个动作也许会结束进程,但是可能生成一个核心文件以帮助调试,或者执行一些其他特定于某些平台的动作。例如,使用了grsecurity补丁的Linux系统可能记录SIGSEGV信号以监视可能的使用缓存溢出的攻击尝试。

    SIGSEGV可以被捕获。也就是说,应用程序可以请求它们想要的动作,以替代默认发生的动作。这样的动作可以是忽略它、调用一个函数,或恢复默认的动作。在一些情形下,忽略SIGSEGV导致未定义行为。

    一个应用程序可能处理SIGSEGV的例子是调试器,它可能检查信号栈并通知开发者目前所发生的,以及程序终止的位置。

    SIGSEGV通常由操作系统生成,但是有适当权限的用户可以在需要时使用kill系统调用或kill命令(一个用户级程序,或者一个shell内建命令)来向一个进程发送信号。


    展开全文
  • Program received signal SIGSEGV

    万次阅读 多人点赞 2019-08-12 09:46:14
    这两天在写代码的时候碰到一个很抓狂的bug,调试告诉我“Program received signal SIGSEGV”,发生了段错误。 段错误是访问了不该访问的内存,也就是说你访问的这个地址不在系统给你分配的范围内(大部分情况都是...
  • SIGSEGV信号

    2014-11-13 16:51:24
    According to POSIX, the behaviour of a process is unde- ... fined after it ignores a SIGFPE, SIGILL, or SIGSEGV signal  that was not generated by the kill() or the raise() func-  
  • SIGBUS和SIGSEGV

    2018-03-15 18:08:01
    一、导致SIGSEGV 1.试图对只读映射区域进行写操作 。 2.访问的内存已经被释放,也就是已经不存在或者越界。3.官方说法是:SIGSEGV --- Segment Fault. The possible cases of your encountering this error are:...
  • 段违例:sigsegv信号

    2019-05-30 16:51:37
    在调试程序时经常会遇到各种断错误bug导致程序崩溃,用gdb调试发现崩溃的原因通常是因为进程受到了sigsegv信号,所以在此记录一下关于sigsegv信号的知识。 在POSIX兼容的平台上,SIGSEGV是当一个进程执行了一个无效...
  • SIGSEGV与SIGBUS

    2017-09-15 10:58:10
    SIGSEGV与SIGBUS SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。...SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内
  • SIGBUS 和 SIGSEGV

    2017-04-22 13:39:00
    一、导致SIGSEGV 1.试图对仅仅读映射区域进行写操作。 2.訪问的内存已经被释放,也就是已经不存在或者越界。 3.官方说法是: SIGSEGV --- Segment Fault. The possible cases of your encountering this ...
  • OJ的SIGSEGV错误

    2021-05-17 10:00:45
    OJ上部分显示SIGSEGV错误,不知道哪里有问题。烦请各位大神指教! #include <stdio.h> #include <string.h> #define MAXLENGTH 41 struct Node { int flag = 0; char* name; Node* pred, * succ; ...
  • random crash (SIGSEGV)

    2021-01-06 03:44:25
    <div><p>I got a random crash (SIGSEGV) in Debian hexchat 2.12.4-2 on Debian stretch. If the below gdb backtrace summary and attached full gdb backtrace isn't useful, please close this bug. <pre>...
  • Application received signal SIGSEGV (null) (( 0 CoreFoundation 0x0000000181037d50 <redacted> + 148 1 libobjc.A.dylib 0x000000018054c528 ob...
  • sigsegv sigbus错误

    2015-05-31 09:57:49
    sigsegv 段错误 有效地址的无效访问 sigbus 总线错误 无效地址访问
  • android闪退 日志分析 SIGSEGV https://blog.csdn.net/qq_18709863/article/details/84190512 之前一次测试 有很多闪退 大部分都是 SIGSEGV(SEGV_MAPERR) 真是头疼 从未涉及过这类问题 挠挠头 开始刨坑之旅...
  • SIGSEGV错误

    2009-03-18 20:04:00
    今天编程遇到了SIGSEGV错误,比较困惑,所以找了些资料,总结一下:(1)官方说法是: SIGSEGV --- Segment Fault. The possible cases of your encountering this error are: 1.buffer overflow --- usually caused...
  • SIGSEGV不同code

    千次阅读 2014-01-11 16:13:26
    signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 41963214 signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 4006e000 SEGV_MAPERR means you tried to access an address that doesn't map to a
  • linux dlopen() dlsym SIGSEGV

    2020-11-25 15:39:35
    <p>linux下开发问题:...<p>Program received signal SIGSEGV, Segmentation fault.0x0000000000000000 in ?? () <p>Cannot find bounds of current function 什么原因??求助</p>
  • program received signal sigsegv老是忘记这是啥错误。。。其实就是因为原来声明了一个字符串并且给它赋常量了,然后后面又打算改里面的内容,这样就会这样报错...
  • Program received signal SIGSEGV: Segmentation fault - invalid memory reference. Backtrace for this error: #0 0x7f5748cbaea7 in ??? #1 0x7f5748cba0dd in ??? #2 0x7f57489a420f in ??? #3 0x55c5e349c26e ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,952
精华内容 8,780
关键字:

sigsegv