Jump to content

Վրիպազերծում

Վիքիպեդիայից՝ ազատ հանրագիտարանից
Վրիպազերծում
Computer science term, type of activity Խմբագրել Wikidata
Ենթակատեգորիաtroubleshooting, ծրագրային ապահովման մշակում Խմբագրել Wikidata
Մասն էծրագրավորում Խմբագրել Wikidata

Վրիպազերծում (անգլ.՝ debugging), գործընթաց ճարտարագիտության մեջ, որի նպատակն է գտնել վրիպակների (բագերի) առաջացման արմատական պատճառը, մշակել դրանց շրջանցման ուղիներ և գտնել հնարավոր շտկումներ։

Ծրագրային ապահովման վրիպազերծման մեթոդները.

  • Ինտերակտիվ վրիպազերծում. այս մեթոդի միջոցով ծրագրավորողը փուլ առ փուլ հետևում է ծրագրի կատարմանը՝ քայլ առ քայլ գտնելով սխալի ճշգրիտ աղբյուրը։
  • Կառավարման հոսքի վերլուծություն. ուսումնասիրվում է ծրագրի հրահանգների կատարման հերթականությունը՝ տրամաբանական սխալները բացահայտելու համար։
  • Լոգ ֆայլերի վերլուծություն. վրիպազերծման այս ձևը ենթադրում է ծրագրի աշխատանքի մասին արձանագրված տվյալների (լոգերի) ուսումնասիրություն՝ սխալների և դրանց առաջացման պահի մասին տեղեկություն ստանալու համար։
  • Մոնիթորինգ (հսկողություն). սահմանվում է հսկողություն ծրագրի կամ ամբողջ համակարգի աշխատանքի նկատմամբ՝ դրանց վարքագիծը մանրամասն վերլուծելու համար։
  • Հիշողության արտագրում. վրիպազերծման այս գործիքը հնարավորություն է տալիս ուսումնասիրել ծրագրի հիշողության վիճակը կոնկրետ պահին՝ բացահայտելով հիշողության հետ կապված խնդիրները։
  • Կատարողականության վերլուծություն. այն գնահատում է ծրագրի արդյունավետությունը և կատարողականությունը՝ օգնելով գտնելու արագության հետ կապված խնդիրները կամ սխալները։

