<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: tools code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 16:04:18 GMT</pubDate>
    <description>DZone Snippets: tools code</description>
    <item>
      <title>Print call sequence of a C program</title>
      <link>http://snippets.dzone.com/posts/show/3593</link>
      <description>Perl script to run gdb and collect information about method call&lt;br /&gt;sequences. See also &lt;A href=http://debedb.blogspot.com/2007/02/poor-mans-tracepoints-and-call-sequence.html&gt;the blog entry&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/perl &lt;br /&gt;&lt;br /&gt;use FileHandle;&lt;br /&gt;use IPC::Open2;&lt;br /&gt;&lt;br /&gt;if (! (-e "tags")) {&lt;br /&gt;  print "Cannot find tags, will run\n";&lt;br /&gt;  $tagCmd = "ctags *.h *.c";&lt;br /&gt;  print "\t$tagCmd\n";&lt;br /&gt;  system($tagCmd) &amp;&amp; die ("Make sure ctags is installed\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;%breakId2Func = {};&lt;br /&gt;%func2Args = {};&lt;br /&gt;&lt;br /&gt;#if ($ARGV[0] eq "prepare") {&lt;br /&gt;#  exec('ctags *.h *.c');&lt;br /&gt;  $exec = $ARGV[0];&lt;br /&gt;  splice(@ARGV, 0, 1);&lt;br /&gt;  &lt;br /&gt;  $pid = open2(*Reader, *Writer, "gdb -annotate 3 --interpreter=mi $exec");&lt;br /&gt;&lt;br /&gt;  while (&lt;Reader&gt;) {&lt;br /&gt;    chop;&lt;br /&gt;    last if ($_ eq "(gdb) ") &lt;br /&gt;  }    &lt;br /&gt;  print Writer  "set print pretty on\n";&lt;br /&gt;  while (&lt;Reader&gt;) {&lt;br /&gt;    chop;&lt;br /&gt;    last if ($_ eq "(gdb) ") &lt;br /&gt;  }    &lt;br /&gt;&lt;br /&gt;  print Writer  "set print array on\n";&lt;br /&gt;  while (&lt;Reader&gt;) {&lt;br /&gt;    chop;&lt;br /&gt;    last if ($_ eq "(gdb) ") &lt;br /&gt;  }    &lt;br /&gt;  print Writer  "set print union on\n"; &lt;br /&gt;  while (&lt;Reader&gt;) {&lt;br /&gt;    chop;&lt;br /&gt;    last if ($_ eq "(gdb) ") &lt;br /&gt;  }    &lt;br /&gt;  &lt;br /&gt;  print "...\n";&lt;br /&gt;  open(GREP, 'grep "f$" ./tags|') || die "Do you have ctags?\n";&lt;br /&gt;  while (&lt;GREP&gt;) {&lt;br /&gt;    ($func, $file, $regexp, $f) = split(/\t+/);&lt;br /&gt;    $from = index($regexp, "(") + 1;&lt;br /&gt;    $to = rindex($regexp, ")");&lt;br /&gt;    $args = substr($regexp, $from, $to - $from);&lt;br /&gt;&lt;br /&gt;    print Writer  "break $func\n";&lt;br /&gt;    while (&lt;Reader&gt;) {&lt;br /&gt;      # Store the number of the breakpoint, we will&lt;br /&gt;       # need it later to determine when it's hit&lt;br /&gt;      chop;&lt;br /&gt;       if ($_ =~ /Breakpoint/) {&lt;br /&gt;	 $breakId = substr($_, length('~"Breakpoint '));&lt;br /&gt;         $breakId = substr($breakId, 0, index($breakId, " "));&lt;br /&gt;         $breakId2Func{$breakId} = $func;&lt;br /&gt;       } &lt;br /&gt;       last if $_ eq "(gdb) ";&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;    ##############################################################&lt;br /&gt;    # I wrote this when I didn't realize I can call "info args"&lt;br /&gt;    # But maybe saving this is still useful for more information&lt;br /&gt;    # like figuring out the type of variable and printing more&lt;br /&gt;    # info about it, in case it's some pointer to struct to whatever&lt;br /&gt;    #&lt;br /&gt;    # Save argument names for evaluation when breakpoint is hit    &lt;br /&gt;    # @args = split(/,/, $args );&lt;br /&gt;    #&lt;br /&gt;    # @$func = ();&lt;br /&gt;    # foreach $arg (@args) {&lt;br /&gt;    #  @typeAndVar = split(/\s+/,$arg);&lt;br /&gt;    #&lt;br /&gt;    #  $$func[++$#$func] = $typeAndVar[$#typeAndVar];&lt;br /&gt;    # }&lt;br /&gt;    #    $func2Args{$func} = \@$func;&lt;br /&gt;    #    *x = $func2Args{$func};&lt;br /&gt;    #    print "$func &gt; @x\n";&lt;br /&gt;    # }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;print "Calling run @ARGV\n";&lt;br /&gt;print Writer "run @ARGV\n";&lt;br /&gt;&lt;br /&gt;$inBreak = 0;&lt;br /&gt;while (&lt;Reader&gt;) {&lt;br /&gt;  chop;&lt;br /&gt;  if ($_ =~ /Breakpoint/) {&lt;br /&gt;    #      print "$_\n";&lt;br /&gt;    $breakId = substr($_, length('~"Breakpoint '));&lt;br /&gt;    $breakId = substr($breakId, 0, index($breakId, ","));&lt;br /&gt;    &lt;br /&gt;    $func = $breakId2Func{$breakId};&lt;br /&gt;    $inBreak = $breakId;&lt;br /&gt;    &lt;br /&gt;    # Which one is better?&lt;br /&gt;    print Writer "info args\n";&lt;br /&gt;    # print Writer "-stack-list-arguments 1 0 0\n";&lt;br /&gt;&lt;br /&gt;    print Writer "cont\n";&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  if ($inBreak) {&lt;br /&gt;    if ($_ =~ /~\"Continuing./) {&lt;br /&gt;      $inBreak = 0;&lt;br /&gt;      print "***************************\n";&lt;br /&gt;    } else {&lt;br /&gt;      if ($_ ne "(gdb) " &amp;&amp;&lt;br /&gt;	  $_ ne "^done" &amp;&amp;&lt;br /&gt;	  $_ ne '~"\n"' &amp;&amp;&lt;br /&gt;          $_ ne '&amp;"cont\n"' &amp;&amp;&lt;br /&gt;	 $_ !~ /stopped/) {&lt;br /&gt;&lt;br /&gt;	$_ =~ s/\\[nt]//g;&lt;br /&gt;	$_ =~ s/\\032//g;&lt;br /&gt;	$_ =~ s/^~\"//g;&lt;br /&gt;	print "$_\n";&lt;br /&gt;	&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 28 Feb 2007 01:59:15 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3593</guid>
      <author>debedb (http://www.hrum.org)</author>
    </item>
    <item>
      <title>diff</title>
      <link>http://snippets.dzone.com/posts/show/2684</link>
      <description>diff two directories&lt;br /&gt;&lt;code&gt;&lt;br /&gt;diff &lt;dir1&gt; &lt;dir2&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 23 Sep 2006 17:59:47 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2684</guid>
      <author>nevadalife (nevada)</author>
    </item>
    <item>
      <title>patching source</title>
      <link>http://snippets.dzone.com/posts/show/2682</link>
      <description>Making Patch -- to represent the addition of a new file, diff it against /dev/null. &lt;br /&gt;&lt;code&gt;&lt;br /&gt;diff -Naur test.old test.cpp &gt; test.patch&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Apply Patch&lt;br /&gt;&lt;code&gt;&lt;br /&gt;patch test.cpp test.patch&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Undo Patch &lt;br /&gt;&lt;code&gt;&lt;br /&gt;patch -R test.cpp test.patch&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 23 Sep 2006 17:55:42 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2682</guid>
      <author>nevadalife (nevada)</author>
    </item>
    <item>
      <title>Generate Tags for code navigation.</title>
      <link>http://snippets.dzone.com/posts/show/2679</link>
      <description>&lt;code&gt;&lt;br /&gt;ctags -R .*&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 23 Sep 2006 17:49:06 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2679</guid>
      <author>nevadalife (nevada)</author>
    </item>
    <item>
      <title>Syntax Highlighting with enscript</title>
      <link>http://snippets.dzone.com/posts/show/762</link>
      <description>&lt;code&gt;&lt;br /&gt;enscript --color --language=html -Eruby --output=dest.html file.rb&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You may need to obtain ruby.st for Ruby syntax highlighting:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ cd /usr/share/enscript/hl&lt;br /&gt;$ sudo curl -O http://java.thn.htu.se/~toor/blog-ng/wp-content/ruby.st&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Like any good UNIX program, you can also use pipes:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ find . -name '*.rb' | xargs cat | enscript --color --language=html -Eruby --output=-&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Sun, 25 Sep 2005 13:34:51 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/762</guid>
      <author>rtomayko (Ryan Tomayko)</author>
    </item>
  </channel>
</rss>
