Back to site

CodeViz - пакаленне граф выклікаў ўтыліта для C / C + +

Ідзіце прама, каб спампаваць

На пэўным этапе кар'еры ў праграмаванні кожнага, яны павінны будуць чытаць праз шмат кода, напісанага іншым праграмістам. Важнай часткай праграмы разумення будуе карціну таго, як праграма складаецца з высокага ўзроўню прагляду і граф выклікаў можа быць неацэнную дапамогу пры стварэнні гэтай piecture. Гэта асабліва карысна, калі арыгінальны праграміст выкарыстоўвае зразумелыя імёны функцыі.

Гэты праект дае магчымасць генерыраваць граф выклікаў на дапамогу задачу разумення кода. Ён выкарыстоўвае модульную мноства метадаў збору і можа быць адаптаваная для падтрымкі любога мовы, хоць толькі C і C + + у цяперашні час падтрымліваюцца. Кожная калекцыя метад мае свае перавагі і недахопы.


Call графік alloc_pages () у ядры Linux 1912/06/02-rc2
gengraph-F alloc_pages-D 5-трэ-S "buffered_rmqueue out_of_memory try_to_free_pages numa_node_id" я "cpuset_zone_allowed" - выхад-шрыфт Arial = - выхад тыпу = PNG
Ўстаноўка
tar -zxvf codeviz-1.0.3.tar.gz
cd codeviz-1.0.3
./configure && make && make install
Гэта дазволіць наладзіць codeviz для выкарыстання з выпраўленая вэрсія кампілятараў GCC 3.4.1 і ўсталяваць ўсе сцэнары. Дадатковыя залежнасці

