找到分段错误的原因

原文出处:https://kb.iu.edu/d/aqsj

 

 

概述

分段错误原因在于程序读写了非法位置的内存。

而程序内存分为不同的段,segments

程序指令放在  text segment

数据(编译时定义的变量、数组)放在 data segment 

函数中定义的临时变量放在  stack segment

函数运行时分配的 内存 如malloc,放在 heap segment

当对某变量引用时,地址却在此变量所在的段外时,或者 企图对一个只读段进行写操作时,segfault就会产生。

实践中,segfaults的出现,总是因为 读写了一个不存在的数组元素,或者没有合适的定义一个指针就使用了它,或者偶然地把一个变量的值作为了地址。

 

段错误举例

数组越界相关的例子

Case A
/* "Array out of bounds" error valid indices for array foo are 0, 1, ... 999 */ 
int foo[1000]; 
for (int i = 0; i <= 1000 ; i++) foo[i] = i;
Case B
/* Illegal memory access if value of n is not in the range 0, 1, ... 999 */ 
int n; 
int foo[1000]; 
for (int i = 0; i < n ; i++) 
      foo[i] = i;
Case C
/* Illegal memory access because no memory is allocated for foo2 */ 
float *foo, *foo2; 
foo = (float*)malloc(1000); 
foo2[0] = 1.0;

错误使用指针的例子:

int foo = 0; scanf("%d", foo); /* Note missing & sign ; correct usage would have been &foo */

另外,写只读内存,以及栈空间溢出,都会导致Segfaults 

栈空间溢出也可能不是程序bug,而是你的shelll设置的栈太小了。

找出越界数组

找出越界数组引用

一些编译器中含有越界检查选项,可以在数组引用重插入代码,在调试的时候检测是否越界。

检查shell的限制

使用ulimit -s查看linux默认栈空间大小 ,也可以用ulimit -s xxx设置大小。

使用调试器诊断段错误

当程序出现segfaults时候,会把崩溃时候的内存中的一部分内容dump到core文件中,用gdb core启动调试器,

然后用 backtrace命令查看什么地方出现了crash.

如果backtrace不行,则需要启动调试器,跟踪,此时代码需要再无优化的情况下编译,加上-g 则会把代码行信息嵌入

程序中。

 

 

 

 

 

 

### 回答1: PyCharm社区版是一款功能强大的Python集成开发环境。它允许我们编写、调试和运行Python代码。在编写代码时,有时我们希望只执行其中的一部分代码,这就是所谓的分段执行。 要在PyCharm社区版中进行分段执行,我们可以使用注释和断点这两种方法。 首先,我们可以使用注释来实现分段执行。我们可以在需要暂时跳过的代码块前面加上注释符号,例如“#”,这样代码会被当作注释而被忽略掉。然后,当我们需要执行这部分代码时,只需将注释符号去掉即可。 其次,我们还可以使用断点来实现分段执行。通过在代码中设置断点,我们可以在指定位置暂停代码的执行。我们可以在需要暂停的代码行上右键点击,在弹出的菜单中选择“Toggle Line Breakpoint”来设置断点。然后,我们可以点击“Debug”选项来运行代码,并在断点处暂停执行。在暂停时,我们可以查看和修改变量的值,以及单步调试代码。 总之,PyCharm社区版提供了多种方式来实现分段执行。我们可以通过注释暂时跳过需要执行的代码部分,或者使用断点在指定位置暂停执行。这些方法能够帮助我们更灵活地调试、运行和测试代码,提高开发效率。 ### 回答2: PyCharm社区版是一种强大的Python集成开发环境(IDE),可用于开发Python应用程序。它支持分段执行代码,这意味着您可以选择性地运行脚本的一部分,而不是整个脚本。 分段执行代码的主要优点是可以更好地测试和调试代码。当您只想测试脚本的一小部分时,您可以将其选中并只运行选定的代码。这样,您可以更深入地了解代码运行的过程,查找可能的错误和问题。 要在PyCharm社区版中分段执行代码,您可以按Ctrl + /组合键将选定的代码块注释掉。然后,您可以按Ctrl + Shift + E来执行该注释的代码块。这将运行选定的代码,显示其输出结果,并且您可以检查其中的错误。这对于您想要逐步测试代码并查看运行结果的情况非常有用。 此外,您还可以使用调试工具来分段执行代码。通过设置断点,您可以在代码执行到断点处时停止并检查变量的值。然后,您可以逐步执行剩余的代码,以便更好地理解代码的执行流程。 总而言之,PyCharm社区版提供了分段执行代码的功能,使您能够更好地测试和调试Python代码。这个特性可以为您提供更大的灵活性,并帮助您更快地发现和解决问题。无论是通过注释代码块还是使用调试工具,您都可以选择性地运行代码的一部分,并检查其输出结果和相关的错误信息。 ### 回答3: PyCharm社区版是一种功能强大的集成开发环境,它支持分段执行代码。分段执行是指程序的代码可以被分成多个部分分别执行,而不是一次性执行全部代码。这在调试和逐步执行代码时非常有用。 在PyCharm社区版中,可以通过在代码中使用断点来实现分段执行。断点是程序中暂停执行的一个标识,当程序运行到断点处时,会中断执行并进入调试模式。可以在代码编辑器中点击行号的左侧来设置断点,或者使用快捷键Ctrl+F8来标记当前行作为断点。设置断点后,程序运行时会在断点处停止执行。 一旦程序停止在断点处,我们可以使用调试工具来逐步执行代码。可以使用调试工具栏上的按钮,如"Step Over"(逐行执行)、"Step Into"(进入函数体内部)、"Step Out"(跳出函数体)、"Resume Program"(恢复程序执行)等来控制代码的执行。通过逐步执行代码,我们可以查看变量的值,并检查程序的执行过程。 分段执行代码非常有助于调试和排查问题。当程序出现错误或异常时,可以设置断点并逐步执行代码,观察每个变量的值,以找到出错的原因。通过分段执行,我们可以更容易地理解程序的执行过程,并能够逐步解决问题。 总而言之,PyCharm社区版支持分段执行,通过设置断点和使用调试工具,可以逐步执行代码并观察每个变量的值,从而快速定位代码中的问题。这种功能在调试和分析程序时非常有用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值