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