Kas ir segmentācijas kļūda?
Segmentācijas kļūda vai piekļuves pārkāpums ( segfault Īsāk sakot) ir kļūmes stāvoklis vai kļūme, ko izraisa aparatūra ar atmiņas aizsardzību, brīdinot operētājsistēmu, kuru programmatūra ir mēģinājusi piekļūt ierobežotai atmiņas zonai (atmiņas piekļuves pārkāpums).
Tā ir vispārēja aizsardzības defekta forma standarta x86 sistēmās. Atbildot uz to, operētājsistēmas kodols parasti ievieš dažas koriģējošas darbības, parasti nododot šo kļūdu pārkāpuma procesam, pārsūtot signālu uz procesu.
Dažos gadījumos procesi var instalēt signālu apdarinātāju, ļaujot tiem pašiem atkopties, taču citos gadījumos tiek izmantots operētājsistēmas noklusējuma signālu apstrādātājs, kas parasti noved pie procesa neparastas pārtraukšanas un dažkārt kodola izgāztuves.
- Segmentācijas kļūdas ir pamata kļūdu klase programmās, kas norādītas daudzās valodās, piemēram, C valoda, kas piedāvā piekļuvi zema līmeņa atmiņai un daži, lai zinātu drošības pārbaudes.
- Galvenokārt tās rodas daudzu kļūdu dēļ rādītājos, ko izmanto virtuālās atmiņas adresēšanai, īpaši nelegālai piekļuvei.
- Citi atmiņas piekļuves kļūdu veidi ir a autobusa kļūda , kas ietver arī vairākus iemeslus.
- Tie parādās galvenokārt neprecīzas fiziskās atmiņas adreses vai nepareizas piekļuves atmiņai dēļ.
- Šīs ir dažas atmiņas atsauces, kuras aparatūra nevar risināt, nevis atsauces, kurām process nav atļauts.
- Vairākas programmēšanas valodas var izmantot mehānismus, kas izveidoti, lai izvairītos no segmentācijas kļūmēm un attīstītu atmiņas drošību. Piemēram, uz Rūsa programmēšanas valoda izmanto īpašumtiesību modeli, lai nodrošinātu atmiņas drošību. Cita valoda kā Java un Lisp izmanto atkritumu savākšanu, kas ignorē daudzas atmiņas kļūdu klases, kas var izraisīt segmentācijas kļūdas.
Segmentācijas kļūdas pārskats
- Segmentācijas kļūda parādās, ja kāda programma mēģina piekļūt atmiņas vietai, kurai tai nav atļauts piekļūt, vai mēģina piekļūt atmiņas vietai tādā veidā, kas nav atļauts (piemēram, mēģinot rakstīt tikai lasāmā vietā vai pārrakstīt operētājsistēmas daļa).
- Datortehnikā vārds 'segmentācija' ir vairāki lietojumi. Segmentācijas kļūdas veidā, kas tiek lietots kopš 1950. gada, tas definē programmas adrešu telpu, tikai programmas adrešu telpa ir lasāma ar atmiņas aizsardzību, un no tā ir tikai steka un datu segmenta lasīšanas-rakstīšanas daļa. Programma ir rakstāma. Tādējādi, mēģinot lasīt ārpus programmas adrešu telpas vai rakstīt tikai lasāmajā adrešu telpas daļā, rodas segmentācijas kļūda.
- Segmentācijas kļūme parādās, ja aparatūra atrod mēģinājumu atsaukties uz neeksistējošu segmentu, atrašanās vietu ārpus segmenta robežām vai atrašanās vietu stilā, ko neatļauj segmentam piešķirtās atļaujas sistēmās, kas izmanto atmiņas segmentāciju aparatūra virtuālās atmiņas nodrošināšanai.
- Parasti nederīga lapas kļūda izraisa segmentācijas kļūdu sistēmās, kas izmanto tikai peidžeru. Lapas kļūdas un segmentācijas kļūdas ir kļūdas, kas rodas no virtuālās atmiņas pārvaldības sistēmas. Arī segmentācijas kļūda var rasties neatkarīgi no lapas defektiem; segmentācijas vaina ir nelikumīga piekļuve jebkurai derīgai lapai. Segmentācijas kļūda var parādīties lapas vidū. Iekšā a bufera pārplūde kas atrodas lapā, bet, piemēram, nelegāli pārraksta atmiņu.
- Sākotnēji vaina ir radusies no MMU ( atmiņas pārvaldības vienība ) par nelegālu piekļuvi, kā tās atmiņas aizsardzības aspekta segmentu vai nederīgu lapas kļūdu aparatūras līmenī. Ja problēma nav nederīga loģiskā adrese, bet gan nederīga fiziskā adrese, drīzāk rodas kopnes kļūda. Tātad tie ne vienmēr tiek atšķirti.
- Šī kļūme tiek atrasta un signāls tiek nosūtīts pārkāpuma procesam, ieslēdzot šī signāla procesa apstrādātāju operētājsistēmas līmenī. Dažādu veidu operētājsistēmām ir atšķirīgi signālu nosaukumi, kas norāda, ka ir radusies segmentācijas kļūda.
- Signāls, kas pazīstams kā SIGSEGV (saīsinājums no segmentācijas pārkāpums ) tiek pārnests uz pārkāpuma procesu Unix līdzīgajās operētājsistēmās. Pārkāpuma procesam tiek piemērots izņēmums, t.i., STATUS_ACCESS_VIOLATION operētājsistēmā Microsoft Windows.
Segmentācijas kļūmes cēloņi
Apstākļi, kādos parādās segmentācijas kļūda un kā tā izpaužas, ir raksturīgi operētājsistēmai un aparatūrai. Dažāda aparatūra rada dažādus traucējumus vairākiem apstākļiem, un dažādas operētājsistēmas tos pārveido dažādos signālos, kas tiek nosūtīti procesiem.
Gaidāmais iemesls var būt atmiņas piekļuves pārkāpums, lai gan galvenais iemesls ir dažu veidu programmatūras kļūda. Dažos gadījumos kļūdas atkļūdošana vai galvenā iemesla noteikšana var būt vienkārša, jo programma pastāvīgi novedīs pie segmentācijas kļūdas. Tomēr maisu var būt grūti reproducēt, un citos gadījumos tas var paļauties uz atmiņas sadalījumu katrā palaišanas reizē.
slēptās lietotnes šajā ierīcē
Tālāk ir minēti daži tipiski segmentācijas kļūdas cēloņi.
- Mēģinājums piekļūt neeksistējošai atmiņas adresei (ārēja procesa adrešu telpai)
- Mēģinot piekļūt atmiņai, programmai nav tiesību (piemēram, kodola struktūras procesa kontekstā)
- Mēģinājums ierakstīt tikai lasāmatmiņu (piemēram, koda segments )
- Savukārt tos bieži izraisa daudzas programmēšanas kļūdas, kas izraisa nederīgu piekļuvi atmiņai:
- Mēģinājums izpildīt programmu, kas netiek pareizi kompilēta. (Daži kompilatori radīs izpildāmu failu neatkarīgi no kompilēšanas laika kļūdu esamības.)
- Kaudzes pārplūde
- Bufera pārpilde
- Piešķiršana atbrīvotam rādītājam vai atsauces atcelšana uz to (a karājošs rādītājs , kas norāda atmiņu, kas ir izdzēsta/atdalīta/atbrīvota)
- Piešķiršana vai atsauces noņemšana uz an neinicializēts rādītājs (a savvaļas rādītājs , kas norāda nejaušu atmiņas adresi)
- Atsaucoties uz a nulles rādītājs parasti norāda adresi, kas neietilpst procesa adrešu telpā
Segmentācijas kļūdas bieži parādās rādītāja lietošanas kļūdu dēļ, īpaši in C dinamiskās atmiņas piešķiršana C kodā. Atsaucoties uz a nulles rādītājs , kas izraisa nenoteiktu uzvedību, novedīs pie segmentācijas kļūdas. Tas ir saistīts ar nulles rādītāju, kas nevar būt derīga atmiņas adrese. The karājas norādes un savvaļas norādes norāda uz atmiņu, kas var vai nevar pastāvēt un var būt vai nevar būt rakstāma vai lasāma, un tādējādi var rasties pārejošas kļūdas.
Atrisiniet segmentācijas kļūdu Ubuntu
Šī kļūda var rasties mūsu Ubuntu sistēmā jebkurā brīdī. Segmentācijas kļūda ir tad, kad mūsu sistēma mēģina piekļūt jebkurai atmiņas lapai, kas neeksistē. Kodols izmests nosaka, kad koda daļa mēģina veikt rakstīšanas un lasīšanas darbību brīvā vai tikai lasāmā vietā. Kopumā segfaults ir saistīti ar failu ar nosaukumu core un notiek jaunināšanas laikā.
Izpildot dažas komandas pamatsituācijas laikā, mēs varam saskarties ar 'Nevar atvērt bloķēšanas failu' kļūda. Tas ir saistīts ar to, ka sistēma mēģina noņemt bloku, kas neeksistē. Tas ir dažu konkrētu programmu bināro failu avārijas dēļ.
java ir nākamais
Mēs, iespējams, veicam atkļūdošanu vai atkāpšanos, lai to atrisinātu, taču risinājums ir salabot bojātās pakotnes, veicot dažas darbības, kas minētas šādi:
1. Noņemiet dažādās vietās pieejamos bloķēšanas failus.
$ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system
2. Repozitorija kešatmiņas noņemšana.
$ sudo apt-get clean all
3. Jauniniet un atjauniniet mūsu repozitorija kešatmiņu.
$ sudo apt-get update
$ sudo apt-get upgrade
4. Tagad jauniniet mūsu izplatīšanu, tas atjauninās mūsu pakotnes.
anotācijas pavasara zābakā
$ sudo apt-get dist-upgrade
5. Pārmeklējiet salauztos iepakojumus un izņemiet tos ar spēku.
$ sudo dpkg -1 | grep ^..r | apt-get purge
Lielisks veids, kas vienmēr darbosies, ir šāds, izņemot komandrindu:
Mūra mašīnas piemēri
- Startēšanas režīmā palaidiet Ubuntu, noklikšķinot uz Esc atslēga pēc atsāknēšanas.
- Izvēlieties ' Ubuntu papildu opcijas
- Atkopšanas režīmā palaidiet Ubuntu, un mums tiks pieminētas vairākas iespējas.
- Pirmkārt, izvēlieties 'Salūzušo iepakojumu labošana'
- Pēc tam izvēlieties 'Atsākt normālu sāknēšanu'
Tagad mums ir divi veidi, kā novērst segmentācijas kļūdu GUI un CLI. Dažreiz var arī gadīties, ka komanda, t.i., apt, nedarbojas, jo segfault , tāpēc CLI metode netiks ieviesta. Šādā situācijā neuztraucieties, jo GUI metode mums vienmēr noderēs.
Segmentācijas kļūdas apstrāde
Kopnes kļūdas vai segmentācijas kļūmes noklusējuma uzdevums ir neparasta procesa pārtraukšana, kurā tā radās. Var tikt izveidots pamatfails, lai palīdzētu atkļūdot, un var tikt īstenoti arī citi no platformas atkarīgi uzdevumi. Piemēram, daudzas Linux sistēmas, kas izmanto grsecurity ielāps varētu pieteikties SIGSEGV signāli lai uzraudzītu iespējamos ielaušanās mēģinājumus ar bufera pārpildīšanu.
Dažās sistēmās, piemēram, Windows un Linux, programma pati var pārvaldīt segmentācijas kļūdu. Darbojošā programma var ne tikai pārvaldīt notikumu, bet arī iegūt dažas detaļas par tā statusu, piemēram, procesora reģistra vērtības, steka izsekošanas iegūšana, avota koda rindiņa, kad tas tika atrasts, atmiņas adrese, kurai tika piekļūts nederīgi, un vai uzdevums bija rakstīšana vai lasīšana atkarībā no operētājsistēmas un arhitektūras.
Tomēr segmentācijas kļūme nosaka, ka programmā ir kļūda, kas jālabo, ir iespējams arī tīši izraisīt šādu kļūmi testēšanas, atkļūdošanas, kā arī platformu atdarināšanai, kurās nepieciešama tieša piekļuve atmiņai. Sistēmai jāspēj ļaut programmai izpildīt pat pēc kļūdas pēdējā gadījumā.
Šādā situācijā, kad sistēma atļauj, ir iespējams pārvaldīt notikumu un uzlabot procesora programmu pretrunā ar to 'lēkt' par neveiksmīgu norādījumu turpināt izpildi.
izveidot savienojumu ar datubāzi java
Segmentācijas kļūdu piemēri
Rakstīšana tikai lasāmajā atmiņā
Tas rada segmentācijas kļūdu. Tas parādās, kad programma ieraksta koda segmenta daļu vai tikai lasāmo datu segmenta daļu koda kļūdu līmeņos, jo tie tiek ielādēti, izmantojot operētājsistēmu, tikai lasāmajā atmiņā.
Nulles rādītāja atsauce
C un citās C formātā līdzīgās valodās nozīmei tiek izmantotas nulles norādes 'rādītājs uz nevienu objektu' un kā kļūdas indikators un atsauces atcelšana nulles rādītājā (rakstīšana vai lasīšana no nulles rādītāja) ir ļoti vienkārša programmas kļūda.
Standartā nav teikts, ka nulles rādītājs ir līdzīgs rādītājam uz 0 atmiņas adresi, lai gan tas tā varētu būt. Gandrīz visas operētājsistēmas kartē nulles rādītāja adresi tā, ka, izmantojot to, rodas segmentācijas kļūda.
Šo darbību negarantē neviens C standarts. Programmā C nulles rādītāja atsauces atcelšana ir nenoteikta uzvedība , un atbilstošai ieviešanai ir atļauts pieņemt, ka rādītājs, uz kuru ir noņemta atsauce, nav nulle.