Elliott Hughes | a0664b9 | 2017-04-18 17:46:52 -0700 | [diff] [blame] | 1 | <html> |
| 2 | <head> |
| 3 | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> |
| 4 | <title>2. Writing a New Valgrind Tool</title> |
| 5 | <link rel="stylesheet" type="text/css" href="vg_basic.css"> |
Elliott Hughes | ed39800 | 2017-06-21 14:41:24 -0700 | [diff] [blame] | 6 | <meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> |
Elliott Hughes | a0664b9 | 2017-04-18 17:46:52 -0700 | [diff] [blame] | 7 | <link rel="home" href="index.html" title="Valgrind Documentation"> |
| 8 | <link rel="up" href="tech-docs.html" title="Valgrind Technical Documentation"> |
| 9 | <link rel="prev" href="design-impl.html" title="1. The Design and Implementation of Valgrind"> |
| 10 | <link rel="next" href="cl-format.html" title="3. Callgrind Format Specification"> |
| 11 | </head> |
| 12 | <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> |
| 13 | <div><table class="nav" width="100%" cellspacing="3" cellpadding="3" border="0" summary="Navigation header"><tr> |
| 14 | <td width="22px" align="center" valign="middle"><a accesskey="p" href="design-impl.html"><img src="images/prev.png" width="18" height="21" border="0" alt="Prev"></a></td> |
| 15 | <td width="25px" align="center" valign="middle"><a accesskey="u" href="tech-docs.html"><img src="images/up.png" width="21" height="18" border="0" alt="Up"></a></td> |
| 16 | <td width="31px" align="center" valign="middle"><a accesskey="h" href="index.html"><img src="images/home.png" width="27" height="20" border="0" alt="Up"></a></td> |
| 17 | <th align="center" valign="middle">Valgrind Technical Documentation</th> |
| 18 | <td width="22px" align="center" valign="middle"><a accesskey="n" href="cl-format.html"><img src="images/next.png" width="18" height="21" border="0" alt="Next"></a></td> |
| 19 | </tr></table></div> |
| 20 | <div class="chapter"> |
| 21 | <div class="titlepage"><div><div><h1 class="title"> |
| 22 | <a name="manual-writing-tools"></a>2. Writing a New Valgrind Tool</h1></div></div></div> |
| 23 | <div class="toc"> |
| 24 | <p><b>Table of Contents</b></p> |
| 25 | <dl class="toc"> |
| 26 | <dt><span class="sect1"><a href="manual-writing-tools.html#manual-writing-tools.intro">2.1. Introduction</a></span></dt> |
| 27 | <dt><span class="sect1"><a href="manual-writing-tools.html#manual-writing-tools.writingatool">2.2. Basics</a></span></dt> |
| 28 | <dd><dl> |
| 29 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.howtoolswork">2.2.1. How tools work</a></span></dt> |
| 30 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.gettingcode">2.2.2. Getting the code</a></span></dt> |
| 31 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.gettingstarted">2.2.3. Getting started</a></span></dt> |
| 32 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.writingcode">2.2.4. Writing the code</a></span></dt> |
| 33 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.init">2.2.5. Initialisation</a></span></dt> |
| 34 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.instr">2.2.6. Instrumentation</a></span></dt> |
| 35 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.fini">2.2.7. Finalisation</a></span></dt> |
| 36 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.otherinfo">2.2.8. Other Important Information</a></span></dt> |
| 37 | </dl></dd> |
| 38 | <dt><span class="sect1"><a href="manual-writing-tools.html#manual-writing-tools.advtopics">2.3. Advanced Topics</a></span></dt> |
| 39 | <dd><dl> |
| 40 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.advice">2.3.1. Debugging Tips</a></span></dt> |
| 41 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.suppressions">2.3.2. Suppressions</a></span></dt> |
| 42 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.docs">2.3.3. Documentation</a></span></dt> |
| 43 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.regtests">2.3.4. Regression Tests</a></span></dt> |
| 44 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.profiling">2.3.5. Profiling</a></span></dt> |
| 45 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.mkhackery">2.3.6. Other Makefile Hackery</a></span></dt> |
| 46 | <dt><span class="sect2"><a href="manual-writing-tools.html#manual-writing-tools.ifacever">2.3.7. The Core/tool Interface</a></span></dt> |
| 47 | </dl></dd> |
| 48 | <dt><span class="sect1"><a href="manual-writing-tools.html#manual-writing-tools.finalwords">2.4. Final Words</a></span></dt> |
| 49 | </dl> |
| 50 | </div> |
| 51 | |
| 52 | So you want to write a Valgrind tool? Here are some instructions that may |
| 53 | help. |
| 54 | |
| 55 | <div class="sect1"> |
| 56 | <div class="titlepage"><div><div><h2 class="title" style="clear: both"> |
| 57 | <a name="manual-writing-tools.intro"></a>2.1. Introduction</h2></div></div></div> |
| 58 | <p>The key idea behind Valgrind's architecture is the division |
| 59 | between its <span class="emphasis"><em>core</em></span> and <span class="emphasis"><em>tools</em></span>.</p> |
| 60 | <p>The core provides the common low-level infrastructure to |
| 61 | support program instrumentation, including the JIT |
| 62 | compiler, low-level memory manager, signal handling and a |
| 63 | thread scheduler. It also provides certain services that |
| 64 | are useful to some but not all tools, such as support for error |
| 65 | recording, and support for replacing heap allocation functions such as |
| 66 | <code class="function">malloc</code>.</p> |
| 67 | <p>But the core leaves certain operations undefined, which |
| 68 | must be filled by tools. Most notably, tools define how program |
| 69 | code should be instrumented. They can also call certain |
| 70 | functions to indicate to the core that they would like to use |
| 71 | certain services, or be notified when certain interesting events |
| 72 | occur. But the core takes care of all the hard work.</p> |
| 73 | </div> |
| 74 | <div class="sect1"> |
| 75 | <div class="titlepage"><div><div><h2 class="title" style="clear: both"> |
| 76 | <a name="manual-writing-tools.writingatool"></a>2.2. Basics</h2></div></div></div> |
| 77 | <div class="sect2"> |
| 78 | <div class="titlepage"><div><div><h3 class="title"> |
| 79 | <a name="manual-writing-tools.howtoolswork"></a>2.2.1. How tools work</h3></div></div></div> |
| 80 | <p>Tools must define various functions for instrumenting programs |
| 81 | that are called by Valgrind's core. They are then linked against |
| 82 | Valgrind's core to define a complete Valgrind tool which will be used |
| 83 | when the <code class="option">--tool</code> option is used to select it.</p> |
| 84 | </div> |
| 85 | <div class="sect2"> |
| 86 | <div class="titlepage"><div><div><h3 class="title"> |
| 87 | <a name="manual-writing-tools.gettingcode"></a>2.2.2. Getting the code</h3></div></div></div> |
| 88 | <p>To write your own tool, you'll need the Valgrind source code. You'll |
| 89 | need a check-out of the Subversion repository for the automake/autoconf |
| 90 | build instructions to work. See the information about how to do check-out |
| 91 | from the repository at <a class="ulink" href="http://www.valgrind.org/downloads/repository.html" target="_top">the Valgrind |
| 92 | website</a>.</p> |
| 93 | </div> |
| 94 | <div class="sect2"> |
| 95 | <div class="titlepage"><div><div><h3 class="title"> |
| 96 | <a name="manual-writing-tools.gettingstarted"></a>2.2.3. Getting started</h3></div></div></div> |
| 97 | <p>Valgrind uses GNU <code class="computeroutput">automake</code> and |
| 98 | <code class="computeroutput">autoconf</code> for the creation of Makefiles |
| 99 | and configuration. But don't worry, these instructions should be enough |
| 100 | to get you started even if you know nothing about those tools.</p> |
| 101 | <p>In what follows, all filenames are relative to Valgrind's |
| 102 | top-level directory <code class="computeroutput">valgrind/</code>.</p> |
| 103 | <div class="orderedlist"><ol class="orderedlist" type="1"> |
| 104 | <li class="listitem"><p>Choose a name for the tool, and a two-letter abbreviation that can |
| 105 | be used as a short prefix. We'll use |
| 106 | <code class="computeroutput">foobar</code> and |
| 107 | <code class="computeroutput">fb</code> as an example.</p></li> |
| 108 | <li class="listitem"><p>Make three new directories <code class="filename">foobar/</code>, |
| 109 | <code class="filename">foobar/docs/</code> and |
| 110 | <code class="filename">foobar/tests/</code>. |
| 111 | </p></li> |
| 112 | <li class="listitem"><p>Create an empty file <code class="filename">foobar/tests/Makefile.am</code>. |
| 113 | </p></li> |
| 114 | <li class="listitem"><p>Copy <code class="filename">none/Makefile.am</code> into |
| 115 | <code class="filename">foobar/</code>. Edit it by replacing all |
| 116 | occurrences of the strings |
| 117 | <code class="computeroutput">"none"</code>, |
| 118 | <code class="computeroutput">"nl_"</code> and |
| 119 | <code class="computeroutput">"nl-"</code> with |
| 120 | <code class="computeroutput">"foobar"</code>, |
| 121 | <code class="computeroutput">"fb_"</code> and |
| 122 | <code class="computeroutput">"fb-"</code> respectively.</p></li> |
| 123 | <li class="listitem"><p>Copy <code class="filename">none/nl_main.c</code> into |
| 124 | <code class="computeroutput">foobar/</code>, renaming it as |
| 125 | <code class="filename">fb_main.c</code>. Edit it by changing the |
| 126 | <code class="computeroutput">details</code> lines in |
| 127 | <code class="function">nl_pre_clo_init</code> to something appropriate for the |
| 128 | tool. These fields are used in the startup message, except for |
| 129 | <code class="computeroutput">bug_reports_to</code> which is used if a |
| 130 | tool assertion fails. Also, replace the string |
| 131 | <code class="computeroutput">"nl_"</code> throughout with |
| 132 | <code class="computeroutput">"fb_"</code> again.</p></li> |
| 133 | <li class="listitem"><p>Edit <code class="filename">Makefile.am</code>, adding the new directory |
| 134 | <code class="filename">foobar</code> to the |
| 135 | <code class="computeroutput">TOOLS</code> or |
| 136 | <code class="computeroutput">EXP_TOOLS</code> variables.</p></li> |
| 137 | <li class="listitem"><p>Edit <code class="filename">configure.in</code>, adding |
| 138 | <code class="filename">foobar/Makefile</code> and |
| 139 | <code class="filename">foobar/tests/Makefile</code> to the |
| 140 | <code class="computeroutput">AC_OUTPUT</code> list.</p></li> |
| 141 | <li class="listitem"> |
| 142 | <p>Run:</p> |
| 143 | <pre class="programlisting"> |
| 144 | autogen.sh |
| 145 | ./configure --prefix=`pwd`/inst |
| 146 | make |
| 147 | make install</pre> |
| 148 | <p>It should automake, configure and compile without errors, |
| 149 | putting copies of the tool in |
| 150 | <code class="filename">foobar/</code> and |
| 151 | <code class="filename">inst/lib/valgrind/</code>.</p> |
| 152 | </li> |
| 153 | <li class="listitem"> |
| 154 | <p>You can test it with a command like:</p> |
| 155 | <pre class="programlisting"> |
| 156 | inst/bin/valgrind --tool=foobar date</pre> |
| 157 | <p>(almost any program should work; |
| 158 | <code class="computeroutput">date</code> is just an example). |
| 159 | The output should be something like this:</p> |
| 160 | <pre class="programlisting"> |
| 161 | ==738== foobar-0.0.1, a foobarring tool. |
Elliott Hughes | ed39800 | 2017-06-21 14:41:24 -0700 | [diff] [blame] | 162 | ==738== Copyright (C) 2002-2017, and GNU GPL'd, by J. Programmer. |
| 163 | ==738== Using Valgrind-3.13.0.SVN and LibVEX; rerun with -h for copyright info |
Elliott Hughes | a0664b9 | 2017-04-18 17:46:52 -0700 | [diff] [blame] | 164 | ==738== Command: date |
| 165 | ==738== |
| 166 | Tue Nov 27 12:40:49 EST 2007 |
| 167 | ==738==</pre> |
| 168 | <p>The tool does nothing except run the program uninstrumented.</p> |
| 169 | </li> |
| 170 | </ol></div> |
| 171 | <p>These steps don't have to be followed exactly -- you can choose |
| 172 | different names for your source files, and use a different |
| 173 | <code class="option">--prefix</code> for |
| 174 | <code class="computeroutput">./configure</code>.</p> |
| 175 | <p>Now that we've setup, built and tested the simplest possible tool, |
| 176 | onto the interesting stuff...</p> |
| 177 | </div> |
| 178 | <div class="sect2"> |
| 179 | <div class="titlepage"><div><div><h3 class="title"> |
| 180 | <a name="manual-writing-tools.writingcode"></a>2.2.4. Writing the code</h3></div></div></div> |
| 181 | <p>A tool must define at least these four functions:</p> |
| 182 | <pre class="programlisting"> |
| 183 | pre_clo_init() |
| 184 | post_clo_init() |
| 185 | instrument() |
| 186 | fini()</pre> |
| 187 | <p>The names can be different to the above, but these are the usual |
| 188 | names. The first one is registered using the macro |
| 189 | <code class="computeroutput">VG_DETERMINE_INTERFACE_VERSION</code>. |
| 190 | The last three are registered using the |
| 191 | <code class="computeroutput">VG_(basic_tool_funcs)</code> function.</p> |
| 192 | <p>In addition, if a tool wants to use some of the optional services |
| 193 | provided by the core, it may have to define other functions and tell the |
| 194 | core about them.</p> |
| 195 | </div> |
| 196 | <div class="sect2"> |
| 197 | <div class="titlepage"><div><div><h3 class="title"> |
| 198 | <a name="manual-writing-tools.init"></a>2.2.5. Initialisation</h3></div></div></div> |
| 199 | <p>Most of the initialisation should be done in |
| 200 | <code class="function">pre_clo_init</code>. Only use |
| 201 | <code class="function">post_clo_init</code> if a tool provides command line |
| 202 | options and must do some initialisation after option processing takes |
| 203 | place (<code class="computeroutput">"clo"</code> stands for "command line |
| 204 | options").</p> |
| 205 | <p>First of all, various "details" need to be set for a tool, using |
| 206 | the functions <code class="function">VG_(details_*)</code>. Some are all |
| 207 | compulsory, some aren't. Some are used when constructing the startup |
| 208 | message, <code class="computeroutput">detail_bug_reports_to</code> is used |
| 209 | if <code class="computeroutput">VG_(tool_panic)</code> is ever called, or |
| 210 | a tool assertion fails. Others have other uses.</p> |
| 211 | <p>Second, various "needs" can be set for a tool, using the functions |
| 212 | <code class="function">VG_(needs_*)</code>. They are mostly booleans, and can |
| 213 | be left untouched (they default to <code class="varname">False</code>). They |
| 214 | determine whether a tool can do various things such as: record, report |
| 215 | and suppress errors; process command line options; wrap system calls; |
| 216 | record extra information about heap blocks; etc.</p> |
| 217 | <p>For example, if a tool wants the core's help in recording and |
| 218 | reporting errors, it must call |
| 219 | <code class="function">VG_(needs_tool_errors)</code> and provide definitions of |
| 220 | eight functions for comparing errors, printing out errors, reading |
| 221 | suppressions from a suppressions file, etc. While writing these |
| 222 | functions requires some work, it's much less than doing error handling |
| 223 | from scratch because the core is doing most of the work. |
| 224 | </p> |
| 225 | <p>Third, the tool can indicate which events in core it wants to be |
| 226 | notified about, using the functions <code class="function">VG_(track_*)</code>. |
| 227 | These include things such as heap blocks being allocated, the stack |
| 228 | pointer changing, a mutex being locked, etc. If a tool wants to know |
| 229 | about this, it should provide a pointer to a function, which will be |
| 230 | called when that event happens.</p> |
| 231 | <p>For example, if the tool want to be notified when a new heap block |
| 232 | is allocated, it should call |
| 233 | <code class="function">VG_(track_new_mem_heap)</code> with an appropriate |
| 234 | function pointer, and the assigned function will be called each time |
| 235 | this happens.</p> |
| 236 | <p>More information about "details", "needs" and "trackable events" |
| 237 | can be found in |
| 238 | <code class="filename">include/pub_tool_tooliface.h</code>.</p> |
| 239 | </div> |
| 240 | <div class="sect2"> |
| 241 | <div class="titlepage"><div><div><h3 class="title"> |
| 242 | <a name="manual-writing-tools.instr"></a>2.2.6. Instrumentation</h3></div></div></div> |
| 243 | <p><code class="function">instrument</code> is the interesting one. It |
| 244 | allows you to instrument <span class="emphasis"><em>VEX IR</em></span>, which is |
| 245 | Valgrind's RISC-like intermediate language. VEX IR is described |
| 246 | in the comments of the header file |
| 247 | <code class="filename">VEX/pub/libvex_ir.h</code>.</p> |
| 248 | <p>The easiest way to instrument VEX IR is to insert calls to C |
| 249 | functions when interesting things happen. See the tool "Lackey" |
| 250 | (<code class="filename">lackey/lk_main.c</code>) for a simple example of this, or |
| 251 | Cachegrind (<code class="filename">cachegrind/cg_main.c</code>) for a more |
| 252 | complex example.</p> |
| 253 | </div> |
| 254 | <div class="sect2"> |
| 255 | <div class="titlepage"><div><div><h3 class="title"> |
| 256 | <a name="manual-writing-tools.fini"></a>2.2.7. Finalisation</h3></div></div></div> |
| 257 | <p>This is where you can present the final results, such as a summary |
| 258 | of the information collected. Any log files should be written out at |
| 259 | this point.</p> |
| 260 | </div> |
| 261 | <div class="sect2"> |
| 262 | <div class="titlepage"><div><div><h3 class="title"> |
| 263 | <a name="manual-writing-tools.otherinfo"></a>2.2.8. Other Important Information</h3></div></div></div> |
| 264 | <p>Please note that the core/tool split infrastructure is quite |
| 265 | complex and not brilliantly documented. Here are some important points, |
| 266 | but there are undoubtedly many others that I should note but haven't |
| 267 | thought of.</p> |
| 268 | <p>The files <code class="filename">include/pub_tool_*.h</code> contain all the |
| 269 | types, macros, functions, etc. that a tool should (hopefully) need, and are |
| 270 | the only <code class="filename">.h</code> files a tool should need to |
| 271 | <code class="computeroutput">#include</code>. They have a reasonable amount of |
| 272 | documentation in it that should hopefully be enough to get you going.</p> |
| 273 | <p>Note that you can't use anything from the C library (there |
| 274 | are deep reasons for this, trust us). Valgrind provides an |
| 275 | implementation of a reasonable subset of the C library, details of which |
| 276 | are in <code class="filename">pub_tool_libc*.h</code>.</p> |
| 277 | <p>When writing a tool, in theory you shouldn't need to look at any of |
| 278 | the code in Valgrind's core, but in practice it might be useful sometimes to |
| 279 | help understand something.</p> |
| 280 | <p>The <code class="filename">include/pub_tool_basics.h</code> and |
| 281 | <code class="filename">VEX/pub/libvex_basictypes.h</code> files have some basic |
| 282 | types that are widely used.</p> |
| 283 | <p>Ultimately, the tools distributed (Memcheck, Cachegrind, Lackey, etc.) |
| 284 | are probably the best documentation of all, for the moment.</p> |
| 285 | <p>The <code class="computeroutput">VG_</code> macro is used |
| 286 | heavily. This just prepends a longer string in front of names to avoid |
| 287 | potential namespace clashes. It is defined in |
| 288 | <code class="filename">include/pub_tool_basics.h</code>.</p> |
| 289 | <p>There are some assorted notes about various aspects of the |
| 290 | implementation in <code class="filename">docs/internals/</code>. Much of it |
| 291 | isn't that relevant to tool-writers, however.</p> |
| 292 | </div> |
| 293 | </div> |
| 294 | <div class="sect1"> |
| 295 | <div class="titlepage"><div><div><h2 class="title" style="clear: both"> |
| 296 | <a name="manual-writing-tools.advtopics"></a>2.3. Advanced Topics</h2></div></div></div> |
| 297 | <p>Once a tool becomes more complicated, there are some extra |
| 298 | things you may want/need to do.</p> |
| 299 | <div class="sect2"> |
| 300 | <div class="titlepage"><div><div><h3 class="title"> |
| 301 | <a name="manual-writing-tools.advice"></a>2.3.1. Debugging Tips</h3></div></div></div> |
| 302 | <p>Writing and debugging tools is not trivial. Here are some |
| 303 | suggestions for solving common problems.</p> |
| 304 | <p>If you are getting segmentation faults in C functions used by your |
| 305 | tool, the usual GDB command:</p> |
| 306 | <pre class="screen"> |
| 307 | gdb <prog> core</pre> |
| 308 | <p>usually gives the location of the segmentation fault.</p> |
| 309 | <p>If you want to debug C functions used by your tool, there are |
| 310 | instructions on how to do so in the file |
| 311 | <code class="filename">README_DEVELOPERS</code>.</p> |
| 312 | <p>If you are having problems with your VEX IR instrumentation, it's |
| 313 | likely that GDB won't be able to help at all. In this case, Valgrind's |
| 314 | <code class="option">--trace-flags</code> option is invaluable for observing the |
| 315 | results of instrumentation.</p> |
| 316 | <p>If you just want to know whether a program point has been reached, |
| 317 | using the <code class="computeroutput">OINK</code> macro (in |
| 318 | <code class="filename">include/pub_tool_libcprint.h</code>) can be easier than |
| 319 | using GDB.</p> |
| 320 | <p>The other debugging command line options can be useful too (run |
| 321 | <code class="computeroutput">valgrind --help-debug</code> for the |
| 322 | list).</p> |
| 323 | </div> |
| 324 | <div class="sect2"> |
| 325 | <div class="titlepage"><div><div><h3 class="title"> |
| 326 | <a name="manual-writing-tools.suppressions"></a>2.3.2. Suppressions</h3></div></div></div> |
| 327 | <p>If your tool reports errors and you want to suppress some common |
| 328 | ones, you can add suppressions to the suppression files. The relevant |
| 329 | files are <code class="filename">*.supp</code>; the final suppression |
| 330 | file is aggregated from these files by combining the relevant |
| 331 | <code class="filename">.supp</code> files depending on the versions of linux, X |
| 332 | and glibc on a system.</p> |
| 333 | <p>Suppression types have the form |
| 334 | <code class="computeroutput">tool_name:suppression_name</code>. The |
| 335 | <code class="computeroutput">tool_name</code> here is the name you specify |
| 336 | for the tool during initialisation with |
| 337 | <code class="function">VG_(details_name)</code>.</p> |
| 338 | </div> |
| 339 | <div class="sect2"> |
| 340 | <div class="titlepage"><div><div><h3 class="title"> |
| 341 | <a name="manual-writing-tools.docs"></a>2.3.3. Documentation</h3></div></div></div> |
| 342 | <p>If you are feeling conscientious and want to write some |
| 343 | documentation for your tool, please use XML as the rest of Valgrind does. |
| 344 | The file <code class="filename">docs/README</code> has more details on getting |
| 345 | the XML toolchain to work; this can be difficult, unfortunately.</p> |
| 346 | <p>To write the documentation, follow these steps (using |
| 347 | <code class="computeroutput">foobar</code> as the example tool name |
| 348 | again):</p> |
| 349 | <div class="orderedlist"><ol class="orderedlist" type="1"> |
| 350 | <li class="listitem"><p>The docs go in |
| 351 | <code class="computeroutput">foobar/docs/</code>, which you will |
| 352 | have created when you started writing the tool.</p></li> |
| 353 | <li class="listitem"> |
| 354 | <p>Copy the XML documentation file for the tool Nulgrind from |
| 355 | <code class="filename">none/docs/nl-manual.xml</code> to |
| 356 | <code class="computeroutput">foobar/docs/</code>, and rename it to |
| 357 | <code class="filename">foobar/docs/fb-manual.xml</code>.</p> |
| 358 | <p><span class="command"><strong>Note</strong></span>: there is a tetex bug |
| 359 | involving underscores in filenames, so don't use '_'.</p> |
| 360 | </li> |
| 361 | <li class="listitem"><p>Write the documentation. There are some helpful bits and |
| 362 | pieces on using XML markup in |
| 363 | <code class="filename">docs/xml/xml_help.txt</code>.</p></li> |
| 364 | <li class="listitem"><p>Include it in the User Manual by adding the relevant entry to |
| 365 | <code class="filename">docs/xml/manual.xml</code>. Copy and edit an |
| 366 | existing entry.</p></li> |
| 367 | <li class="listitem"><p>Include it in the man page by adding the relevant entry to |
| 368 | <code class="filename">docs/xml/valgrind-manpage.xml</code>. Copy and |
| 369 | edit an existing entry.</p></li> |
| 370 | <li class="listitem"> |
| 371 | <p>Validate <code class="filename">foobar/docs/fb-manual.xml</code> using |
| 372 | the following command from within <code class="filename">docs/</code>: |
| 373 | </p> |
| 374 | <pre class="screen"> |
| 375 | make valid |
| 376 | </pre> |
| 377 | <p>You may get errors that look like this:</p> |
| 378 | <pre class="screen"> |
| 379 | ./xml/index.xml:5: element chapter: validity error : No declaration for |
| 380 | attribute base of element chapter |
| 381 | </pre> |
| 382 | <p>Ignore (only) these -- they're not important.</p> |
| 383 | <p>Because the XML toolchain is fragile, it is important to ensure |
| 384 | that <code class="filename">fb-manual.xml</code> won't break the documentation |
| 385 | set build. Note that just because an XML file happily transforms to |
| 386 | html does not necessarily mean the same holds true for pdf/ps.</p> |
| 387 | </li> |
| 388 | <li class="listitem"> |
| 389 | <p>You can (re-)generate the HTML docs while you are writing |
| 390 | <code class="filename">fb-manual.xml</code> to help you see how it's looking. |
| 391 | The generated files end up in |
| 392 | <code class="filename">docs/html/</code>. Use the following |
| 393 | command, within <code class="filename">docs/</code>:</p> |
| 394 | <pre class="screen"> |
| 395 | make html-docs |
| 396 | </pre> |
| 397 | </li> |
| 398 | <li class="listitem"> |
| 399 | <p>When you have finished, try to generate PDF and PostScript output to |
| 400 | check all is well, from within <code class="filename">docs/</code>: |
| 401 | </p> |
| 402 | <pre class="screen"> |
| 403 | make print-docs |
| 404 | </pre> |
| 405 | <p>Check the output <code class="filename">.pdf</code> and |
| 406 | <code class="filename">.ps</code> files in |
| 407 | <code class="computeroutput">docs/print/</code>.</p> |
| 408 | <p>Note that the toolchain is even more fragile for the print docs, |
| 409 | so don't feel too bad if you can't get it working.</p> |
| 410 | </li> |
| 411 | </ol></div> |
| 412 | </div> |
| 413 | <div class="sect2"> |
| 414 | <div class="titlepage"><div><div><h3 class="title"> |
| 415 | <a name="manual-writing-tools.regtests"></a>2.3.4. Regression Tests</h3></div></div></div> |
| 416 | <p>Valgrind has some support for regression tests. If you want to |
| 417 | write regression tests for your tool:</p> |
| 418 | <div class="orderedlist"><ol class="orderedlist" type="1"> |
| 419 | <li class="listitem"><p>The tests go in <code class="computeroutput">foobar/tests/</code>, |
| 420 | which you will have created when you started writing the tool.</p></li> |
| 421 | <li class="listitem"><p>Write <code class="filename">foobar/tests/Makefile.am</code>. Use |
| 422 | <code class="filename">memcheck/tests/Makefile.am</code> as an |
| 423 | example.</p></li> |
| 424 | <li class="listitem"><p>Write the tests, <code class="computeroutput">.vgtest</code> test |
| 425 | description files, <code class="computeroutput">.stdout.exp</code> and |
| 426 | <code class="computeroutput">.stderr.exp</code> expected output files. |
| 427 | (Note that Valgrind's output goes to stderr.) Some details on |
| 428 | writing and running tests are given in the comments at the top of |
| 429 | the testing script |
| 430 | <code class="computeroutput">tests/vg_regtest</code>.</p></li> |
| 431 | <li class="listitem"><p>Write a filter for stderr results |
| 432 | <code class="computeroutput">foobar/tests/filter_stderr</code>. It can |
| 433 | call the existing filters in |
| 434 | <code class="computeroutput">tests/</code>. See |
| 435 | <code class="computeroutput">memcheck/tests/filter_stderr</code> for an |
| 436 | example; in particular note the |
| 437 | <code class="computeroutput">$dir</code> trick that ensures the filter |
| 438 | works correctly from any directory.</p></li> |
| 439 | </ol></div> |
| 440 | </div> |
| 441 | <div class="sect2"> |
| 442 | <div class="titlepage"><div><div><h3 class="title"> |
| 443 | <a name="manual-writing-tools.profiling"></a>2.3.5. Profiling</h3></div></div></div> |
| 444 | <p>Lots of profiling tools have trouble running Valgrind. For example, |
| 445 | trying to use gprof is hopeless.</p> |
| 446 | <p>Probably the best way to profile a tool is with OProfile on Linux.</p> |
| 447 | <p>You can also use Cachegrind on it. Read |
| 448 | <code class="filename">README_DEVELOPERS</code> for details on running Valgrind under |
| 449 | Valgrind; it's a bit fragile but can usually be made to work.</p> |
| 450 | </div> |
| 451 | <div class="sect2"> |
| 452 | <div class="titlepage"><div><div><h3 class="title"> |
| 453 | <a name="manual-writing-tools.mkhackery"></a>2.3.6. Other Makefile Hackery</h3></div></div></div> |
| 454 | <p>If you add any directories under |
| 455 | <code class="computeroutput">foobar/</code>, you will need to add |
| 456 | an appropriate <code class="filename">Makefile.am</code> to it, and add a |
| 457 | corresponding entry to the <code class="computeroutput">AC_OUTPUT</code> |
| 458 | list in <code class="filename">configure.in</code>.</p> |
| 459 | <p>If you add any scripts to your tool (see Cachegrind for an |
| 460 | example) you need to add them to the |
| 461 | <code class="computeroutput">bin_SCRIPTS</code> variable in |
| 462 | <code class="filename">foobar/Makefile.am</code> and possible also to the |
| 463 | <code class="computeroutput">AC_OUTPUT</code> list in |
| 464 | <code class="filename">configure.in</code>.</p> |
| 465 | </div> |
| 466 | <div class="sect2"> |
| 467 | <div class="titlepage"><div><div><h3 class="title"> |
| 468 | <a name="manual-writing-tools.ifacever"></a>2.3.7. The Core/tool Interface</h3></div></div></div> |
| 469 | <p>The core/tool interface evolves over time, but it's pretty stable. |
| 470 | We deliberately do not provide backward compatibility with old interfaces, |
| 471 | because it is too difficult and too restrictive. We view this as a good |
| 472 | thing -- if we had to be backward compatible with earlier versions, many |
| 473 | improvements now in the system could not have been added.</p> |
| 474 | <p>Because tools are statically linked with the core, if a tool compiles |
| 475 | successfully then it should be compatible with the core. We would not |
| 476 | deliberately violate this property by, for example, changing the behaviour |
| 477 | of a core function without changing its prototype.</p> |
| 478 | </div> |
| 479 | </div> |
| 480 | <div class="sect1"> |
| 481 | <div class="titlepage"><div><div><h2 class="title" style="clear: both"> |
| 482 | <a name="manual-writing-tools.finalwords"></a>2.4. Final Words</h2></div></div></div> |
| 483 | <p>Writing a new Valgrind tool is not easy, but the tools you can write |
| 484 | with Valgrind are among the most powerful programming tools there are. |
| 485 | Happy programming!</p> |
| 486 | </div> |
| 487 | </div> |
| 488 | <div> |
| 489 | <br><table class="nav" width="100%" cellspacing="3" cellpadding="2" border="0" summary="Navigation footer"> |
| 490 | <tr> |
| 491 | <td rowspan="2" width="40%" align="left"> |
| 492 | <a accesskey="p" href="design-impl.html"><< 1. The Design and Implementation of Valgrind</a> </td> |
| 493 | <td width="20%" align="center"><a accesskey="u" href="tech-docs.html">Up</a></td> |
| 494 | <td rowspan="2" width="40%" align="right"> <a accesskey="n" href="cl-format.html">3. Callgrind Format Specification >></a> |
| 495 | </td> |
| 496 | </tr> |
| 497 | <tr><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td></tr> |
| 498 | </table> |
| 499 | </div> |
| 500 | </body> |
| 501 | </html> |