新聞中心
Linux 是一款非常穩(wěn)定可靠的操作系統(tǒng),但是隨著軟件的不斷升級(jí)和各種應(yīng)用程序的普及,Linux 報(bào)錯(cuò)也日益常見(jiàn),比如常見(jiàn)的 139 錯(cuò)誤碼。這個(gè)錯(cuò)誤通常與應(yīng)用程序錯(cuò)誤或者是系統(tǒng)庫(kù)錯(cuò)誤有關(guān),下面我們將對(duì) Linux 報(bào)錯(cuò)代碼 139 進(jìn)行詳細(xì)解析,并提供一些修復(fù)方法。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到海珠網(wǎng)站設(shè)計(jì)與海珠網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋海珠地區(qū)。
Linux 報(bào)錯(cuò)代碼 139 的含義
Linux 報(bào)錯(cuò)代碼 139 通常表示應(yīng)用程序中的段錯(cuò)誤(Segmentation Fault),也就是程序試圖讀取或?qū)懭敕欠ǖ膬?nèi)存位置,導(dǎo)致程序崩潰。這個(gè)錯(cuò)誤碼還有其他的含義,比如在某些高級(jí)語(yǔ)言中,它可能表示運(yùn)行時(shí)錯(cuò)誤。
造成這個(gè)錯(cuò)誤的原因很多,可能是代碼中的指針錯(cuò)誤、數(shù)組越界、緩沖區(qū)溢出、堆棧溢出等。當(dāng)程序試圖訪問(wèn)無(wú)效的內(nèi)存地址時(shí),內(nèi)核會(huì)檢測(cè)到這個(gè)情況,并發(fā)送一個(gè)信號(hào)給應(yīng)用程序,告訴它出現(xiàn)了段錯(cuò)誤。然后應(yīng)用程序?qū)?huì)停止并退出。
常見(jiàn)的修復(fù)方法
雖然 Linux 報(bào)錯(cuò)代碼 139 可能是一個(gè)非常惱人的問(wèn)題,但是通常來(lái)說(shuō)這個(gè)問(wèn)題是可以解決的。下面我們提供一些常見(jiàn)的修復(fù)方法。
1. 檢查代碼
我們需要檢查應(yīng)用程序的代碼。如果應(yīng)用程序在使用指針時(shí)沒(méi)有正確檢查是否空,或者在使用數(shù)組時(shí)沒(méi)有檢查數(shù)組下標(biāo)是否越界,這可能會(huì)導(dǎo)致 Linux 報(bào)錯(cuò)代碼 139。因此,我們需要仔細(xì)檢查代碼并修復(fù)潛在的錯(cuò)誤。
2. 檢查系統(tǒng)庫(kù)
有時(shí)候,Linux 報(bào)錯(cuò)代碼 139 可能是由于系統(tǒng)庫(kù)中的錯(cuò)誤引起的。這時(shí)候,我們需要檢查系統(tǒng)庫(kù)是否正確安裝、更新和配置。如果系統(tǒng)庫(kù)存在問(wèn)題,可以嘗試重新安裝、更新或者更改配置來(lái)解決問(wèn)題。
3. 調(diào)試應(yīng)用程序
在調(diào)試應(yīng)用程序時(shí),我們可以使用 gdb 工具來(lái)了解程序在崩潰時(shí)發(fā)生了什么。通過(guò) gdb,我們可以查看程序狀態(tài)、變量值、堆棧信息等,找到導(dǎo)致 Linux 報(bào)錯(cuò)代碼 139 的根本原因,并嘗試解決它。
4. 優(yōu)化編譯器選項(xiàng)
有時(shí)候,使用不正確的編譯選項(xiàng)可能會(huì)導(dǎo)致 Linux 報(bào)錯(cuò)代碼 139。例如,過(guò)度優(yōu)化代碼可能會(huì)導(dǎo)致指針和數(shù)組訪問(wèn)錯(cuò)誤。因此,我們需要使用正確的編譯器選項(xiàng)來(lái)編譯應(yīng)用程序。
5. 使用內(nèi)存檢測(cè)工具
我們可以使用內(nèi)存檢測(cè)工具來(lái)幫助我們找到代碼中的內(nèi)存訪問(wèn)錯(cuò)誤。常見(jiàn)的工具包括 Valgrind、Memtest86 等。這些工具可以檢測(cè)內(nèi)存訪問(wèn)錯(cuò)誤,并幫助我們盡早發(fā)現(xiàn)和解決這些問(wèn)題。
Linux 報(bào)錯(cuò)代碼 139 可能是一個(gè)非常令人沮喪的問(wèn)題,但是通過(guò)一些簡(jiǎn)單的方法,我們可以找到并解決這些問(wèn)題。對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),請(qǐng)確保程序代碼沒(méi)有內(nèi)存訪問(wèn)錯(cuò)誤,并使用正確的編譯選項(xiàng)來(lái)編譯應(yīng)用程序。對(duì)于系統(tǒng)管理員來(lái)說(shuō),請(qǐng)確保系統(tǒng)庫(kù)正確安裝、更新和配置好,并使用內(nèi)存檢測(cè)工具來(lái)幫助找到和解決內(nèi)存訪問(wèn)錯(cuò)誤。通過(guò)這些方法,我們可以提高 Linux 系統(tǒng)的穩(wěn)定性和可靠性,為用戶提供更好的服務(wù)。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
關(guān)于Linux中禁用中斷和鎖定的關(guān)系問(wèn)題
禁用了中斷后就不會(huì)發(fā)生搶占了,搶占是通過(guò)中斷來(lái)實(shí)現(xiàn)的。
你可以參考一下
一個(gè)硬中斷的完整處理過(guò)程(2.4.24版本) CPU做的搜余工作:
CPU收到中斷/異常信號(hào);
CPU判斷當(dāng)前CPL級(jí)別如果等于3,則導(dǎo)致堆棧切換3->0,堆棧切換過(guò)程:
a. CPU從當(dāng)前TR指向的TSS中讀取SS0和ESP0;
b. CPU將當(dāng)前的【SS:ESP】寄存器內(nèi)容臨時(shí)保存起來(lái),假設(shè)為SSt和ESPt;
c. CPU將SS0和ESP0恢復(fù)到【SS:ESP】寄存器中;
d. CPU將在b中臨時(shí)保存的SSt和ESPt壓入當(dāng)前的堆?!維S:ESP】中世伏滾(其實(shí)就是SS0和ESP0);
CPU判斷當(dāng)前CPL級(jí)別如果等于0,則不會(huì)有2中的步驟;
CPU將EFLAGS、CS、EIP依次壓入當(dāng)前的堆?!維S:ESP】中;
如果當(dāng)前是異常,則CPU將異常碼error code壓入當(dāng)前的堆棧【SS:ESP】中,否則會(huì)省略該步驟;
對(duì)于中斷,CPU清零當(dāng)前EFLAGS->IF位,即關(guān)閉CPU中斷使能,對(duì)于異常,CPU則不會(huì)清零該位;
執(zhí)行對(duì)中斷/異常處理程序的調(diào)用;
注:對(duì)中斷/異常處理程序的要求,為了正常的從中斷/異常處理程序中返回,中斷/異常處理程序必須使用IRET指令返回,該指令會(huì)依次出棧EIP、CS和EFLAGS,比RET多一個(gè)EFLAGS,當(dāng)EFLAGS恢復(fù)后,由于原來(lái)保存時(shí)IF位為1,因廳歲此這里相當(dāng)于CPU中斷使能又打開(kāi)了;
Linux內(nèi)核做的工作:
1. 中斷向量表–>common_interrupt:
common_interrupt:
SAVE_ALL
pushl $ret_from_intr
SYMBOL_NAME_STR(call_do_IRQ):
jmp SYMBOL_NAME_STR(do_IRQ);
SAVE_ALL保存所有CPU沒(méi)有保存的寄存器,由于do_IRQ是函數(shù),這里直接調(diào)用jmp,(一般用call來(lái)調(diào)用函數(shù),call會(huì)導(dǎo)致pushEIP,但jmp不會(huì))這樣當(dāng)do_IRQ返回調(diào)用ret(ret相當(dāng)于popEIP)時(shí),會(huì)彈出棧中最后一個(gè)元素到EIP,很顯然這里就是ret_from_intr,也就是說(shuō),從do_IRQ中返回后,會(huì)跳轉(zhuǎn)到ret_from_intr處繼續(xù)執(zhí)行;
2. 來(lái)到do_IRQ:
a. 首先給硬中斷計(jì)數(shù)加1,irq_enter(cpu, irq)也就是:++local_irq_count(cpu);每進(jìn)入一個(gè)硬中斷處理函數(shù)前,local_irq_count(cpu)計(jì)數(shù)便被加1,處理完畢后減1;
b. 如果當(dāng)前設(shè)備中斷處理函數(shù)可以在中斷打開(kāi)的情況下運(yùn)行,則調(diào)用sti將EFLAGS.IF置位,打開(kāi)硬中斷使能;
c. 調(diào)用request_irq注冊(cè)的設(shè)備硬中斷處理函數(shù);
d. 無(wú)論EFLAGS.IF是否為0,都調(diào)用cli將EFLAGS.IF清零,將硬中斷使能關(guān)閉;
e. 給硬中斷計(jì)數(shù)減1,irq_enter(cpu, irq);該函數(shù)其實(shí)就是:–local_irq_count(cpu);
f. 如果此時(shí)有軟中斷需要運(yùn)行(如在前面的硬中斷處理函數(shù)中調(diào)用__cpu_raise_softirq),則進(jìn)入do_softirq中處理軟中斷,關(guān)于do_softirq中的處理步驟見(jiàn)3;
e. do_IRQ執(zhí)行ret,返回到ret_from_intr。
3. do_softirq:
a. 首先判斷當(dāng)前是否還有沒(méi)有處理完畢的硬中斷處理程序或軟中斷處理程序,如果有,則直接退出該函數(shù)。判斷方法見(jiàn)附注【文(6)】。
b.將軟中斷處理計(jì)數(shù)加1,local_bh_disable()也就是local_bh_count(cpu)++;每進(jìn)入do_softirq準(zhǔn)備進(jìn)行處理軟中斷前,local_bh_count(cpu)計(jì)數(shù)便被加1,軟中斷處理函數(shù)處理完畢后,在do_softirq返回前,將其值減1;
c. 無(wú)論EFLAGS.IF是否為0,都調(diào)用cli將EFLAGS.IF清零,將硬中斷使能關(guān)閉,處理些軟中斷標(biāo)志位的問(wèn)題,隨后調(diào)用sti將EFLAGS.IF置位,打開(kāi)硬中斷使能;
d. 執(zhí)行軟中斷處理函數(shù);
e. 調(diào)用cli將EFLAGS.IF清零,將硬中斷使能關(guān)閉,處理些軟中斷標(biāo)志位的問(wèn)題;
f. 將軟中斷處理計(jì)數(shù)減1,local_bh_enable()也就是local_bh_count(cpu)–;
g. 返回到2.e中;
4. ret_from_intr:
ENTRY(ret_from_intr)
GET_CURRENT(%ebx)
movl EFLAGS(%esp),%eax
movb CS(%esp),%al
testl $(VM_MASK | 3),%eax
jne ret_with_reschedule
jmp restore_all
在這段代碼中,通過(guò)”testl $(VM_MASK |3),%eax”檢測(cè)中斷前夕寄存器EFLAGS的高6位和代碼段寄存器CS的內(nèi)容,來(lái)判斷中斷前夕CPU是否運(yùn)行于VM86模式、用戶空間還是系統(tǒng)空間,對(duì)VM86這里不講了,但是我們知道CS更低兩位代表著中斷發(fā)生時(shí)CPU的運(yùn)行級(jí)別CPL,我們知道Linux只采用兩種運(yùn)行級(jí)別,系統(tǒng)為0,用戶為3,所以,如果CS的更低兩位為非0,那就說(shuō)明中斷發(fā)生于用戶空間。如果中斷發(fā)生于系統(tǒng)空間,控制就直接轉(zhuǎn)移到restore_all,而如果發(fā)生于用戶空間,則轉(zhuǎn)移到ret_with_reschedule。在restore_all中恢復(fù)1中保存的寄存器,隨后調(diào)用iret恢復(fù)EIP、CS、EFLAGS返回到中斷發(fā)生時(shí)的狀態(tài)。
5. ret_with_reschedule:
a. 如果發(fā)現(xiàn)當(dāng)前進(jìn)程的need_resched==1,則會(huì)調(diào)用schedule;
b. 如果發(fā)現(xiàn)還有待需要處理的軟中斷,則會(huì)調(diào)用do_softirq;
說(shuō)明:能夠走到ret_with_reschedule處,從4中可知,該中斷前一定位于用戶層,而且不可能有可中斷的硬中斷或軟中斷沒(méi)有執(zhí)行,也就是說(shuō)到達(dá)這里in_interrupt必然為0。為什么這里要說(shuō)不可能有可中斷的硬中斷或軟中斷沒(méi)有執(zhí)行呢?可中斷的硬中斷或軟中斷必然是被中斷或者異常所打斷的,當(dāng)后者處理完畢后,從4中可知,由于后者發(fā)生前位于內(nèi)核態(tài)(也就是可中斷的硬中斷或軟中斷處理過(guò)程中的那個(gè)點(diǎn)),故控制就直接轉(zhuǎn)移到restore_all,即返回到了可中斷的硬中斷或軟中斷被打斷時(shí)的那個(gè)點(diǎn),繼續(xù)處理完畢,可見(jiàn),到達(dá)這里,必然不存在可中斷的硬中斷或軟中斷未被執(zhí)行。
附注:關(guān)于in_interrupt宏,也就是(local_irq_count(__cpu) +local_bh_count(__cpu) !=0)。什么情況下會(huì)導(dǎo)致進(jìn)入do_softriq時(shí),in_interrupt不為0呢?之一種,如果當(dāng)前正在處理可中斷的硬中斷處理函數(shù),假設(shè)此時(shí)來(lái)了另一個(gè)通道的硬中斷,將導(dǎo)致當(dāng)前硬中斷處理函數(shù)被中斷,進(jìn)入do_IRQ,隨后處理新來(lái)的硬中斷處理函數(shù),當(dāng)處理完畢后,到達(dá)do_softirq,由2中可知,此時(shí)local_irq_count(__cpu)被原先的硬中斷加1,由于其還沒(méi)有處理完畢,故–local_irq_count(cpu)還沒(méi)來(lái)得及執(zhí)行,因此local_irq_count(__cpu)>0,也就是in_interrupt!=0;第二種,如果當(dāng)前正在do_softirq中處理軟中斷處理函數(shù),現(xiàn)在來(lái)了個(gè)硬中斷,將導(dǎo)致當(dāng)前硬中斷處理函數(shù)被中斷,進(jìn)入do_IRQ,隨后處理新來(lái)的硬中斷處理函數(shù),當(dāng)處理完畢后,又來(lái)帶到了do_softirq,由3中可知,此時(shí)local_bh_count(cpu)被前一個(gè)do_softirq加1了,但是由于其是中途被中斷的,故local_bh_count(cpu)–還沒(méi)來(lái)得及執(zhí)行,因此local_bh_count(__cpu)>0,也就是in_interrupt!=0;第三種就是綜合之一種和第二種兩種情況。
首先原子操作是通過(guò)local_irq_enable()這個(gè)宏來(lái)實(shí)現(xiàn),這個(gè)宏實(shí)現(xiàn)了硬件中斷和軟件中斷的屏蔽。這樣CPU就不能被軟件中斷,如線程搶占。而當(dāng)硬件中斷產(chǎn)生時(shí),會(huì)將其結(jié)果保存到中斷控制器的SRCPND(resource-pend)寄存器中,然后將SRCPND的內(nèi)容送去做中斷屏蔽檢測(cè),這一工作由設(shè)置MASK寄存器伏神手相應(yīng)的位完成缺嫌,如果全部屏蔽,硬件中斷就不會(huì)產(chǎn)生了。當(dāng)然了,每種處理瞎孝器都有自己的中斷處理方法,通常的流程是這樣。
關(guān)于linux error code 139的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)(cdcxhl.com)提供穩(wěn)定的云服務(wù)器,香港云服務(wù)器,BGP云服務(wù)器,雙線云服務(wù)器,高防云服務(wù)器,成都云服務(wù)器,服務(wù)器托管。精選鉅惠,歡迎咨詢:028-86922220。
文章題目:Linux報(bào)錯(cuò)代碼139解析與修復(fù)方法(linuxerrorcode139)
URL分享:http://fisionsoft.com.cn/article/cdihhcp.html


咨詢
建站咨詢
