當前位置:首頁 » 操作系統 » 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')。

熱點內容
安卓現在哪個品牌用得最久 發布:2024-04-20 12:00:50 瀏覽:276
小拇指演算法 發布:2024-04-20 11:55:28 瀏覽:954
域名查看雲伺服器ip地址 發布:2024-04-20 11:49:17 瀏覽:551
反編譯軟體id 發布:2024-04-20 10:29:49 瀏覽:44
視頻太長怎麼壓縮發微信 發布:2024-04-20 10:00:14 瀏覽:384
顯卡怎麼保存配置 發布:2024-04-20 09:28:52 瀏覽:596
校園交易網站源碼 發布:2024-04-20 09:18:54 瀏覽:701
江蘇北斗授時伺服器ip雲空間 發布:2024-04-20 08:53:50 瀏覽:931
dedecms批量上傳圖片 發布:2024-04-20 08:42:11 瀏覽:966
酷q如何編譯 發布:2024-04-20 08:41:27 瀏覽:79