ERROR::DWARF(7stap) ERROR::DWARF(7stap) JMENO error::dwarf - chyby v souvislosti s ladicimi informacemi formatu DWARF POPIS Systemtap nekdy spoleha na ladici informace k lokalizaci umisteni sond, nebo k lokalizaci umisteni zkoumanych (ci instrumentovanych) promennych, stejne jako to dela symbolicky debugger. Tyto ladici informace lze ziskat analyzou zdrojoveho kodu a prekladac je umi uchovavat v ramci formatu DWARF. Pokud systemtap ladici informace potrebuje, ale prekladac je neuchoval, dojde pri zpracovani skriptu k chybe behem procesni faze 2. Obvykle priciny tohoto typu chyb: verze prekladace Prekladace GCC 4.5 a starsi generovaly ladici informace omezene kvality. Vyvojarum bylo doporucovano sestavovat s pouzitim -O0 -g, tedy s vypnutim optimalizace. GCC 4.5 prineslo koncept "variable-tracking assignments", coz umoznuje generovat kvalitni ladici informace i s pouzitim optimalizaci -O2 -g. Neni to dokonale, ale jde o znacne zlepseni. Poznamenejme, ze chyba GCC PR51358 zpusobuje, ze ladici informace ziskane pri -O0 -g jsou ve skutecnosti horsi kvality, nez ladici informace vygenerovane s -O2 -g. Dalsim souvisejicim problemem je kvalita ladicich informaci pro oblast prologu (PR15123), kdy program sestaveny s CFLAGS=-mfentry (obvykle jadro, kvuli ftrace) poskytuje nedostatek presnych ladicich informaci v souvislosti se vstupem do funkce. To se tyka zejmena GCC verze 4.8 a starsi. Pokud je to mozne, kompilujte s -grecord-gcc-switches a spustte systemtap s $PR15123_ASSUME_MFENTRY=1. "inline" funkce Dokonce i moderni GCC ma problemy s parametry "inline" funkci. Muze byt nutne upravit systemtap skript a vlozit sondy na mirne odlisna mista. Zkuste pouzit sondu .statement() , namisto .function() , a pripadne ji posunte o nekolik radek nize smerem do tela "inline" funkce. Nebo zkuste vlozit sondu do mista volani "inline" funkce. Take je mozno vyuzit konstrukce if @defined($var) { ... } k overeni dostupnosti kontextove promenne pred jejim pouzitim. zamena poradi instrukci Optimalizovany kod casto zahrnuje smichani instrukci z ruznych zdroju. V takovem pripade muze byt nemozne umistit sondu na potrebne misto. To se tyka zejmena sond .statement vkladanych na dane cislo radku. Systemtap muze doporucit presunuti sondy na prilehly radek, ale ani to nemusi stacit. Zvazte zavedeni sondy na misto urcene zastupnym symbolem, nebo rozsahem radku. konfigurace elfutils Systemtap pouziva pro zpracovani ladicich informaci knihovnu elfutils. Je mozne, ze ladici informace jsou zdanlive dostupne, ale ne ve formatu prijatelnem pro nainstalovanou kopii elfutils. Napriklad lokalni GCC muze produkovat komprimovane ladici informace (.zdebug_* ELF sekce, nebo .xz soubory), zatimco nainstalovana kopie elfutils nema zapnute prislusne dekompresni schopnosti. Bohuzel neni snadne odhalit, zda toto je skutecne jadro problemu ktery se snazime vyresit. Pokud si sestavujete vlastni elfutils, ujistete se, ze vsechny dekompresni knihovny/hlavicky jsou v dobe prekladu dostupne. konfigurace ladicich informaci Nektere nastroje mohou generovat ladici informace v podobe nepouzitelne pro systemtap. Pricinou muze byt napriklad jaderna volba CONFIG_DEBUG_INFO_SPLIT (.dwo soubory). Dobrych vysledku se lze dosahnout pri pouziti obvykleho ELF/DWARF formatu (pripadne oddelenych ladicich informaci (stripped debuginfo) jak je obvykle v distribuci Fedora). ALTERNATIVY Pro snizeni zavislosti na ELF/DWARF ladicich informacich zvazte pouziti staticky zakompilovane instrumentace jako jsou sondazni body typu "tracepoint" pro jadro, nebo znacky pro uzivatelske programy. Jde o reseni s relativne nizkymi naklady na systemove zdroje (v pripade sdt.h, jedna NOP instrukce na znacku), pricemz dostupnost parametru/dat je temer garantovana. To vse bez zavislosti na ladicich informacich. VIZ TEZ stap(1), http://dwarfstd.org/, http://sourceware.org/systemtap/wiki/TipContextVariables, http://gcc.gnu.org/wiki/Var_Tracking_Assignments, warning::debuginfo(7stap), error::reporting(7stap) CHYBY Pouzijte projektovou bugzillu, nebo mailing list. http://sourceware.org/systemtap/, . error::reporting(7stap), https://sourceware.org/systemtap/wiki/HowToReportBugs ERROR::DWARF(7stap)