{"id":95,"date":"2005-07-22T16:04:56","date_gmt":"2005-07-22T22:04:56","guid":{"rendered":"\/?p=95"},"modified":"2006-05-18T10:45:49","modified_gmt":"2006-05-18T17:45:49","slug":"pretty-call-graphs-based-on-callret-monitor","status":"publish","type":"post","link":"https:\/\/multimedia.cx\/eggs\/pretty-call-graphs-based-on-callret-monitor\/","title":{"rendered":"Pretty Call Graphs Based On The call\/ret Monitor"},"content":{"rendered":"<p>Thanks for Benjamin Larsson for advising me on how to make a proper graph using <a href=\"http:\/\/www.graphviz.org\">Graphviz<\/a> (specify a graph of type &#8216;prof&#8217; vs. &#8216;unix&#8217;). Thus, here are some nice (and big) graphs based on the call\/ret experiment at this point:<\/p>\n<ul>\n<li><a href=\"\/eggs\/images\/dcng-wmv2init-callgraph.png\">wmv2init() callgraph<\/a><\/li>\n<li><a href=\"\/eggs\/images\/dcng-frame0-callgraph.png\">wmv2packet() frame #0 decode callgraph<\/a><\/li>\n<li><a href=\"\/eggs\/images\/dcng-frame18-callgraph.png\">wmv2packet() frame #18 decode callgraph<\/a><\/li>\n<\/ul>\n<p><a href=\"http:\/\/multimedia.cx\/eggs\/index.php?p=94\">See this post (&#8220;Refining The call\/ret Monitor&#8221;)<\/a> for details on how the graph data is generated.<\/p>\n<p>And as a bonus, I put the toolset to work analyzing Linspire&#8217;s WMV3\/WMV9 decoding module. Here are some call graphs (I used the teaser trailer from <em>Halo 2<\/em>, hence the &#8220;halo2&#8221; in the filenames):<\/p>\n<ul>\n<li><a href=\"\/eggs\/images\/halo2-wmv3init-callgraph.png\">wmv3init() callgraph<\/a>; I like the way the graph expresses countless functions invoking wmvMalloc() which simply calls malloc()<\/li>\n<li><a href=\"\/eggs\/images\/halo2-frame0-callgraph.png\">wmv3packet() frame #0 decode callgraph<\/a>; note that this is just a plain, black I-frame and does not exercise a lot of the logic in the module; let&#8217;s start small<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Got those graphs&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,4,12],"tags":[],"class_list":["post-95","post","type-post","status-publish","format-standard","hentry","category-callret-monitor","category-reverse-engineering","category-windows-media"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/posts\/95","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/comments?post=95"}],"version-history":[{"count":0,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/posts\/95\/revisions"}],"wp:attachment":[{"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/media?parent=95"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/categories?post=95"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/tags?post=95"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}