Графах адлюстроўваюцца з выкарыстаннем кропка, якая з'яўляецца часткай праекта GraphViz. Усталюйце пакет для вашага дыстрыбутыва і атрымаць яго непасрэдна з наступных грубай спіс пакетаў, у Вас павінен быць усталяваны;
  • GraphViz (абавязкова). Спампаваць з http://www.graphviz.org/, калі яно не даступна на вашым дыстрыбутыве CD
  • Аб Mandrake, вам трэба ўсталяваць Perl-DB_File-1,806-1mdk пакет. Калі вы атрымліваеце памылкі, аб DB_File.pm неабходна эквівалентна пакет з вашага дыстрыбутыва

    Сцэнарыі
    genfull Выкарыстоўвайце гэта для стварэння поўнага графа выклікаў для праекта. Гэта будзе даволі вялікі і, верагодна, павінны быць pareed ўніз з gengraph. Нумар Дата збору метады даступныя, але cdepn па змаўчанні. Выканаць genfull - мужчына, каб атрымаць поўную старонку чалавек. Не трэба пакласці выхад full.graph праз кропку сябе як малаверагодна, каб быць вынесена на працягу разумнага перыяду часу
    gengraph Гэта створыць невялікі подграф і PostScript файл для дадзенага набору функцый. Выканаць gengraph - чалавек для падрабязнай інфармацыі

    Стварэнне cdepn Файлы для genfull
    Калі full.graph для крыніцы вы зацікаўлены ва ўжо створаны, вы можаце прапусціць гэты падзел. Паказаць /. Графаў, каб убачыць, калі full.graph даступная.

    Cobjdump і cppobjdump (для C і C + + адпаведна) будзе генерыраваць адэкватныя графаў выкліку, але інфармацыя трохі не хапае. Напрыклад, зыходны файл аб'яву функцыі невядома і макрасаў і ўбудаваных функцый будзе цалкам адсутнічае. У ідэальным выпадку cdepn метад павінен выкарыстоўвацца, але яна патрабуе выпраўленую версію GCC і G + + на працу. Патчы і некаторыя скрыпты даступныя ў кампілятарах / каталог. GCC 3.0.4 аўтаматычна загружаецца і заплаці для вас, як частка наладкі і зрабіць так, і калі калі вы выкарысталі, што прапусціць астатнюю частку гэтага раздзела, калі хочаце.

    Выпраўленую версію GCC і G + + выхадаў. Cdepn файлаў для кожнага C і C + + файл, скампіляваны. Гэта. Cdepn файл утрымоўвае інфармацыю, такую, як пры выкліку функцыі, дзе яны былі абвешчаныя і так далей. У версіях CodeViz да 1.0.3, тры версіі GCC пры падтрымцы: 2.95.4, 3.0.4 і 3.2.3. Для апошніх версій, толькі 3.4.1 падтрымліваецца, як яна павінна быць здольная скласці любога дадатку. Ён быў моцна пратэставаны з Linux Kernel так З падтрымка павінна быць тонкай. C + +, падтрымка таксама там, але не была выпрабаваная, як шырока. Справаздачы вітаюцца.

    У выпадку, калі вы не хочаце выкарыстоўваць скрыпт наладкі, гэта, як ўсталяваць кампілятар самастойна. Па-першае, крыніцай смалы павінен быць загружаны. Для тых, хто больш важныя справы, чым чытаць GCC Doc ўсталяваць, проста выканайце наступныя дзеянні

    cd compilers
    ncftpget ftp://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.1/gcc-3.4.1.tar.gz
    ./install_gcc-3.4.1.sh 
    
    Гэты сцэнар будзе распакуйце GCC, патч і ўсталяваць яе на пастаўляны шляху. Калі шлях не паказаны, ён будзе ўсталяваны ў $ HOME / GCC-графа. Я звычайна ўсталяваць яго ў / USR / мясцовыя / GCC-граф з

    ./install_gcc-3.4.1.sh /usr/local/gcc-graph
    
    Калі вы сур'ёзна жадаеце патч ўручную, толькі што прачытаў сцэнар, як яна праходзіць праз кожнага з крокаў па аднаму за раз.

    Пакуль мы будзем меркаваць, выпраўленую версію GCC і G + + цяпер у $ HOME / GCC-графік /. Большасць праектаў будзе выкарыстоўваць зменную CC для прыняцця рашэння, якую версію GCC для выкарыстання. Зручная спосаб выкарыстання прапатчыць адзін нешта накшталт

    make CC=$HOME/gcc-graph/bin/gcc CXX=$HOME/gcc-graph/bin/g++
    
    Ці, наадварот, наладзіць шлях, GCC-графік будзе паўстаць перад нармальнай GCC. Паколькі кожны зыходны файл кампілюецца, адпаведны файл cdepn будзе створана.

    У выпадку пабудовы ядра Linux, каманды будуць;

    make CC=$HOME/gcc-graph/bin/gcc bzImage
    make CC=$HOME/gcc-graph/bin/gcc modules
    
    Падобныя метады працы для іншых праектаў, мяркуючы, што Makefile выкарыстоўвае CC або CXX макрасы правільна пазначыць кампілятару выкарыстаць. Калі гэта Makefile ўласнага тыпу або не выкарыстоўваць належныя макрасы, вы, магчыма, прыйдзецца змяніць Makefile самастойна, альбо наладзіць шлях пакласці GCC-графа ў першую чаргу. Напрыклад, з Баш, наступным будзе працаваць.
    PATH=$HOME/gcc-graph/bin:$PATH
    
    Пры будаўніцтве, глядзець выснову кампілятара, каб пераканацца. Файлаў cdepn ствараюцца.

    Стварэнне nccout файлы для genfull
    Альтэрнатывай выкарыстанню выпраўленую версію GCC з'яўляецца выкарыстанне NCC (http://freshmeat.net/projects/ncc), які кампілятар C, спецыяльна прызначаныя для прагляду кода. Ён пастаўляецца са сваім уласным інструментам навігацыі і добра варта праверыць.

    CodeViz падтрымлівае NCC з CNCC метад збору (як cdepn прызначаны для выкарыстання з GCC) і падтрымлівае толькі C. Сапраўды вялікае справа адбываецца на NCC метад збору з'яўляецца тое, што ён можа прайсці паказальнікаў на функцыі. Калі вы загружае і ўсталёўваеце NCC, выкарыстанне CNCC метад збору, калі гэта C код і паказальнікі на функцыі з'яўляюцца агульнымі.

    Пасля NCC ўстаноўлена, у выпадку пабудовы ядра Linux, каманды будуць:
    make -i CC='ncc -ncoo -ncfabs' bzImage
    make -i CC='ncc -ncoo -ncfabs' modules
    find. -name \*.nccout | xargs cat > code.map.nccout
    
    Стварэнне full.graph
    Некаторыя full.graph файлы прадастаўляюцца з дзёгцю ў раздзеле "Загрузка". Калі вы хочаце не, чытайце далей.

    Каб стварыць full.graph, сцэнар genfull выкарыстоўваецца. Выканаць genfull - дапамагчы, каб убачыць усе варыянты, але прасцей за ўсё зрабіць, гэта запусціць сцэнарый без аргументаў у каталог верхняга ўзроўню крыніцы пасля кампіляцыі і файл full.graph будзе створаны ў каранёвай каталогу зыходнага ўзроўню.

    Хоць гэта павінна быць магчымым паставіць full.graph хоць кропка і паглядзець PostScript файл, мы рэкамендуем вам не паспрабаваць. Поўны графік надзвычай вялікае і наўрад ці можа быць аказана ў разумныя тэрміны. Адзін сапраўды павінны выкарыстоўваць gengraph праграма для стварэння менш графікі.

    Праблемы, якія могуць існаваць з full.graph
    У больш складаны код, full.graph не можа быць дасканалым. Напрыклад, там могуць быць канфлікты імёнаў, дзе ёсць дублікаты імёнаў функцый паміж модулямі або, калі ёсць некалькі файлаў складаецца, genfull не будзе адрозненні паміж імі. Калі вы думаеце, гэта будзе праблема, ёсць два кроку вы можаце зрабіць.

    Па-першае, параўнаць графік спароджаных cdepn з аднаго спароджаны cobjdump. Як cobjdump аналізуе двайковы, малаверагодна, граф не так, ён проста не будзе мець інфармацыю аб ўбудаваных функцый або макрасаў. З ядра Linux, гэты тэст будзе выглядаць прыкладна так
    genfull -g cobjdump -o full.graph-objdump
    genfull -g cdepn -o full.graph-cdepn
    gengraph -t -d 5 -g full.graph-objdump -f kswapd -o kswapd-objdump.ps
    gengraph -t -d 5 -g full.graph-cdepn -f kswapd -o kswapd-cdepn.ps
    
    Гэта створыць дзве full.graphs і дзве графы выклікаў функцыі kswapd (), які можна было б параўнаць, каб пераканацца, cdepn граф з'яўляецца дакладнай. Аналагічны метад можа быць выкарыстаны для іншых праектаў.

    Другая праблема, якая можа адбыцца дзе імёны функцый дублююцца паміж модулямі. У гэтым выпадку, лепшы курс дзеянні заключаецца ў выкарыстанні-х перайсці да genfull для абмежавання галіны дрэва разглядаюцца. Напрыклад, у ядры Linux ёсць alloc_pages () у мм / і драйверы / сімвал / DRM. Калі разглядаў В. М. адны і канфлікты імёнаў як чакаецца, будуць праблемы, genfull можа служыць
    genfull -s "mm include/linux drivers/block arch/i386"
    
    які будзе ахопліваць большасць функцый цікавасць. У іншых праектах, гэта будзе выпадак розных бібліятэк сутыкаюцца адзін з адным. Напрыклад, з AVIFile, genfull без аргументаў створыць жудасны беспарадак. Замест гэтага, S-перамыкач павінен быць выкарыстаны для стварэння full.graph для кожнай часткі праекта. Напрыклад, гулец будзе графічна з
    genfull -s "player" -o full.graph-player
    
    і кожны з бібліятэкі будзе графіцы асобна.

    Граф выклікаў генеравальная
    Сцэнар gengraph спараджае граф выклікаў для названай функцыі на аснове full.graph файл. gengraph - мужчына будзе прадастаўляць усю неабходную інфармацыю. Найбольш важным перайсці да ведама гэта-г, што вызначае, якой метад збору ў выкарыстанні. Як толькі скрыпт завяршае, PostScript файл будзе даступны, якія можна праглядаць з дапамогай любога PostScript гледача. Па змаўчанні, выхадны файл будзе functionname.ps

    Калі гэта займае шмат часу, каб генерыраваць граф, як правіла, добрая ідэя для першага мяжы гэта глыбіня на нешта разумнае з-D. Мы возьмем прыклад графічнага alloc_pages () з ядром 1920/04/02

    Крок 1: gengraph-F alloc_pages
    Вынік: прымаючы занадта доўга, націсніце Ctrl-C і абмежаваныя некаторыя разумныя глыбіню, каб атрымаць уяўленне аб тым, што адбываецца

    Крок 2: gengraph-D 10-F alloc_pages
    Вынік: Выхад граф масіўныя, у асноўным з ядром фондавых функцый не ўяўляе цікавасці. Выкарыстоўвайце-T перамыкач апусціць функцый, якія звычайна не ўяўляюць цікавасці. Для іншых праектаў, рэдагаваць gengraph сцэнар і перайсці да лініі "да поўдня generate_trimlist", гэтая функцыя мае спіс функцый "абразання" з-т перамыкач выкарыстоўваецца

    Крок 3: gengraph-Т-Д 10-F alloc_pages
    Вынік: Выхад граф яшчэ вялізны, але погляд на графік паказвае, што заклік "shrink_cache ()" вядзе да масіўнай ніжэй графік, што не выглядае як гэта напрамую звязана з размеркаваннем старонак. Давайце проста паказаць, што функцыі, але не перасякаць яго з S-перамыкач

    Крок 4: gengraph-Т-Д 10-S "shrink_cache"-F alloc_pages
    Вынік: Графік памер рэзка скарачаецца. Большасць з пакінутых граф складаецца з двух функцый "try_to_free_pages_zone ()" і "__free_pages_ok". Мы не прайсці try_to_free_pages_zone () і будзе ігнараваць __free_pages_ok () наогул з-я перамыкач

    Крок 5: gengraph-Т-Д 10-S "shrink_cache try_to_free_pages_zone" я "__free_pages_ok"-F alloc_pages
    Вынік: Perfect, паказвае добры графік, які выразна паказвае, якія важныя функцыі ў дачыненні толькі старонкі размеркавання. Пазней галін, якія не былі пройдзены у гэты графік можа быць графіцы асобна

    Сутнасць у тым, што першы графік, як правіла, занадта вялікі, і неабходна скараціць. Як параўнаць яго ўніз ў спалучэнні з вопытам код і здаровага сэнсу. Я лічу, гэта звычайна дапамагае толькі абмежаваць глыбіню спачатку 4 і пачаць ігнаруючы функцый, якія, відавочна, не актуальна і прайсці іх пазней. Калі лістынг асобных функцый апусціць не ваша рэч, выкарыстання - шоу-рэ ці - ігнараваць Re-выключальнікі, каб паказаць ці ігнараваць функцый на аснове рэгулярных выразаў.

    Дэман / Падтрымка кліентаў
    З вялікай графік уводу, доўгая аперацыя для пакалення граф выклікаў з'яўляецца чытанне ўваходнага файла. Для параўнання, для стварэння малых граф на машыне аўтараў, яна займае 4 секунды, каб чытаць уваходнага графа і 0,1 секунд для стварэння выхаднога файла. Для рашэння, гэта, gengraph можа працаваць як дэман, калі-Q (- дэман) ключ не паказаны. Выкарыстоўвайце-V, калі вы жадаеце ўбачыць, што ён робіць.
    gengraph -q -g /usr/src/linux-2.4.20-clean/full.graph
    
    Пры гэтым вяртаецца, запушчаны дэман. Каб стварыць графік, выкарыстоўваючы дэман, запусціце
    gengraph -q -t -d 2 -f alloc_pages
    
    Звярніце ўвагу на выкарыстанне Q-выключальнік, які кажа, што gengraph павінен працаваць у якасці кліента для дэмана экзэмпляра. Калі вам сумна, параўнаць розніцу ў кіраванні раз паміж нармальным gengraph і калі ён выкарыстоўваецца ў якасці кліента :-). Каб спыніць дэман, выканайце наступныя дзеянні
    echo QUIT > /tmp/codeviz.pipe
    
    і дэман будзе адключаны і ачысткі.

    Пасля апрацоўкі Функцыі
    Абодва genfull і gengraph падтрымку выкарыстання пост-procesing крокі. У цяперашні час два падтрымліваюцца. Першае выкарыстанне стэка на адной функцыі. Гэта x86 канкрэтных паколькі яна залежыць ад аб'ектных файлаў, незалежна ад спосабу збору выкарыстоўваецца. У асноўным гэта на карысць ядра Linux як звычайных прыкладанняў могуць пашырыць свой стэк і не трэба турбавацца аб выкарыстанне стэка больш. Другі модуль паказвае кумулятыўны выкарыстання ў gengraph паміж парамі функцый. Гэта вельмі зручна для дэманстрацыі выкарыстання паміж сістэмным выклікам і больш нізкага ўзроўню функцыі вызначыць месца, дзе стэк выкарыстоўваецца занадта шмат. Глядзіце дакументацыю для genfull і gengraph для атрымання дадатковай інфармацыі аб выкарыстанні пост-апрацоўкі. Стварэнне графікі для вэб
    Gengraph зараз падыходзіць для выкарыстання са скрыптамі CGI. Для стварэння GIF выхад замест Postfix, выкарыстоўвайце перамыкач-W. Як вы выбіраеце для рэалізацыі да сябе, але што я зрабіў наступнае

  • Ёсць CGI скрыпт выкліку gengraph для вываду GIF ў / TMP
  • У HTML, у <IMG SRC = http://www.csn.ul.ie/ ~ Мел / праекты / codeviz / / cgi-bin/readgif? Output.gif &gr; Дзе output.gif на самай справе некаторыя часовыя файлы ў / TMP створаныя сцэнарам CGI з унікальным імем і readgif гэта проста выкананы у якім гаворыцца GIF-файлы з / TMP і затым адлучаем іх.

    Існуе не дэма гэтага даступныя, таму што вэб-сервер у якім знаходзіцца гэты праект трохі загружаны. Хоць я мог бы запусціць дэма, мая папулярнасць б крыху Дент.

    Рознае Notes
    GCC 2.95.3, GCC 3.2.3, C + + і падтрымка зваротнага выкліку графы маюць * не * быць старанна пратэставаны. Даклады поспех або правал, асабліва з C + +, выкарыстоўваючы любы з метадаў збору цэняцца. GCC 3.2.3 не рэкамендуецца, калі вы сапраўды павінны выкарыстоўваць яго як будаваць і выпраўлення да яго трохі пластовае. Выкарыстоўвайце 3.0.4, калі няма уважлівай прычыны не рабіць гэтага.

    Памылак і зваротная сувязь
    Codeviz ў значнай ступені не суправаджаецца ў гэтыя дні, як гэта ў асноўным робіць тое, што мне трэба гэта рабіць. Калі ў вас ёсць канкрэтныя пытанні, звяртайцеся непасрэдна да мяне.

    Крэдыты
    Пераважная большасць гэтага быў рэалізаваны Мэла Горман (mel@csn.ul.ie). Аднак, змяненняў у GCC і арыгінальныя cdepn.pl, што гэты праект быў першапачаткова заснаваны на была напісана Марцінам дзевер (Devik) ( http://luxik.cdi.cz/ ~ devik ). З тых часоў яны змяніліся для падтрымкі іншых моў і быць больш гнуткімі, але арыгінальная ідэя была яго, дзякуючы Марцін. Заахвочванне і падштурхванні да падтрымкі НКК ласкава аўтар NCC Xanthakis Стелиос (sxanth@ceid.upatras.gr). Падтрымка GCC 3.3.2 і інструкцыі па ўстаноўцы крос-кампілятара былі прадастаўлены Джоэл Soete. Нарэшце, падтрымка GCC 3.4.6 была прадастаўлена Майкл Iatrou.

    Спампаваць
  • 1.0 Release
    codeviz-1.0.11.tar.gz
    codeviz-1.0.10.tar.gz
    codeviz-1.0.9.tar.gz
    codeviz-1.0.7.tar.gz
    codeviz-1.0.6.tar.gz
    codeviz-1.0.5.tar.gz
    codeviz-1.0.3.tar.gz
    codeviz-1.0.tar.gz


  • 1,0 рэлізу кандыдатамі
    codeviz-0.99d.tar.gz
    codeviz-0.99c.tar.gz
    codeviz-0.99b.tar.gz
    codeviz-0.99.tar.gz

  • Старыя версіі
    codeviz-0.24.tar.gz
    codeviz-0.23.tar.gz
    codeviz-0.22.tar.gz
    codeviz-0.21.tar.gz
    codeviz-0.20.tar.gz
    codeviz-0.19.tar.gz
    codeviz-0.18.tar.gz
    codeviz-0.17.tar.gz
    codeviz-0.16.tar.gz
    codeviz-0.15.tar.gz
    codeviz-0.14.tar.gz
    codeviz-0.13.tar.gz
    codeviz-0.12.tar.gz
    codeviz-0.11.tar.gz
    codeviz-0.10.tar.gz
    codeviz-0.9.tar.gz
    codeviz-0.8.tar.gz

  • Спрадвечных часоў версіі, калі быў CodeViz gengraph
    gengraph-0.7.tar.gz
    gengeaph-0.6 не быў вызвалены
    gengraph-0.5.tar.gz
    gengraph-0.4.tar.gz
    gengraph-0.3.tar.gz
    gengraph-0.2.tar.gz
  • Popular Links
    Published (Last edited): May 24 , source: http://www.csn.ul.ie/~mel/projects/codeviz/