Кіріспе

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

Ostream негізіндегі жөндеу шығару. Орындалу кезінде жөндеу ақпаратына қол жеткізу. Орындалу кезінде жадты бөлуді басқаруға қол жеткізу.

Қолдауы бар платформалар

Кітапхананың коды қатаң ISO C++ стандартына сәйкес болуға және мүмкіндігінше POSIX-ке ұйысуға тырысса да, 2- және 3-тармақтарға қол жеткізу үшін, қолданба жұмыс істейтін архитектураға тән, ерекше код қажет. Libcwd осы себепті тар архитектурамен шектеледі: оны GNU компиляторымен құрастыру қажет, объект коды 32 немесе 64 биттік ELF форматында болуы керек, ал компилятор жасаған қателік туралы ақпарат DWARF 2 форматында болуы тиіс. Libcwd-ді құрастыру нәтижесінде екі кітапхана пайда болады: біреуі жіптік қауіпсіз (libcwd r), екіншісі (libcwd) жіптік қолдаусыз. Жіптік қауіпсіз нұсқасы архитектураға қатысты тағы да көп мәліметтерге (атап айтқанда, GNU C кітапханасына) тәуелді. Нәтижесінде, толық функционалды libcwd негізінен Linux платформаларында дамыту үшін ғана қолайлы. Дегенмен, libcwd-ді жіптік қолдауды, жадты бөлуді жөндеуді және/немесе ELF және DWARF 2 қателік туралы ақпаратты оқуды тоқтатуға конфигурациялауға болады – осылайша тек ostream қателік шығаруын қолдау қалдырылады. Осылайша, қолданбаны Linux-та сенімді жұмыс істейтінше дамытуға болады, сондай-ақ толыққанды libcwd қол жетімді болмаса да, басқа (POSIX) платформаларда қателік шығаруын пайдалануға болады – егер бұл платформаларда қателік шығару үшін жіптік қауіпсіздік қажет болмаса: екі немесе одан көп жіп бірдей ostream-ге қателік шығаруын жазса, бір жолдың шығысы екінші жолдың ортасынан басталатын, жіптік қолдаусыз, түсініксіз нәтиже пайда болуы мүмкін.

Жөндеу ақпаратына жегу уақыты

Бұл ақпарат бастапқы файлды, жол нөмірін табу мүмкіндігін және функция атауларын қамтиды. Осының нәтижесінде, мысалы, белгілі бір функцияны кім шақырғанын көрсететін түзету шығысын жазуға немесе тіпті бұл функция күрделі үлгі болса да, ағымдағы функцияның атын басып шығаруға болады. Мысалы, PERSIST : PersistXML::serialize builtin<std::string>("M hostname", @0xbfc1f214) шақырылды.