abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 16:33 | Zajímavý software

    Sniffnet je multiplatformní aplikace pro sledování internetového provozu. Ke stažení pro Windows, macOS i Linux. Jedná se o open source software. Zdrojové kódy v programovacím jazyce Rust jsou k dispozici na GitHubu. Vývoj je finančně podporován NLnet Foundation.

    Ladislav Hagara | Komentářů: 0
    dnes 12:33 | Nová verze

    Byl vydán Debian Installer Trixie RC 2, tj. druhá RC verze instalátoru Debianu 13 s kódovým názvem Trixie.

    Ladislav Hagara | Komentářů: 0
    dnes 03:33 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za červen (YouTube).

    Ladislav Hagara | Komentářů: 0
    dnes 02:33 | Nová verze

    Libreboot (Wikipedie) – svobodný firmware nahrazující proprietární BIOSy, distribuce Corebootu s pravidly pro proprietární bloby – byl vydán ve verzi 25.06 "Luminous Lemon". Přidána byla podpora desek Acer Q45T-AM a Dell Precision T1700 SFF a MT. Současně byl ve verzi 25.06 "Onerous Olive" vydán také Canoeboot, tj. fork Librebootu s ještě přísnějšími pravidly.

    Ladislav Hagara | Komentářů: 0
    dnes 01:33 | Komunita

    Licence GNU GPLv3 o víkendu oslavila 18 let. Oficiálně vyšla 29. června 2007. Při té příležitosti Richard E. Fontana a Bradley M. Kuhn restartovali, oživili a znovu spustili projekt Copyleft-Next s cílem prodiskutovat a navrhnout novou licenci.

    Ladislav Hagara | Komentářů: 0
    včera 16:55 | Nová verze

    Svobodný nemocniční informační systém GNU Health Hospital Information System (HIS) (Wikipedie) byl vydán ve verzi 5.0 (Mastodon).

    Ladislav Hagara | Komentářů: 0
    včera 16:22 | Komunita

    Open source mapová a navigační aplikace OsmAnd (OpenStreetMap Automated Navigation Directions, Wikipedie, GitHub) oslavila 15 let.

    Ladislav Hagara | Komentářů: 0
    včera 11:55 | Zajímavý software

    Vývojář Spytihněv, autor počítačové hry Hrot (Wikipedie, ProtonDB), pracuje na nové hře Brno Transit. Jedná se o příběhový psychologický horor o strojvedoucím v zácviku, uvězněném v nejzatuchlejším metru východně od všeho, na čem záleží. Vydání je plánováno na čtvrté čtvrtletí letošního roku.

    Ladislav Hagara | Komentářů: 38
    1.7. 18:22 | IT novinky

    V uplynulých dnech byla v depu Českých drah v Brně-Maloměřicích úspěšně dokončena zástavba speciální antény satelitního internetu Starlink od společnosti SpaceX do jednotky InterPanter 660 004 Českých drah. Zástavbu provedla Škoda Group. Cestující se s InterPanterem, vybaveným vysokorychlostním satelitním internetem, setkají například na linkách Svitava Brno – Česká Třebová – Praha nebo Moravan Brno – Břeclav – Přerov – Olomouc.

    Ladislav Hagara | Komentářů: 21
    1.7. 13:11 | Nová verze

    Byla vydána nová verze 8.7.0 správce sbírky fotografií digiKam (Wikipedie). Přehled novinek i s náhledy v oficiálním oznámení (NEWS). Nejnovější digiKam je ke stažení také jako balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo ke spuštění a spustit.

    Ladislav Hagara | Komentářů: 0
    Jaký je váš oblíbený skriptovací jazyk?
     (59%)
     (28%)
     (7%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 344 hlasů
     Komentářů: 16, poslední 8.6. 21:05
    Rozcestník

    Pár tipů k callgrindu, debug symbolům, stack trace (C++)

    7.8.2009 01:33 | Přečteno: 1377× | programování | Výběrový blog

    Tipy pro přesnější použití valgrind/callgrind, manipulaci s debugovacími symboly a zjištění stack trace "zaživa".

    Callgrind - měření části kódu

    Nejjednodušší použití callgrindu je zavolat ho na celou binárku. Důležité je mít binárku přeloženu s debugovacími symboly (je možné kombinovat přepínače -Ox a -g u gcc). Budu používat cpuspinner.cpp jako příklad. Měření celého běhu programu:

    valgrind --tool=callgrind ./cpuspinner

    Když potřebujete změřit jenom část, zaincludujte valgrind/callgrind.h a můžete použít makra:

    Callgrind pak spustíme s parametrem --instr-atstart=no, aby neměřil dokud nenarazí na první z maker (viz příklad v cpuspinner.cpp):

    valgrind --tool=callgrind --instr-atstart=no ./cpuspinner

    V callgrind.h je vícero maker, kterými můžete ovládat měření a generování dat (lze "dumpnout" několik měření v jednom běhu apod.), viz manuál callgrindu. Makra z callgrind.h nědělají nic pokud program není spuštěn pod callgrindem.

    Callgrind - interaktivní ovládání

    K callgrindu je přibalen nástroj callgrind_control, kterým lze vypnout/zapnout instrumentaci k probíhajícímu měření. Hodí se to třeba k interaktivním GUI aplikacím. Spustíte valgrind s parametrem --instr-atstart=no, v momentě kdy chcete začít měřit, zavoláte

    callgrind_control -i on

    a pro vypnutí měření

    callgrind_control -i off

    "Přesýpání" debugovacích symbolů

    Když použijete přepínač -g u gcc, informace o debugovacích symbolech se nakonec dostanou do výsledné binárky (executable, shared object). Typicky se binárky před "releasem" strip-nou, čímž se debugovací informace zahodí.

    Jenže může se vyskytnout bug, který shodí aplikaci a není (jednoduše) replikovatelný. Můžete získat coredump, ten ale není bez debug symbolů přílíš užitečný. Je ovšem způsom jak zachovat debugovací symboly odděleně od binárek. Příklad s cpuspinner:

    objcopy --only-keep-debug cpuspinner cpuspinner.debug
    strip cpuspinner
    objcopy --add-gnu-debuglink=cpuspinner.debug cpuspinner
    

    Tyto tři příkazy nejprve vygenerují kopii debugovacích symbolů do souboru cpuspinner.debug. Pak se stripnou z původního cpuspinner a nakonec se do cpuspinner uloží odkaz, že debugovací symboly existují v souboru cpuspinner.debug. Gdb, jeho nadstavby a valgrind pak umí debug symboly najít v takhle vygenerovaných separátních debug souborech. (Pozn.: snad jednou se mi stalo, že je nějaký starší valgrind "neviděl"). Debugovací symboly lze někam odložit, kdyby se něco podobného muselo řešit. Velmi dobře se komprimují s LZMA kompresí.

    Zjištění stack trace za běhu

    Někdy může být užitečné zjistit stack trace za běhu, např. při logování výjimky, jak to umí Java nebo Python. V C++ to za jistých podmínek jde. Tady je jeden článek generování stack trace v C++, přímý odkaz na zdrojáky dbg::stack.

    Poznámka: aby dbg::stack fungoval, musíte svůj program přeložit s -rdynamic a nesmíte použít flag -fomit-frame-pointer. Funguje to i na x86_64, jenom je potřeba doplnit jeden ifdef do stack.cpp.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    17.8.2009 11:16 Ivan
    Rozbalit Rozbalit vše Dik za tip.

    Ahoj diky za tip. Ten dbg::stack vypada dobre. Taky jsem se o neco takovyho pokousel:

    Marka __HERE__ a __HERE__SHORT__ slouzi k identifikaci mista ve zdrojacich. Pouzivam to pri vyhazovani vyjimek. Mam vlastni typ pro vyjimku, ktera ma 1.  argument konstruktoru std::string.

    A  pouzivam to takhle:

    throw(OciException(__HERE__, "Not implemented yet\n"));

    --- snap ---

    #ifdef __GNUC__
            #define __HERE_SHORT__ ::std::string(((strrchr(__FILE__, '/') ?: __FILE__ - 1) + 1)) + ":"__HERE1__(__LINE__)
            #define __HERE__ ::trotl::str_backtrace() + __HERE3__(__LINE__, __FILE__)
            #define __HERE1__(x)   STR(x)"\t" + __PRETTY_FUNCTION__
            #define __HERE2__(x,y) ::std::string("("y":" STR(x)"(") +  __PRETTY_FUNCTION__ +")"
            #define __HERE3__(x,y) ::std::string("\n(") + __PRETTY_FUNCTION__ + ") " y ":" STR(x) + "\n"
            #define STR(a) #a
    #else

    ...

    inline ::std::string str_backtrace()
    {
             ::std::stringstream ret;
    #ifdef __GNUC__
            void *buffer[TROTL_BACKTRACE_DEPTH];

            int bsize = ::backtrace(buffer, TROTL_BACKTRACE_DEPTH);
            char **names = backtrace_symbols (buffer, bsize);
            for(int i=0; i<bsize; i++)
                    ret << names[i] << std::endl;
            free(names);
    #endif
            return ret.str();
    }

    --- snap ---

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.