Շատ ծրագրավորման լեզուներ և ծրագրային գործիքներ առաջարկում են հատուկ ծրագրեր, որոնք ավտոմատացնում են վրիպազերծման գործընթացը. դրանք հայտնի են որպես վրիպազերծիչներ (դեբագերներ) (անգլ.՝ debuggers

Ստուգաբանություն

[խմբագրել | խմբագրել կոդը]
Mark II-ի համակարգչային գրանցամատյանի գրառումը, որի էջին կպցրած է ցեց։

«Բագ» (անգլ.՝ bug) տերմինը, որը նշանակում է թերություն, օգտագործվել է դեռևս 1878 թվականից, երբ Թոմաս Էդիսոնը իր գյուտերում հանդիպող «փոքրիկ թերությունները և դժվարությունները» անվանել է «բագեր»։

1940-ականներից հայտնի մի պատմություն է կապված ադմիրալ Գրեյս Հոփերի հետ[1]։ Նրա գործընկերները, աշխատելով Հարվարդի համալսարանի Mark II համակարգչի վրա, հայտնաբերել են, որ փոխանցատուփի մեջ մնացած ցեցը խոչընդոտում է համակարգչի աշխատանքին։ Նրանք գրքում գրել են. «Միջատի (անգլ.՝ bug) հայտնաբերման առաջին իրական դեպքը»։ Չնայած պատմությունը, հավանաբար, բառախաղ է եղել՝ համատեղելով «բագ» բառի երկու իմաստները (կենսաբանական և թերություն), այն ցույց է տալիս, որ այդ տերմինն արդեն օգտագործվել է համակարգչային ոլորտում։

Նման ձևով, վրիպազերծում տերմինը համակարգիչների աշխարհ մտնելուց առաջ օգտագործվել է ավիացիայում։ Երկրորդ համաշխարհային պատերազմի մանհեթենյան նախագծի տնօրեն Ռոբերտ Օփենհայմերը տերմինն օգտագործել է 1944 թվականի հոկտեմբերի 27-ին տեխնիկական անձնակազմ հավաքագրելու վերաբերյալ Էռնեստ Լոուրենսին ուղղված իր նամակում[2]։ Օքսֆորդի անգլերեն բառարանի համաձայն՝ «debugging» տերմինն օգտագործվել է օդանավի շարժիչների փորձարկումների վերաբերյալ 1945 թվականի մի հոդվածում, որը հրապարակվել է «Journal of the Royal Aeronautical Society»-ում։ «Airforce» ամսագրի 1945 թվականի հունիս ամսվա համարում խոսվել է օդանավի տեսախցիկների վրիպազերծման մասին։

Գիլլի 1951 թվականի հիմնարար հոդվածը[3] ծրագրավորման սխալների մասին առաջին խորը քննարկումն է, սակայն նա չի օգտագործել «բագ» կամ «վրիպազերծում» տերմինները։ Հաշվողական տեխնիկայի միության (անգլ.՝ ACM) թվային գրադարանում «debugging» տերմինն առաջին անգամ օգտագործվել է 1952 թվականի ACM-ի ազգային ժողովի երեք զեկույցներում[4][5][6]։ Այդ երեք զեկույցներից երկուսում տերմինն օգտագործվել է չակերտներում։

Մինչև 1963 թվականը «վրիպազերծում» տերմինն այնքան էր տարածվել, որ CTSS-ի ձեռնարկի առաջին էջում այն հիշատակվել է առանց բացատրության[7]։

Վրիպազերծման ընդլայնումը

[խմբագրել | խմբագրել կոդը]

Քանի որ ծրագրային ապահովման և էլեկտրոնային համակարգերի բարդությունը շարունակաբար աճել են, վրիպազերծման ավանդական մեթոդները համալրվել են նոր մոտեցումներով՝ հնարավորություն տալով ավելի լավ հայտնաբերելու անոմալիաները, գնահատելու դրանց ազդեցությունը և պլանավորելու ծրագրային թարմացումները։ Մասնագիտական շրջանակներում, «սխալ», «թերություն» կամ «բագ» բառերի փոխարեն, հաճախ օգտագործվում են ավելի չեզոք տերմիններ՝ «անոմալիա» կամ «անհամապատասխանություն»։ Սա օգնում է խուսափել այն ենթադրությունից, թե բոլոր թերությունները պարտադիր պետք է շտկվեն ցանկացած գնով։ Փոխարենը, կատարվում է ազդեցության գնահատում՝ որոշելու համար, թե արդյոք անսարքությունը վերացնելու համար կատարված փոփոխությունները տնտեսապես արդյունավետ կլինեն համակարգի համար, թե գուցե պլանավորված նոր թողարկումը դրանք անիմաստ կդարձնի։ Պարտադիր չէ, որ բոլոր խնդիրները լինեն անվտանգության կամ առաքելության համար կրիտիկական։ Կարևոր է նաև խուսափել այն իրավիճակից, երբ փոփոխությունը կարող է երկարաժամկետ կտրվածքով ավելի շատ խնդիրներ ստեղծել օգտատերերի համար, քան գոյություն ունեցող խնդիրը (երբ «բուժումն ավելի վատ է, քան հիվանդությունը»)։ Անոմալիաների ընդունելիության մասին որոշումները կարող են կանխել «զրոյական թերությունների» պարտադրանքի մշակույթը, որտեղ մարդիկ, ձգտելով զրոյական թերությունների, կարող են թաքցնել առկա խնդիրները։ Հաշվի առնելով կողմնակի խնդիրները, ինչպիսին է ծախս-օգուտ հարաբերության գնահատումը, վրիպազերծման ավելի լայն մեթոդները ընդլայնվում են՝ որոշելու համար անոմալիաների հաճախականությունը (որքան հաճախ են նույն «բագերը» հանդիպում)՝ օգնելով գնահատել դրանց ազդեցությունը ամբողջ համակարգի վրա։

Վիդեոխաղային կոնսոլների վրիպազերծումը սովորաբար կատարվում է հատուկ սարքաշարի միջոցով, ինչպիսին է այս Xbox-ի վրիպազերծման միավորը, որը նախատեսված է մշակողների համար։

Վրիպազերծման բարդությունը տատանվում է՝ սկսած պարզ սխալների շտկումից մինչև տվյալների հավաքագրման, վերլուծության և թարմացումների պլանավորման երկարատև ու ծանր աշխատանք։ Ծրագրավորողի հմտությունները կարող են կարևոր գործոն լինել խնդիրը վրիպազերծելու կարողության մեջ, սակայն ծրագրային ապահովման վրիպազերծման բարդությունը մեծապես կախված է համակարգի բարդությունից, ինչպես նաև օգտագործվող ծրագրավորման լեզուներից և հասանելի գործիքներից, ինչպիսիք են վրիպազերծիչները (անգլ.՝ debuggers)։ Վրիպազերծիչները ծրագրային գործիքներ են, որոնք ծրագրավորողին թույլ են տալիս վերահսկել ծրագրի կատարումը, դադարեցնել այն, վերագործարկել, սահմանել ընդհատման կետեր (անգլ.՝ breakpoints) և փոխել հիշողության արժեքները։ Վրիպազերծիչ տերմինը կարող է վերաբերել նաև այն մարդուն, ով զբաղվում է վրիպազերծմամբ։

Բարձր մակարդակի ծրագրավորման լեզուները, ինչպիսին է Java-ն, հիմնականում հեշտացնում են վրիպազերծումը, քանի որ դրանք ունեն այնպիսի գործառույթներ, ինչպիսիք են բացառությունների մշակումը և տիպերի ստուգումը, որոնք հեշտացնում են անկանոն վարքի իրական աղբյուրները գտնելը։ C կամ ասեմբլեր լեզուներում սխալները կարող են առաջացնել աննկատ խնդիրներ, օրինակ՝ հիշողության վնասում, և հաճախ դժվար է պարզել, թե որտեղ է սկզբնական խնդիրը առաջացել։ Նման դեպքերում անհրաժեշտ են լինում հիշողության վրիպազերծման գործիքներ։

Որոշ իրավիճակներում շատ օգտակար կարող են լինել հատուկ լեզվի համար նախատեսված ընդհանուր նշանակության ծրագրային գործիքները, որոնք կոչվում են ստատիկ կոդի վերլուծության գործիքներ։ Այս գործիքները կոդի մեջ փնտրում են հայտնի խնդիրների որոշակի հավաքածու՝ կենտրոնանալով ավելի շատ իմաստաբանության (սեմանտիկա) վրա (օրինակ՝ տվյալների հոսքի), քան շարահյուսության (սինտաքսի) վրա, ինչպես դա անում են կոմպիլյատորներն ու ինտերպրետատորները։

Գոյություն ունեն ինչպես վճարովի, այնպես էլ անվճար գործիքներ տարբեր լեզուների համար. որոշները պնդում են, որ կարող են հայտնաբերել հարյուրավոր տարբեր խնդիրներ։ Այս գործիքները չափազանց օգտակար են շատ մեծ կոդային համակարգերը ստուգելիս, երբ կոդը ձեռքով ստուգելն անիրատեսական է։ Բնորոշ օրինակ է այն խնդիրը, երբ փոփոխականը փորձում են օգտագործել նախքան նրան հայտարարելը։ Որոշ գործիքներ նաև կատարում են տիպերի խիստ ստուգում, նույնիսկ եթե լեզուն դա չի պահանջում։ Այդպիսով, դրանք ավելի լավ են գտնում այն կոդի հավանական սխալները, որոնք շարահյուսորեն ճիշտ են։ Սակայն այս գործիքները հայտնի են իրենց կեղծ դրական պատասխաններով, երբ ճիշտ կոդը նշվում է որպես կասկածելի։ Հին Unix lint ծրագիրը դրա վառ օրինակն է։

Էլեկտրոնային սարքավորումները (օրինակ՝ համակարգչի սարքախումբը), ինչպես նաև ցածր մակարդակի ծրագրային ապահովումը (օրինակ՝ BIOS-ը, սարքի դրայվերները) և միկրոծրագրերը վրիպազերծելու համար հաճախ օգտագործվում են այնպիսի սարքեր, ինչպիսիք են օսցիլոգրաֆները, լոգիկական անալիզատորները կամ շղթայական էմուլյատորները (անգլ.՝ ICE)՝ առանձին կամ համակցված։ ICE-ը կարող է կատարել ծրագրային վրիպազերծիչի բազմաթիվ բնորոշ խնդիրներ՝ ցածր մակարդակի ծրագրային ապահովման և միկրոծրագրերի վրա։

Վրիպազերծման գործընթացը

[խմբագրել | խմբագրել կոդը]

Վրիպազերծման գործընթացը սովորաբար սկսվում է խնդիրը վերարտադրելու քայլերի բացահայտումով։ Սա կարող է բարդ խնդիր լինել, հատկապես զուգահեռ պրոցեսների և որոշ անկայուն սխալների դեպքում։ Օգտագործողի ինտերֆեյսը և օգտագործման պատմությունը նույնպես կարող են դժվարացնել խնդրի վերարտադրումը։

Երբ սխալը կրկնվում է, ծրագրի ներմուծվող տվյալները կարելի է պարզեցնել՝ վրիպազերծումը հեշտացնելու համար։ Օրինակ՝ ենթադրենք՝ կոմպիլյատորում առկա սխալի պատճառով ծրագիրը խափանվում է մեծ ելակետային ֆայլը վերլուծելիս։ Այս դեպքում կարող եք պարզեցնել թեստային օրինակը՝ սկզբնական ֆայլի ընդամենը մի քանի տող թողնելով։ Հաճախ այդ մի քանի տողն իսկ բավարար է նույն խափանումը վերարտադրելու համար։ Պարզեցումը կարելի է անել ձեռքով՝ բաժանիր և տիրիր (անգլ.՝ divide-and-conquer) մեթոդի միջոցով, որի դեպքում ծրագրավորողը փորձում է հեռացնել սկզբնական թեստային օրինակի որոշ մասեր, այնուհետև ստուգում է՝ արդյոք խնդիրը դեռևս առկա է։ Գրաֆիկական ինտերֆեյսով (անգլ.՝ GUI) ծրագրեր վրիպազերծելիս ծրագրավորողը կարող է փորձել բաց թողնել օգտատիրոջ որոշակի գործողություններ՝ ստուգելու համար՝ արդյոք մնացած գործողությունները բավարար են սխալն առաջացնելու համար։

Երբ թեստային օրինակը բավարար չափով պարզեցված է, ծրագրավորողը կարող է օգտագործել վրիպազերծիչ գործիք՝ ծրագրի վիճակները (փոփոխականների արժեքները, ինչպես նաև կանչերի ստեկը) ուսումնասիրելու և խնդրի աղբյուրը գտնելու համար։ Որպես այլընտրանք կարելի է օգտագործել հետագծումը (անգլ.՝ tracing)։ Պարզ դեպքերում հետագծումը ընդամենը մի քանի տպող հրամանների հավաքածու է, որոնք ծրագրի կատարման ընթացքում որոշակի կետերում արտածում են փոփոխականների արժեքները։

  • Ինտերակտիվ վրիպազերծում․ այս մեթոդը օգտագործում է վրիպազերծիչ գործիքներ, որոնք թույլ են տալիս ծրագրի կատարումը կառավարել քայլ առ քայլ։ Ծրագիրը կարող է դադարեցվել ցանկացած պահի՝ նրա ներքին վիճակը (փոփոխականների արժեքները, կանչերի ստեկը) ստուգելու կամ փոփոխելու համար։ Ծրագրավորողը կարող է ընդհատման կետեր (անգլ.՝ breakpoints) սահմանել՝ ապահովելով կոդի արագ կատարումը մինչև կասկածելի հատվածը։ Լայնորեն օգտագործվում են նաև հետևման կետեր (անգլ.՝ watchpoints), որոնք ծրագրի կատարումը դադարեցնում են, երբ որոշակի փոփոխականի արժեքը փոխվում է, և բռնման կետեր (անգլ.՝ catchpoints), որոնք դադարեցնում են աշխատանքը որոշակի իրադարձությունների (օրինակ՝ բացառություններ, գրադարանների բեռնում) դեպքում։
  • Տպագրական վրիպազերծում կամ հետագծում (անգլ.՝ tracing)․ սա հիմնված է կոդում տեղադրված տպագրական հրամանների (օրինակ՝ C լեզվի printf ֆունկցիան) կամ մասնագիտացված գործիքների միջոցով ծրագրի կատարման հոսքը և տվյալների փոփոխությունը դիտարկելու վրա։ Այս մեթոդը հայտնի է նաև որպես printf վրիպազերծում։ Հետագծման հին տարբերակներից է TRON հրամանը BASIC լեզվում, որը նշանակում էր «Trace On» և ծրագրի աշխատանքի ընթացքում արտածում էր յուրաքանչյուր հրամանի տողի համարը։
  • Ակտիվության հետագծում (անգլ.՝ Activity tracing)․ այս մեթոդը, ի տարբերություն սովորական հետագծման, չի հետևում ծրագրի կատարմանը հրահանգ առ հրահանգ, այլ վերլուծում է պրոցեսորի կողմից որոշակի կոդային հատվածներում ծախսված ընդհանուր ժամանակը։ Եթե ծրագրի կատարման ժամանակի անհամաչափ մեծ մասը ծախսվում է հետագծվող հատվածում, դա կարող է վկայել ծրագրի տրամաբանական սխալի կամ պրոցեսորի ոչ արդյունավետ օգտագործման մասին, որը պահանջում է օպտիմալացում։
  • Հեռակա վրիպազերծում (անգլ.՝ Remote debugging)․ սա այն գործընթացն է, երբ ծրագրի վրիպազերծումն իրականացվում է մի համակարգի վրա, որը տարբերվում է վրիպազերծիչի համակարգից։ Վրիպազերծիչը միանում է հեռակա համակարգին տեղային ցանցի միջոցով և կարող է կառավարել ծրագրի կատարումը և ստանալ տեղեկություններ նրա վիճակի մասին։
  • Խափանումից հետո վրիպազերծում (անգլ.՝ Post-mortem debugging)․ սա ծրագրի վրիպազերծումն է՝ այն խափանվելուց հետո։ Այս տեխնիկաները ներառում են լոգ ֆայլերի ուսումնասիրումը, խափանման պահին կանչերի ստեկի դուրսբերումը[8] և խափանված պրոցեսի հիշողության արտագրման (անգլ.՝ memory dump) վերլուծությունը։ Պրոցեսի հիշողության արտագրումը կարող է ստացվել ավտոմատ կերպով՝ համակարգի կողմից, ծրագրավորողի կողմից տեղադրված հրահանգով կամ օգտատիրոջ կողմից՝ ձեռքով։
  • «Գայլի ցանկապատ» ալգորիթմ (անգլ.՝ Wolf fence algorithm)․ Էդվարդ Գաուսը այս պարզ և հայտնի ալգորիթմը նկարագրել է 1982 թվականին «Communications of the ACM» ամսագրում․ «Ալյասկայում կա մեկ գայլ. ինչպե՞ս գտնել նրան։ Սկզբում պետք է ցանկապատ կառուցել նահանգի մեջտեղով, սպասել, որ գայլը ոռնա, և որոշել, թե ցանկապատի որ կողմում է նա։ Այնուհետև գործընթացը կրկնել միայն այդ կողմում, մինչև որ կհասնեք այն կետին, որտեղ կկարողանաք տեսնել գայլին»[9]։ Այն հիմնված է «բաժանիր և տիրիր» սկզբունքի վրա։ Դրա օրինակ է Git տարբերակների կառավարման համակարգի git bisect հրամանը, որն օգտագործում է այս ալգորիթմը՝ պարզելու համար, թե որ փոփոխությունն է առաջացրել որոշակի սխալ։
  • Ձայնագրման և վերարտադրման վրիպազերծում (անգլ.՝ Record and replay debugging)․ այս տեխնիկան թույլ է տալիս ստեղծել ծրագրի կատարման ձայնագրություն, որը հետագայում կարելի է կրկնել և ինտերակտիվ վրիպազերծել։ Այն օգտակար է հեռակա, անկայուն և դժվարությամբ կրկնվող սխալների վրիպազերծման համար։
  • Ետադարձ վրիպազերծում (անգլ.՝ Time travel debugging)․ սա ծրագրի ելակետային կոդի միջով ժամանակի մեջ հետ քայլելու գործընթաց է՝ հասկանալու համար, թե ինչ է կատարվում ծրագրի կատարման ժամանակ։ Այն թույլ է տալիս օգտատիրոջը փոխել պատմությունը և դիտել, թե ինչպես է ծրագիրը արձագանքում[10]:p.123։
  • Դելտա վրիպազերծում (անգլ.՝ Delta Debugging)․ այս տեխնիկան ավտոմատացնում է թեստային օրինակների պարզեցման գործընթացը[10]:p.123։
  • Saff Squeeze․ այս տեխնիկան օգտագործում է թեստի մասերի աստիճանական ներդրում՝ սխալի տեղը մեկուսացնելու համար[11][12]։
  • Պատճառական շղթայի վրիպազերծում (անգլ.՝ Causality tracking)․ գոյություն ունեն տեխնիկաներ, որոնք թույլ են տալիս հետևել հաշվարկի մեջ պատճառ-հետևանքի շղթաներին[13]։ Այս տեխնիկաները կարող են հարմարեցվել որոշակի սխալների համար, ինչպիսիք են null ցուցիչի օգտագործումը[14]։

Ավտոմատ վրիպազերծում

[խմբագրել | խմբագրել կոդը]

Ավտոմատ վրիպազերծումը ծրագրային սխալները շտկելու գործընթաց է, որն իրականացվում է ավտոմատ կերպով՝ առանց մարդ-ծրագրավորողի միջամտության[15][16][17]։ Այս տեխնոլոգիան հայտնի է նաև որպես ավտոմատ կարկատանների ստեղծում կամ ծրագրի ավտոմատ վերանորոգում[17]։ Ավտոմատ վրիպազերծման հիմնական նպատակն է ինքնուրույն ստեղծել այնպիսի ճիշտ շտկումներ, որոնք կվերացնեն ծրագրային սխալները՝ միաժամանակ խուսափելով ծրագրային հետընթացից։ Այսինքն՝ նոր շտկումները չպետք է վնասեն ծրագրի առկա ֆունկցիոնալությունը[18]։

Վրիպազերծում ներդրված համակարգերի համար

[խմբագրել | խմբագրել կոդը]

Ի տարբերություն ընդհանուր նշանակության համակարգչային ծրագրային ապահովման նախագծման միջավայրի, ներդրված միջավայրերի հիմնական բնութագիրը մշակողների համար հասանելի տարբեր հարթակների (CPU ճարտարապետություններ, մատակարարներ, օպերացիոն համակարգեր և դրանց տարբերակներ) մեծ քանակն է: Ներդրված համակարգերը, ըստ սահմանման, ընդհանուր նշանակության նախագծեր չեն. դրանք սովորաբար մշակվում են մեկ խնդրի (կամ խնդիրների փոքր շրջանակի) համար, և հարթակը ընտրվում է հատուկ այդ ծրագիրը օպտիմալացնելու համար: Այս փաստը ոչ միայն դժվարացնում է ներդրված համակարգերի մշակողների կյանքը, այլև դժվարացնում է այդ համակարգերի վրիպազերծումն ու փորձարկումը, քանի որ տարբեր հարթակների համար անհրաժեշտ են տարբեր վրիպազերծման գործիքներ:

Չնայած վերը նշված տարասեռության մարտահրավերին, որոշ վրիպազերծիչներ մշակվել են ինչպես առևտրային, այնպես էլ հետազոտական նախատիպերի համար: Առևտրային լուծումների օրինակներ են Green Hills Software-ը,[19] Lauterbach GmbH-ն[20] և Microchip-ի MPLAB-ICD-ն (շղթայի մեջ վրիպազերծիչի համար): Հետազոտական նախատիպերի գործիքների երկու օրինակ են Aveksha-ն[21] և Flocklab-ը[22]: Դրանք բոլորն էլ օգտագործում են էժան ներկառուցված պրոցեսորների վրա հասանելի ֆունկցիոնալություն՝ On-Chip Debug Module (OCDM), որի ազդանշանները ներկայացվում են ստանդարտ JTAG ինտերֆեյսի միջոցով: Դրանք գնահատվում են՝ հիմնվելով այն բանի վրա, թե որքան փոփոխություն է անհրաժեշտ ծրագրում և որքան հաճախ են դրանք կարողանում համընթաց լինել իրադարձությունների հետ:

Համակարգում սխալները հայտնաբերելու բնորոշ առաջադրանքից բացի, ներդրված համակարգի կարգաբերումը նաև ձգտում է հավաքել համակարգի աշխատանքային վիճակների մասին տեղեկատվություն, որը կարող է օգտագործվել համակարգը վերլուծելու համար՝ գտնելու դրա կատարողականությունը բարձրացնելու կամ այլ կարևոր բնութագրերը (օրինակ՝ էներգիայի սպառումը, հուսալիությունը, իրական ժամանակի արձագանքը և այլն) օպտիմալացնելու եղանակներ։

Հակավրիպազերծում

[խմբագրել | խմբագրել կոդը]

Հակավրիպազերծումը (անգլ.՝ Anti-debugging) կոդի մեջ որոշակի տեխնիկաների ներդրումն է, որոնք խոչընդոտում են ծրագրային գործընթացի հակադարձ ճարտարագիտությանը կամ վրիպազերծմանը[23]։ Այս մեթոդը լայնորեն օգտագործվում է ճանաչված հրատարակիչների կողմից՝ ծրագրային ապահովումը կրկնօրինակումից պաշտպանելու համար, բայց նաև կիրառվում է վնասակար ծրագրերի (անգլ.՝ malware) կողմից՝ դրանց հայտնաբերումը և վերացումը բարդացնելու նպատակով[24]։

Հակավրիպազերծման տեխնիկաներ

  • API-ի վրա հիմնված. ստուգում է վրիպազերծիչի առկայությունը համակարգային տեղեկատվության միջոցով։
  • Բացառությունների վրա հիմնված. ստուգում է, թե արդյոք բացառությունների մշակման գործընթացը փոփոխվել է։
  • Պրոցեսների և հոսքերի բլոկներ. ստուգում է, թե արդյոք պրոցեսների և հոսքերի բլոկները փոփոխությունների են ենթարկվել։
  • Փոփոխված կոդ. ստուգում է, արդյոք կոդում փոփոխություններ են կատարվել ծրագրային ընդհատման կետերի միջոցով։
  • Սարքաշարի և ռեգիստրների վրա հիմնված. ստուգում է սարքաշարային ընդհատման կետերը և պրոցեսորի ռեգիստրները։
  • Ժամանակի և ուշացումների վերլուծություն. ստուգում է հրահանգների կատարման համար պահանջվող ժամանակը, քանի որ վրիպազերծման ժամանակ այդ գործընթացն ավելի դանդաղ է ընթանում։
  • Վրիպազերծիչի հայտնաբերում և պատժում. այս տեխնիկաները թույլ են տալիս ոչ միայն հայտնաբերել վրիպազերծիչի առկայությունը, այլև կիրառել որոշակի պատժիչ գործողություններ[24]։

Microsoft Word-ի վաղ տարբերակներում առկա էր հակավրիպազերծման գործառույթ, որը, վրիպազերծիչ հայտնաբերելու դեպքում, ցուցադրում էր հետևյալ հաղորդագրությունը. «Չարի ծառը դառը պտուղ է տալիս։ Հիմա ոչնչացնում եմ ծրագրի սկավառակը»։ Դրանից հետո ճկուն սկավառակի սարքը սկսում էր տագնապալի ձայներ արձակել՝ օգտատիրոջը երկրորդ անգամ նման փորձ անելուց հետ պահելու համար[25][26]։

Ծանոթագրություններ

[խմբագրել | խմբագրել կոդը]
  1. «InfoWorld Oct 5, 1981». 1981 թ․ հոկտեմբերի 5. Արխիվացված օրիգինալից 2019 թ․ սեպտեմբերի 18-ին. Վերցված է 2019 թ․ հուլիսի 17-ին.
  2. «Archived copy». Արխիվացված օրիգինալից 2019 թ․ նոյեմբերի 21-ին. Վերցված է 2019 թ․ դեկտեմբերի 17-ին.{{cite web}}: CS1 սպաս․ արխիվը պատճենվել է որպես վերնագիր (link)
  3. S. Gill, The Diagnosis of Mistakes in Programmes on the EDSAC Արխիվացված 2020-03-06 Wayback Machine, Proceedings of the Royal Society of London. Series A, Mathematical and Physical Sciences, Vol. 206, No. 1087 (May 22, 1951), pp. 538-554
  4. Robert V. D. Campbell, Evolution of automatic computation Արխիվացված 2019-09-18 Wayback Machine, Proceedings of the 1952 ACM national meeting (Pittsburgh), p 29-32, 1952.
  5. Alex Orden, Solution of systems of linear inequalities on a digital computer, Proceedings of the 1952 ACM national meeting (Pittsburgh), p. 91-95, 1952.
  6. Howard B. Demuth, John B. Jackson, Edmund Klein, N. Metropolis, Walter Orvedahl, James H. Richardson, MANIAC doi=10.1145/800259.808982, Proceedings of the 1952 ACM national meeting (Toronto), p. 13-16
  7. The Compatible Time-Sharing System Արխիվացված 2012-05-27 Wayback Machine, M.I.T. Press, 1963
  8. «Postmortem Debugging». Dr. Dobb's. Արխիվացված օրիգինալից 2019 թ․ դեկտեմբերի 17-ին. Վերցված է 2019 թ․ դեկտեմբերի 17-ին.
  9. E. J. Gauss (1982). «Pracniques: The 'Wolf Fence' Algorithm for Debugging». Communications of the ACM. 25 (11): 780. doi:10.1145/358690.358695. S2CID 672811.
  10. 10,0 10,1 Zeller, Andreas (2005). Why Programs Fail: A Guide to Systematic Debugging. Morgan Kaufmann. ISBN 1-55860-866-4.
  11. «Kent Beck, Hit 'em High, Hit 'em Low: Regression Testing and the Saff Squeeze». Արխիվացված է օրիգինալից 2012 թ․ մարտի 11-ին.
  12. Rainsberger, J.B. (2022 թ․ մարտի 28). «The Saff Squeeze». The Code Whisperer. Վերցված է 2022 թ․ մարտի 28-ին.
  13. Zeller, Andreas (2002 թ․ նոյեմբերի 1). «Isolating cause-effect chains from computer programs». ACM SIGSOFT Software Engineering Notes. 27 (6): 1–10. doi:10.1145/605466.605468. ISSN 0163-5948. S2CID 12098165.
  14. Bond, Michael D.; Nethercote, Nicholas; Kent, Stephen W.; Guyer, Samuel Z.; McKinley, Kathryn S. (2007). «Tracking bad apples». Proceedings of the 22nd annual ACM SIGPLAN conference on Object oriented programming systems and applications - OOPSLA '07. էջ 405. doi:10.1145/1297027.1297057. ISBN 9781595937865. S2CID 2832749.
  15. Rinard, Martin C. (2008-12). «Technical perspectivePatching program errors». Communications of the ACM (անգլերեն). 51 (12): 86–86. doi:10.1145/1409360.1409381. ISSN 0001-0782.
  16. Harman, Mark (2010-05). «Automated patching techniques: the fix is in: technical perspective». Communications of the ACM (անգլերեն). 53 (5): 108–108. doi:10.1145/1735223.1735248. ISSN 0001-0782.
  17. 17,0 17,1 Gazzola, Luca; Micucci, Daniela; Mariani, Leonardo (2019 թ․ հունվարի 1). «Automatic Software Repair: A Survey». IEEE Transactions on Software Engineering. 45 (1): 34–67. doi:10.1109/TSE.2017.2755013. ISSN 0098-5589.
  18. Tan, Shin Hwei; Roychoudhury, Abhik (2015-05). «relifix: Automated Repair of Software Regressions». IEEE: 471–482. doi:10.1109/ICSE.2015.65. ISBN 978-1-4799-1934-5. {{cite journal}}: Cite journal requires |journal= (օգնություն)
  19. «SuperTrace Probe hardware debugger». www.ghs.com. Արխիվացված օրիգինալից 2017 թ․ դեկտեմբերի 1-ին. Վերցված է 2017 թ․ նոյեմբերի 25-ին.
  20. «Debugger and real-time trace tools». www.lauterbach.com. Արխիվացված օրիգինալից 2022 թ․ հունվարի 25-ին. Վերցված է 2020 թ․ հունիսի 5-ին.
  21. Tancreti, Matthew; Hossain, Mohammad Sajjad; Bagchi, Saurabh; Raghunathan, Vijay (2011). «Aveksha». Proceedings of the 9th ACM Conference on Embedded Networked Sensor Systems. SenSys '11. New York, NY, USA: ACM. էջեր 288–301. doi:10.1145/2070942.2070972. ISBN 9781450307185. S2CID 14769602.
  22. Lim, Roman; Ferrari, Federico; Zimmerling, Marco; Walser, Christoph; Sommer, Philipp; Beutel, Jan (2013). «FlockLab». Proceedings of the 12th international conference on Information processing in sensor networks. IPSN '13. New York, NY, USA: ACM. էջեր 153–166. doi:10.1145/2461381.2461402. ISBN 9781450319591. S2CID 447045.
  23. Shields, Tyler (2008 թ․ դեկտեմբերի 2). «Anti-Debugging Series – Part I». Veracode. Արխիվացված օրիգինալից 2016 թ․ հոկտեմբերի 19-ին. Վերցված է 2009 թ․ մարտի 17-ին.
  24. 24,0 24,1 «Software Protection through Anti-Debugging Michael N Gagnon, Stephen Taylor, Anup Ghosh» (PDF). Արխիվացված է օրիգինալից (PDF) 2011 թ․ հոկտեմբերի 1-ին. Վերցված է 2010 թ․ հոկտեմբերի 25-ին.
  25. Ross J. Anderson (2001 թ․ մարտի 23). Security Engineering. Wiley. էջ 684. ISBN 0-471-38922-6.
  26. «Microsoft Word for DOS 1.15». Արխիվացված օրիգինալից 2013 թ․ մայիսի 14-ին. Վերցված է 2013 թ․ հունիսի 22-ին.

Գրականություն

[խմբագրել | խմբագրել կոդը]

Արտաքին հղումներ

[խմբագրել | խմբագրել կոդը]
Վիքիպահեստն ունի նյութեր, որոնք վերաբերում են «Վրիպազերծում» հոդվածին։