問(wèn)答
產(chǎn)品
|
公司
|
配件目錄
|
EPC底盤(pán)號(hào)查詢
下載手機(jī)汽配人
汽配人首頁(yè) >
問(wèn)答首頁(yè)
centos中出現(xiàn)sigsegv和sigbus錯(cuò)誤,怎么辦
問(wèn)
提問(wèn)者:網(wǎng)友
|
2017-12-20
最佳回答
SIGBUS和SIGSEGV也許是我們?cè)谄綍r(shí)遇到的次數(shù)最多的兩個(gè)內(nèi)存錯(cuò)誤信號(hào)。內(nèi)存問(wèn)題一直是最令我們頭疼的事情,弄清楚兩個(gè)信號(hào)的發(fā)生緣由對(duì)我們很好的理解程序的運(yùn)行是大有裨益的。我們來(lái)看兩段程序://testsigsegv.cint main() { char *pc = (char*)0x00001111; *pc = 17;}//testsigbus.cint main() { int *pi = (int*)0x00001111; *pi = 17;}上面的代碼那么的相似,我們也同樣用gcc編譯(加上-g選項(xiàng),便于gdb調(diào)試;平臺(tái)Solaris Sparc),執(zhí)行結(jié)果也都是dump core。但通過(guò)GDB對(duì)core進(jìn)行觀察,你會(huì)發(fā)現(xiàn)細(xì)微的不同。第一個(gè)例子出的core原因是:Program terminated with signal 11, Segmentation fault. 而第二個(gè)例子的core則提示:Program terminated with signal 10, Bus error. 兩者有什么不同呢?這兩段代碼的共同點(diǎn)都是將一個(gè)非法地址賦值給指針變量,然后試圖寫(xiě)數(shù)據(jù)到這個(gè)地址。如果要說(shuō)清楚這個(gè)問(wèn)題,我們就要結(jié)合匯編碼和一些計(jì)算機(jī)的體系結(jié)構(gòu)的知識(shí)來(lái)共同分析了。先來(lái)看testsigsegv.c的匯編碼:... ...main: !#PROLOGUE# 0 save %sp, -120, %sp !#PROLOGUE# 1 sethi %hi(4096), %i0 or %i0, 273, %i0 st %i0, [%fp-20] ld [%fp-20], %i1 mov 17, %i0 stb %i0, [%i1] nop ret restore... ...我們關(guān)注的是這句:stb %i0, [%i1]從計(jì)算機(jī)底層的執(zhí)行角度來(lái)說(shuō),過(guò)程是如何的呢?%i0寄存器里存儲(chǔ)的是立即數(shù)17,我們要將之存儲(chǔ)到寄存器%i1的值指向的內(nèi)存地址。這一過(guò)程對(duì)于CPU來(lái)說(shuō)其指揮執(zhí)行的正常過(guò)程是:將寄存器%i0中的值送上數(shù)據(jù)總線,將寄存器%i1的值送到地址總線,然后使能控制總線上的寫(xiě)信號(hào)完成這一向內(nèi)存寫(xiě)1 byte數(shù)據(jù)的過(guò)程。我們?cè)倏磘estsigbus.c的匯編碼:... ...main: !#PROLOGUE# 0 save %sp, -120, %sp !#PROLOGUE# 1 sethi %hi(4096), %i0 or %i0, 273, %i0 st %i0, [%fp-20] ld [%fp-20], %i1 mov 17, %i0 st %i0, [%i1] nop ret restore... ...同樣最后一句:st %i0, [%i1],CPU執(zhí)行的過(guò)程與testsigsegv.c中的一致(只是要存儲(chǔ)數(shù)據(jù)長(zhǎng)度是4字節(jié)),那為什么產(chǎn)生錯(cuò)誤的原因不同呢?一個(gè)是SIGSEGV,而另一個(gè)是SIGBUS。這里涉及到的就是對(duì)內(nèi)存地址的校驗(yàn)的問(wèn)題了,包括對(duì)內(nèi)存地址是否對(duì)齊的校驗(yàn)以及該內(nèi)存地址是否合法的校驗(yàn)。我們假設(shè)如果首先進(jìn)行的內(nèi)存地址是否合法的校驗(yàn)(是否歸屬于用戶進(jìn)程的地址空間),那么我們回顧一下,這兩個(gè)程序中的地址0x00001111顯然都不合法,按照這種流程,兩個(gè)程序都應(yīng)該是SIGSEGV導(dǎo)致的core才對(duì),但是事實(shí)并非如此。那難道是先校驗(yàn)內(nèi)存地址的對(duì)齊?我們?cè)倏催@種思路是否合理?testsigsegv.c中,0x00001111這個(gè)地址值被賦給了char *pc;也就是告訴CPU通過(guò)這個(gè)地址我們要存取一個(gè)字節(jié)的值,對(duì)于一個(gè)字節(jié)長(zhǎng)度的數(shù)據(jù),無(wú)所謂對(duì)齊,所以該地址通過(guò)對(duì)齊校驗(yàn);并被放到地址總線上了。而在testsigbus.c里,0x00001111這個(gè)地址值被賦給了int *pi;也就是告訴CPU通過(guò)這個(gè)地址我們要存取一個(gè)起碼4個(gè)字節(jié)的值,那么對(duì)于長(zhǎng)度4個(gè)字節(jié)的對(duì)象,其存放地址起碼要被4整除才可以,而0x00001111這個(gè)值顯然不能滿足要求,也就不能通過(guò)內(nèi)存對(duì)齊的校驗(yàn)。也就是說(shuō)SIGBUS這個(gè)信號(hào)在地址被放到地址總線之后被檢查出來(lái)的不符合對(duì)齊的錯(cuò)誤;而SIGSEGV則是在地址已經(jīng)放到地址總線上后,由后續(xù)流程中的某個(gè)設(shè)施檢查出來(lái)的內(nèi)存違法訪問(wèn)錯(cuò)誤。一般我們平時(shí)遇到SIGBUS時(shí)總是因?yàn)榈刂肺磳?duì)齊導(dǎo)致的,而SIGSEGV則是由于內(nèi)存地址不合法造成的。1) SIGBUS(Bus error)意味著指針?biāo)鶎?duì)應(yīng)的地址是有效地址,但總線不能正常使用該指針。通常是未對(duì)齊的數(shù)據(jù)訪問(wèn)所致。2) SIGSEGV(Segment fault)意味著指針?biāo)鶎?duì)應(yīng)的地址是無(wú)效地址,沒(méi)有物理內(nèi)存對(duì)應(yīng)該地址。 Linux的mmap(2)手冊(cè)頁(yè)使用映射可能涉及到如下信號(hào)SIGSEGV 試圖對(duì)只讀映射區(qū)域進(jìn)行寫(xiě)操作SIGBUS 試圖訪問(wèn)一塊無(wú)文件內(nèi)容對(duì)應(yīng)的內(nèi)存區(qū)域,比如超過(guò)文件尾的內(nèi)存區(qū)域,或者以前有文件內(nèi)容對(duì)應(yīng),現(xiàn)在為另一進(jìn)程截?cái)噙^(guò)的內(nèi)存區(qū)域。調(diào)試方法:gcc -g 編譯 ulimit -c 20000 之后運(yùn)行程序,等core dump 最后gdb -c core
回答者:網(wǎng)友
產(chǎn)品精選
我來(lái)回答
看不清?換一個(gè)
提交答案
相關(guān)已解答問(wèn)題
車載輪胎充氣泵怎么用
汽車安全帶怎么清洗
奧迪A4 Allroad quattro和A5 Sportback是混型車嗎?
A4 allroad 二代EA888發(fā)動(dòng)機(jī)燒機(jī)油嗎
什么牌子的越野車好?
壓力傳感器安裝在什么位置?
重型半掛牽引車疲勞駕駛扣幾分
長(zhǎng)城哈弗h6coupe車身自重
1.8噸貨車年檢都需要什么 需要多少錢(qián)
2橋的集裝箱半掛車多少錢(qián)?
在移動(dòng)端查看:
centos中出現(xiàn)sigsegv和sigbus錯(cuò)誤,怎么辦
搜索問(wèn)答
還沒(méi)有汽配人賬號(hào)?
立即注冊(cè)
我要提問(wèn)
精彩推薦
1
鋼板彈簧懸架和霍奇基斯懸架哪個(gè)好
2
奧迪A6L 換防凍液之后怎么排空氣?
3
奧迪Q7車身車架號(hào)在哪?
4
奧迪a6電瓶正負(fù)極在哪
5
車輛類型(車輛類型K21、K31、K32、H32各代表什么意思?)
6
東風(fēng)天錦,凸輪軸與曲軸轉(zhuǎn)速傳感器不匹配
7
奧迪245/40/R18是什么意思
8
東風(fēng)天龍駕駛座椅氣囊怎么沒(méi)反應(yīng)
9
東風(fēng)天龍汽車儀表未收到EECU報(bào)文是什么原因呢
10
東風(fēng)天錦儀表中顯示STOP在閃爍是代表什么意思!只要閃爍了車儀表故障碼就顯示不出來(lái),但是車就是打不著火!
周邊商家推薦
周邊產(chǎn)品推薦
相關(guān)問(wèn)答
機(jī)戰(zhàn)中防護(hù)罩的原理
奧迪A8W12,寶馬760li,奔馳S600,哪個(gè)綜合起來(lái)最好
歐洲之星客車和青年客車哪個(gè)好點(diǎn)
雪佛蘭克魯斯汽車發(fā)動(dòng)機(jī)有敲缸聲音怎么辦
物流學(xué)生去超市好啊還是去汽車配件流水線好啊
哈力愛(ài)俊達(dá)的150CC-250CC的仿跑摩托車怎么樣?
群達(dá)1000合一 萬(wàn)能空調(diào)遙控器 壞了,急求!!
你好 請(qǐng)問(wèn)你下 按結(jié) 要有些什么明細(xì)的東西
拜求大神解答皇冠轉(zhuǎn)速表正常但速度表不轉(zhuǎn)怎么回事
產(chǎn)品精選
倍耐力輪胎
河北半掛車
撥動(dòng)開(kāi)關(guān)
高壓清洗管道
開(kāi)封隨車吊
南京軸承
VG1560130064
DZ1642690021
電纜線
雨刷器電機(jī)
優(yōu)勢(shì)廠家
無(wú)油軸承廠家
法士特取力器廠家
寶馬空氣流量計(jì)廠家
大運(yùn)六角頭螺栓廠家
佩特來(lái)開(kāi)關(guān)廠家
PI5130SMX6廠家
SZ955001028廠家
奇瑞t11廠家
汽油泵廠家
指示燈廠家
圖片大全
風(fēng)神曲軸圖片
浙江發(fā)電機(jī)圖片
東風(fēng)新車圖片
康明斯拆裝器圖片
5001040圖片
81.96121.0056圖片
集濾器圖片
剪刀圖片
螺栓圖片
示廓燈圖片
推薦主題
發(fā)電機(jī)組
解放車橋
三菱8DC
濰柴JX0818
蓄電池
河北空氣濾芯
HFF24102038CK1
C3782374
Bravo
汽車噴油器
本頁(yè)是網(wǎng)友提供的關(guān)于“centos中出現(xiàn)sigsegv和sigbus錯(cuò)誤,怎么辦”的解答,僅供您參考,汽配人網(wǎng)不保證該解答的準(zhǔn)確性。
協(xié)議規(guī)則
服務(wù)協(xié)議
交易規(guī)則
注冊(cè)新用戶
幫助中心
網(wǎng)站服務(wù)
汽配旺鋪
網(wǎng)價(jià)查詢
商用車EPC查詢
營(yíng)銷寶
特色市場(chǎng)
商用車市場(chǎng)
乘用車市場(chǎng)
東風(fēng)市場(chǎng)
重汽市場(chǎng)
陜汽市場(chǎng)
一汽市場(chǎng)
北汽市場(chǎng)
江淮市場(chǎng)
專用汽車
地方分站
江蘇分站
廣東分站
山東分站
吉林分站
專用車分站
河南分站
十堰產(chǎn)業(yè)帶
云南分站
陜西市場(chǎng)
移動(dòng)端
手機(jī)登錄:m.qipeiren.com
iPhone
Android
關(guān)于我們
|
友情鏈接
|
汽車配件批發(fā)
|
汽車配件圖片
|
汽車配件大全
|
汽配問(wèn)答
|
汽配廠家
|
汽配品牌
|
汽配主題
|
汽配城
|
鄂ICP備14009261號(hào)
經(jīng)營(yíng)許可證編號(hào):鄂B2-20140114
服務(wù)熱線:0719-8311727
Copyright © 2005-2024 十堰億脈科技有限公司 版權(quán)所有
鄂公網(wǎng)安備 42030202000345號(hào)