Libcwd - Libcwd

Libcwd - C ++ кітапханасы, жазылған Карло Вуд, қосу жұмыс уақыты түзету қолдау C ++ қосымшалар, атап айтқанда GNU Compiler коллекциясы. Кітапхана бағдарламаға қосатын функционалдылықты үш санатқа бөлуге болады:

  1. Ағымдағы -жөндеуге негізделген шығыс.
  2. Жөндеу туралы ақпаратқа жұмыс уақыты.
  3. Орындалу уақыты жадыны бөлу әкімшілік.

Қолдау көрсетілетін платформалар

Кітапхана кодының өзі қатаң болуға тырысады ISO C ++, және сәйкес келеді POSIX мүмкіндігінше 2 және 3 тармақтарына жету үшін қосымшада жұмыс істейтін архитектураға арнайы мамандандырылған код қажет. Libcwd осыған байланысты тар архитектурамен шектеледі: оны -мен құрастыру керек GNU компиляторы, және нысан кодының 32 немесе 64 бит болуын талап етеді ELF және компилятор күйге келтіру туралы ақпаратты жасады DWARF-2.

Libcwd нәтижесін екі кітапханаға жинақтау: біреуі жіптен қауіпсіз (libcwd_r) және нұсқа (libcwd) жіптің қолдауынсыз. Жіпке қауіпсіз нұсқасы архитектураның нақты бөлшектеріне байланысты (мысалы, GNU C кітапханасы). Нәтижесінде толық сипатталған libcwd негізінен тек әзірлеуге жарамды Linux платформалар.

Алайда, libcwd болуы мүмкін конфигурацияланған ағынды қолдауды, жадты бөлуді және / немесе ELF және DWARF-2 түзету ақпаратын оқуды жояды - тек ағынды ағынды шығару қолдауы қалғанға дейін. Осылайша, ол Linux-те қосымшаны мықты болғанша әзірлеуге қолдана алады және басқа платформаларда (POSIX) түзету нәтижесін береді, бірақ ол жерде толыққанды libcwd қол жетімді болмаса да, егер ешқандай қауіпсіздік қажет болмаса сол платформалардағы түзету шығысы үшін: екі немесе одан да көп ағындар бірдей ағынға жазуды шығаратын болса, бір жолдың шығысы екіншісінің ортасында басталып, жіптің тіреуінсіз басталатын шығынды тудыруы мүмкін.

Ostream негізінде түзету нәтижесі

Libcwd оңай кеңейтілетін бірнеше макростарды ұсынады, бұл пайдаланушыға негізінен ағынды сулармен жасай алатын кез-келген нәрсені жасауға мүмкіндік береді. Алайда, егер біреу тек түзету нәтижесін жазғысы келсе, онда екі макрос жеткілікті: Dout және DoutFatal. Соңғысы өлім ақауларын жою үшін қолданылуы керек, содан кейін қолданбаны тоқтату керек. Мысалға:

  егер (қате)    DoutFatal(dc::өлімге әкелетін, «Қалпына келтірілмейтін қате пайда болды.»);

Dout-тан айырмашылығы - қосымшаны түзету кодысыз құрастырған кезде Dout () макросы ешнәрсемен алмастырылмайды, ал DoutFatal () оның нәтижесін шығаратын және аяқтайтын кодпен ауыстырылады (қолданушы анықтай алатындай етіп).

Қарапайым түзету нәтижесі Dout көмегімен жазылады, келесідей:

  Даут(dc::ескерту, «шақырды» << орналасу_қ(CALL_ADDR));

мұнда екінші параметрде кез-келген типті немесе нысанды жөндеу шығыс ағынына жазуға '<<' рұқсат етілген (бұл жағдайда орналасу_ct).

'Dc :: fatal' және 'dc :: notice' - қосуға немесе өшіруге болатын «түзету арналары». Пайдаланушы күйге келтірудің кез-келген сандық арналарын жасай алады және қолдана алады әдепкі. Сонымен қатар, 'libcw_do' депкі ағынды әдепкі күйін келтіруден де көп нәрсе жасауға болады және осылайша шығуды бір емес бірнеше ағынға жазуға болады. Остримді бейнелейтін әрбір түзету нысанын өз кезегінде бөлек қосуға және өшіруге болады.

Жөндеу туралы ақпаратқа жұмыс уақыты

Бұл ақпарат бастапқы файлды және жол нөмірінің орналасуын және функция атауларын іздеу мүмкіндігін қамтиды. Нәтижесінде, мысалы, берілген функцияның кім қоңырау шалатындығын көрсететін күйін келтіру нәтижесін жазуға немесе ағымдағы функцияның атын шығаруға болады, тіпті егер бұл функция күрделі шаблон болса да. Мысалға,

 PERSIST: PersistXML :: serialize_builtin  («M_hostname», @ 0xbfc1f214) деп аталады.

Жадыны бөлу әкімшілігіне жұмыс уақыты

Libcwd жадыны бөлудің ішкі әкімшілігін жүргізеді. Осыған ұқсас нәрселерді жасауға мүмкіндік береді жадтың ағуы бөлінген жадтың шолуын тексеру, басып шығару (өте күшті түрде, кез-келген нәрсені сүзуге мүмкіндік береді: кітапхана атаулары үшін тұрақты өрнектер, функциялар атаулары (бөлінген немесе жоқ) және / немесе уақыт бөлінген уақыт аралығында).

Кітапхана сонымен қатар бірнеше рет жаһандық функцияларды ұсынады, оларды жөндеу құралы арқылы шақыруға болады gdb, әзірлеушіге берілген меңзердің қай бөліністе тұрғанын жылдам табуға мүмкіндік береді. Мысалға,

 (gdb) шақыру cwdebug_alloc (0x8a19450) 0x8a19450 0x8a19448 басталатын жадыны бөлу ішіндегі start: 0x8a19448 size: 12 type: char ** сипаттамасы: libcw_app_ct :: options_done_event жіберілген командалық жол аргументтерінің массиві. орналасуы: libcw_app.cc:304 функциясы: libcw_app_ct :: libcw_init (int, char * const *) кезде: 00: 31: 09.888760 (gdb) l libcw_app.cc:304

Сыртқы сілтемелер