当前位置:首页 » 操作系统 » linux栈溢出

linux栈溢出

发布时间: 2023-03-23 03:44:31

linux下,gcc提示“段错误 (核心已转储)”,ubuntu刚上手不大会用,谁说一下是啥问题

主要有以下几个方面的原因:

一、内存访问出错

这类问题的典型代表就是数组越界。

二、非法内存访问

出现这类问题主要是程序试图访问内核段内存而产生的错误。

三、栈溢出

Linux默认给一个进程分配的栈空间大小为8M。c++申请变量时,new操作申请的变量在堆中,其他变量一般在存储在栈中。

因此如果数组开的过大变会出现这种问题。

(1)linux栈溢出扩展阅读:

注意事项

段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。

一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了。在编程中基本是是错误地使用指针引起的。

Ⅱ Linux里面JVM内存怎么设置

一、堆内存相关配置

设置堆初始值
指令1:-Xms2g
指令2:-XX:InitialHeapSize=2048m

设置堆区最大值
指令1:`-Xmx2g`
指令2: -XX:MaxHeapSize=2048m

缩小堆内存的时机
-XX:MaxHeapFreeRatio=70//堆内存使用率大于70时扩张堆内存,xms=xmx时该参数无效,默认值70

扩张堆内存的时机
-XX:MinHeapFreeRatio=40//堆内存使用率小于40时缩减堆内存,xms=xmx时该参数无效,默认值40

新生代内存配置
指令1:-Xmn512m
指令2:-XX:MaxNewSize=512m

2个survivor区和Eden区大小比率
指令:-XX:SurvivorRatio=6 //S区和Eden区占新生代比率为1:6,两个S区2:6

新生代和老年代的占比
-XX:NewRatio=4 //表示新生代:老年代 = 1:4 即老年代占整个堆的4/5;默认值=2

二、方法区内存配置常用参数

初始化的Metaspace大小,
-XX:MetaspaceSize :

Metaspace最大值
-XX:MaxMetaspaceSize

三、线程栈内存配置常用参数
每个线程栈最大值
指令1:-Xss256k

指令2:-XX:ThreadStackSize=256k
注意:
栈设置太大,会导致线程创建减少。
栈设置小,会导致深入不够,深度的递归会导致栈溢出。
建议栈深度设置在3000-5000
四、配置垃圾收集器
Serial垃圾收集器(新生代)
开启:-XX:+UseSerialGC
关闭:-XX:-UseSerialGC
//新生代使用Serial 老年代则使用SerialOld
ParNew垃圾收集器(新生代)
开启 -XX:+UseParNewGC
关闭 -XX:-UseParNewGC
//新生代使用功能ParNew 老年代则使用功能CMS
Parallel Scavenge收集器(新生代)
开启 -XX:+UseParallelOldGC
关闭 -XX:-UseParallelOldGC
//新生代使用功能Parallel Scavenge 老年代将会使用Parallel Old收集器
ParallelOl垃圾收集器(老年代)
开启 -XX:+UseParallelGC
关闭 -XX:-UseParallelGC
//新生代使用功能Parallel Scavenge 老年代将会使用Parallel Old收集器
CMS垃圾收集器(老年代)
开启 -XX:+UseConcMarkSweepGC
关闭 -XX:-UseConcMarkSweepGC

G1垃圾收集器
开启 -XX:+UseG1GC
关闭 -XX:-UseG1GC

五、GC策略配置
GC并行执行线程数
-XX:ParallelGCThreads=16
新生代可容纳的最大对象
-XX:PretenureSizeThreshold=1000000 //大于此值的对象直接会分配到老年代,设置为0则没有限制。 //避免在Eden区和Survivor区发生大量的内存复制,该参数只对Serial和ParNew收集器有效,Parallel Scavenge并不认识该参数
进入老年代的GC年龄
进入老年代最小的GC年龄
-XX:InitialTenuringThreshol=7 //年轻代对象转换为老年代对象最小年龄值,默认值7,对象在坚持过一次Minor GC之后,年龄就加1,每个对象在坚持过一次Minor GC之后,年龄就增加1

进入老年代最大的GC年龄
-XX:MaxTenuringThreshold=15 //年轻代对象转换为老年代对象最大年龄值,默认值15

六、GC日志信息配置
配置GC文件路径
-Xloggc:/data/gclog/gc.log//固定路径名称生成 -Xloggc:/home/GCEASY/gc-%t.log //根据时间生成
滚动生成日志
日志文件达到一定大小后,生成另一个文件。须配置Xloggc
开启 -XX:+UseGCLogFileRotation
关闭 -XX:-UseGCLogFileRotation

-XX:NumberOfGCLogFiles=4 //滚动GC日志文件数,默认0,不滚动 -XX:GCLogFileSize=100k //GC文件滚动大小,需配置UseGCLogFileRotation,设置为0表示仅通过jcmd命令触发

Ⅲ linux内核中内核局部变量过大不会导致栈溢出吗

不会首先全局变量缓明是不占堆栈空间旁扰的全局全量编译的时侯是放在.data段的只有没有static修饰的局部变量在程序运行的时侯临时分配在栈上,new,或malloc等定义的运哪旦变量分配在堆上如果想让栈溢出也很容易,栈也有其极限的,只要定义一个无限递归函数

Ⅳ C语言 linux编程 stack smashing detected问题,帮我看看这段代码哪栈溢出。。。。

while循环中的else中printf("%s",mail)有问题,recv(sockfd,message,250,0)接收到培搜含的字符串中不含有结束符号“\0”所以当你用printf去输出mail字符串时找不到结束标记,所以漏宽会产生越界行为。你应该把if(size<250)中的mail[Size]=0放到Size=recv(sockfd,mail,250,0)的后面;这个问题应该就可以解决了。还有请记住不要用编译器自带的默认初始化值,配笑那个不可靠。

Ⅳ 在Linux下栈溢出攻击的,请高手讲清楚这个程序

extern char *strcpy(char *dest,const char *src);
strcpy(buffer, large_string); this line

说明:竖猛哪src和dest所指内存区域知扮不可以重叠且dest必须有足够的空间来容纳src的字余码符串

buffer 无足够空间

Ⅵ linux 内核堆栈总大小 怎么决定

Linux内核栈溢出(stack overflow)问题
最近一段时间在设计和开发一个Linux内核模块,进入到最后的正确性测试与稳定性测试阶段。在这个阶段发现了一个非常有意思的问题,堆栈溢出(stack overflow)。Linux内核堆栈溢出之后直接导致了系统kernel Panic。由于导致stack overflow的原因是递归调用导致的,所以,最后通过调试串口导出的kernel panic信息很快就定位问题所在了,否则这样的问题还真是很难调试和发现。通过这次bug,我们应该记住的是:Linux内核stack资源是有限的,而递归调用将大量消耗stack资源,因此在内核编程中尽量少用递归算法,否则将会导致出乎意料的一些问题。依次类推,为了减少stack资源的消耗,程序的局部变量定义的不要太大,否则也将会消耗大量stack资源,从而导致内核程序的不稳定。

为了解决递归调用导致的问题,我将递归算法改写成了非递归算法,解决了stack overflow的问题。在此介绍一下递归算法改写成非递归算法的一些思想。在项目实现过程中,需要对IO请求进行按顺序排队,因此采用了效率较高并且实现简单的快速排序算法,该算法是一种分治算法,即将排序队列进行切分,分解成一系列的小问题进行求解,针对这种问题,很容易采用递归的办法进行实现,伪代码描述如下:
/* qs_sort实现从小到大的排序 */
Struct bio qs_sort(struct bio_list *list_head, struct bio *bio_tail) {
Struct bio_list *less_list, *large_list;
Struct bio *middle_bio;

/* 递归调用结束点,小问题求解完毕,直接返回最后一个元素 */
If (!list_head) {
Return bio_tail;
}

/* 对队列进行切分,选择一个middle_bio,并且按照middle_bio将其切分成less_list队列和large_list队列 */
Split_list(list_head, less_list, large_list, &middle_bio);

/* 采用递归的方法实现大队列的排序操作 */
Middle_bio->bi_next = qs_sort(large_list, bio_tail);

/* 采用递归的方法实现小队列的排序操作 */
Return qs_sort(less_list, middle_bio);
}

Ⅶ 内核栈溢出

你没有释放内存 最终造成内存出错

Ⅷ 在windows数据栈溢出,在linux系统就没有栈溢出,为什么

一般是由橡拦早于数组指针访问越界;或者是野指针造成解决的法:可以将代码按功能段,一段一段测试,//测衡袭试一块代码时,先注释掉其它代码找梁雀出错误出现的地方,修正如果,因为程序里使用的堆栈大小大于默认的造成出错需要修改默认的堆栈大小的值

Ⅸ linux内核中内核局部变量过大不会导致栈溢出吗

不会首先全局变量是不占堆栈空间的
全局全量编译的时侯是放在.data段的
只有没有static修饰的局部变含空量在程序运行的时侯临时分配在栈上,new,或malloc等定义的变量分配在堆上
如果想让栈溢出也很容易,栈也有其极谈猛瞎限的,只要定义一个无限递归函数,让它没完没了的递归就行了,一会就崩了知改。
建议学一下编译原理

Ⅹ 堆栈Cookie 检测代码检测到基于堆栈的缓冲区溢出怎么解决

没有仔细研究,猜想出现这种问题应该是 str 输入超过指定长度,内存写乱了。
另外替楼上解释一下:

判断字符c是小写字母可以这样:if( c>='a' && c<= 'z'),不用事先存一个数组,大写字母和数字同理;

定义char数组不用加花括号{},烂纳磨如 char p[] = "aaa";
查了一下,scanf_s是VS提供的函数饥斗,多一个参数指定长度:scanf_s("%s",str,100);。

PS:作为一名潜水多年的三无用户,楼主是怎么邀请到我的
刚刚写错了,更正一下:if( c>='a' && c<= 'z');不知道为什么没法回复,对于你茄闹的问题,str作为数组,应该是它的某一位去和字符比较,如 if( str[i]>='a' && str[i]<= 'z')。

热点内容
小鸟酱265g资源密码多少啊 发布:2024-05-03 21:32:08 浏览:651
三国战纪游戏华为帐号密码是多少 发布:2024-05-03 21:22:54 浏览:949
变频压缩机启动 发布:2024-05-03 21:17:06 浏览:434
建立云存储 发布:2024-05-03 21:04:03 浏览:74
socket编程php 发布:2024-05-03 20:12:50 浏览:207
坦洲邮政局可以解压吗 发布:2024-05-03 20:09:55 浏览:732
二级程序编译答案 发布:2024-05-03 18:41:35 浏览:654
领动自动精英版是哪个配置 发布:2024-05-03 18:37:30 浏览:151
java编译器中cd什么意思 发布:2024-05-03 18:36:00 浏览:390
传奇服务器如何刷钱 发布:2024-05-03 18:36:00 浏览:978