1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 4 <title>3.Using and understanding the Valgrind core: Advanced Topics</title> 5 <link rel="stylesheet" href="vg_basic.css" type="text/css"> 6 <meta name="generator" content="DocBook XSL Stylesheets V1.75.2"> 7 <link rel="home" href="index.html" title="Valgrind Documentation"> 8 <link rel="up" href="manual.html" title="Valgrind User Manual"> 9 <link rel="prev" href="manual-core.html" title="2.Using and understanding the Valgrind core"> 10 <link rel="next" href="mc-manual.html" title="4.Memcheck: a memory error detector"> 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="manual-core.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="manual.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 User Manual</th> 18 <td width="22px" align="center" valign="middle"><a accesskey="n" href="mc-manual.html"><img src="images/next.png" width="18" height="21" border="0" alt="Next"></a></td> 19 </tr></table></div> 20 <div class="chapter" title="3.Using and understanding the Valgrind core: Advanced Topics"> 21 <div class="titlepage"><div><div><h2 class="title"> 22 <a name="manual-core-adv"></a>3.Using and understanding the Valgrind core: Advanced Topics</h2></div></div></div> 23 <div class="toc"> 24 <p><b>Table of Contents</b></p> 25 <dl> 26 <dt><span class="sect1"><a href="manual-core-adv.html#manual-core-adv.clientreq">3.1. The Client Request mechanism</a></span></dt> 27 <dt><span class="sect1"><a href="manual-core-adv.html#manual-core-adv.wrapping">3.2. Function wrapping</a></span></dt> 28 <dd><dl> 29 <dt><span class="sect2"><a href="manual-core-adv.html#manual-core-adv.wrapping.example">3.2.1. A Simple Example</a></span></dt> 30 <dt><span class="sect2"><a href="manual-core-adv.html#manual-core-adv.wrapping.specs">3.2.2. Wrapping Specifications</a></span></dt> 31 <dt><span class="sect2"><a href="manual-core-adv.html#manual-core-adv.wrapping.semantics">3.2.3. Wrapping Semantics</a></span></dt> 32 <dt><span class="sect2"><a href="manual-core-adv.html#manual-core-adv.wrapping.debugging">3.2.4. Debugging</a></span></dt> 33 <dt><span class="sect2"><a href="manual-core-adv.html#manual-core-adv.wrapping.limitations-cf">3.2.5. Limitations - control flow</a></span></dt> 34 <dt><span class="sect2"><a href="manual-core-adv.html#manual-core-adv.wrapping.limitations-sigs">3.2.6. Limitations - original function signatures</a></span></dt> 35 <dt><span class="sect2"><a href="manual-core-adv.html#manual-core-adv.wrapping.examples">3.2.7. Examples</a></span></dt> 36 </dl></dd> 37 </dl> 38 </div> 39 <p>This chapter describes advanced aspects of the Valgrind core 40 services, which are mostly of interest to power users who wish to 41 customise and modify Valgrind's default behaviours in certain useful 42 ways. The subjects covered are:</p> 43 <div class="itemizedlist"><ul class="itemizedlist" type="disc"> 44 <li class="listitem"><p>The "Client Request" mechanism</p></li> 45 <li class="listitem"><p>Function Wrapping</p></li> 46 </ul></div> 47 <div class="sect1" title="3.1.The Client Request mechanism"> 48 <div class="titlepage"><div><div><h2 class="title" style="clear: both"> 49 <a name="manual-core-adv.clientreq"></a>3.1.The Client Request mechanism</h2></div></div></div> 50 <p>Valgrind has a trapdoor mechanism via which the client 51 program can pass all manner of requests and queries to Valgrind 52 and the current tool. Internally, this is used extensively 53 to make various things work, although that's not visible from the 54 outside.</p> 55 <p>For your convenience, a subset of these so-called client 56 requests is provided to allow you to tell Valgrind facts about 57 the behaviour of your program, and also to make queries. 58 In particular, your program can tell Valgrind about things that it 59 otherwise would not know, leading to better results. 60 </p> 61 <p>Clients need to include a header file to make this work. 62 Which header file depends on which client requests you use. Some 63 client requests are handled by the core, and are defined in the 64 header file <code class="filename">valgrind/valgrind.h</code>. Tool-specific 65 header files are named after the tool, e.g. 66 <code class="filename">valgrind/memcheck.h</code>. Each tool-specific header file 67 includes <code class="filename">valgrind/valgrind.h</code> so you don't need to 68 include it in your client if you include a tool-specific header. All header 69 files can be found in the <code class="literal">include/valgrind</code> directory of 70 wherever Valgrind was installed.</p> 71 <p>The macros in these header files have the magical property 72 that they generate code in-line which Valgrind can spot. 73 However, the code does nothing when not run on Valgrind, so you 74 are not forced to run your program under Valgrind just because you 75 use the macros in this file. Also, you are not required to link your 76 program with any extra supporting libraries.</p> 77 <p>The code added to your binary has negligible performance impact: 78 on x86, amd64, ppc32, ppc64 and ARM, the overhead is 6 simple integer 79 instructions and is probably undetectable except in tight loops. 80 However, if you really wish to compile out the client requests, you 81 can compile with <code class="option">-DNVALGRIND</code> (analogous to 82 <code class="option">-DNDEBUG</code>'s effect on 83 <code class="function">assert</code>). 84 </p> 85 <p>You are encouraged to copy the <code class="filename">valgrind/*.h</code> headers 86 into your project's include directory, so your program doesn't have a 87 compile-time dependency on Valgrind being installed. The Valgrind headers, 88 unlike most of the rest of the code, are under a BSD-style license so you may 89 include them without worrying about license incompatibility.</p> 90 <p>Here is a brief description of the macros available in 91 <code class="filename">valgrind.h</code>, which work with more than one 92 tool (see the tool-specific documentation for explanations of the 93 tool-specific macros).</p> 94 <div class="variablelist"><dl> 95 <dt><span class="term"><span class="command"><strong><code class="computeroutput">RUNNING_ON_VALGRIND</code></strong></span>:</span></dt> 96 <dd><p>Returns 1 if running on Valgrind, 0 if running on the 97 real CPU. If you are running Valgrind on itself, returns the 98 number of layers of Valgrind emulation you're running on. 99 </p></dd> 100 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_DISCARD_TRANSLATIONS</code>:</strong></span></span></dt> 101 <dd> 102 <p>Discards translations of code in the specified address 103 range. Useful if you are debugging a JIT compiler or some other 104 dynamic code generation system. After this call, attempts to 105 execute code in the invalidated address range will cause 106 Valgrind to make new translations of that code, which is 107 probably the semantics you want. Note that code invalidations 108 are expensive because finding all the relevant translations 109 quickly is very difficult, so try not to call it often. 110 Note that you can be clever about 111 this: you only need to call it when an area which previously 112 contained code is overwritten with new code. You can choose 113 to write code into fresh memory, and just call this 114 occasionally to discard large chunks of old code all at 115 once.</p> 116 <p> 117 Alternatively, for transparent self-modifying-code support, 118 use<code class="option">--smc-check=all</code>, or run 119 on ppc32/Linux, ppc64/Linux or ARM/Linux. 120 </p> 121 </dd> 122 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_COUNT_ERRORS</code>:</strong></span></span></dt> 123 <dd><p>Returns the number of errors found so far by Valgrind. Can be 124 useful in test harness code when combined with the 125 <code class="option">--log-fd=-1</code> option; this runs Valgrind silently, 126 but the client program can detect when errors occur. Only useful 127 for tools that report errors, e.g. it's useful for Memcheck, but for 128 Cachegrind it will always return zero because Cachegrind doesn't 129 report errors.</p></dd> 130 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_MALLOCLIKE_BLOCK</code>:</strong></span></span></dt> 131 <dd><p>If your program manages its own memory instead of using 132 the standard <code class="function">malloc</code> / 133 <code class="function">new</code> / 134 <code class="function">new[]</code>, tools that track 135 information about heap blocks will not do nearly as good a 136 job. For example, Memcheck won't detect nearly as many 137 errors, and the error messages won't be as informative. To 138 improve this situation, use this macro just after your custom 139 allocator allocates some new memory. See the comments in 140 <code class="filename">valgrind.h</code> for information on how to use 141 it.</p></dd> 142 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_FREELIKE_BLOCK</code>:</strong></span></span></dt> 143 <dd><p>This should be used in conjunction with 144 <code class="computeroutput">VALGRIND_MALLOCLIKE_BLOCK</code>. 145 Again, see <code class="filename">valgrind.h</code> for 146 information on how to use it.</p></dd> 147 <dt><span class="term"> 148 <span class="command"><strong><code class="computeroutput">VALGRIND_CREATE_MEMPOOL</code></strong></span>, 149 <span class="command"><strong><code class="computeroutput">VALGRIND_DESTROY_MEMPOOL</code></strong></span>, 150 <span class="command"><strong><code class="computeroutput">VALGRIND_MEMPOOL_ALLOC</code></strong></span>, 151 <span class="command"><strong><code class="computeroutput">VALGRIND_MEMPOOL_FREE</code></strong></span>, 152 <span class="command"><strong><code class="computeroutput">VALGRIND_MOVE_MEMPOOL</code></strong></span>, 153 <span class="command"><strong><code class="computeroutput">VALGRIND_MEMPOOL_CHANGE</code></strong></span>, 154 <span class="command"><strong><code class="computeroutput">VALGRIND_MEMPOOL_EXISTS</code></strong></span>: 155 </span></dt> 156 <dd><p>These are similar to 157 <code class="computeroutput">VALGRIND_MALLOCLIKE_BLOCK</code> and 158 <code class="computeroutput">VALGRIND_FREELIKE_BLOCK</code> 159 but are tailored towards code that uses memory pools. See 160 <a class="xref" href="mc-manual.html#mc-manual.mempools" title="4.7.Memory Pools: describing and working with custom allocators">Memory Pools</a> for a detailed description.</p></dd> 161 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_NON_SIMD_CALL[0123]</code>:</strong></span></span></dt> 162 <dd> 163 <p>Executes a function in the client program on the 164 <span class="emphasis"><em>real</em></span> CPU, not the virtual CPU that Valgrind 165 normally runs code on. The function must take an integer (holding a 166 thread ID) as the first argument and then 0, 1, 2 or 3 more arguments 167 (depending on which client request is used). These are used in various 168 ways internally to Valgrind. They might be useful to client 169 programs.</p> 170 <p><span class="command"><strong>Warning:</strong></span> Only use these if you 171 <span class="emphasis"><em>really</em></span> know what you are doing. They aren't 172 entirely reliable, and can cause Valgrind to crash. See 173 <code class="filename">valgrind.h</code> for more details. 174 </p> 175 </dd> 176 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_PRINTF(format, ...)</code>:</strong></span></span></dt> 177 <dd><p>Print a printf-style message to the Valgrind log file. The 178 message is prefixed with the PID between a pair of 179 <code class="computeroutput">**</code> markers. (Like all client requests, 180 nothing is output if the client program is not running under Valgrind.) 181 Output is not produced until a newline is encountered, or subsequent 182 Valgrind output is printed; this allows you to build up a single line of 183 output over multiple calls. Returns the number of characters output, 184 excluding the PID prefix.</p></dd> 185 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_PRINTF_BACKTRACE(format, ...)</code>:</strong></span></span></dt> 186 <dd><p>Like <code class="computeroutput">VALGRIND_PRINTF</code> (in 187 particular, the return value is identical), but prints a stack backtrace 188 immediately afterwards.</p></dd> 189 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_STACK_REGISTER(start, end)</code>:</strong></span></span></dt> 190 <dd> 191 <p>Registers a new stack. Informs Valgrind that the memory range 192 between start and end is a unique stack. Returns a stack identifier 193 that can be used with other 194 <code class="computeroutput">VALGRIND_STACK_*</code> calls.</p> 195 <p>Valgrind will use this information to determine if a change to 196 the stack pointer is an item pushed onto the stack or a change over 197 to a new stack. Use this if you're using a user-level thread package 198 and are noticing spurious errors from Valgrind about uninitialized 199 memory reads.</p> 200 <p><span class="command"><strong>Warning:</strong></span> Unfortunately, this client request is 201 unreliable and best avoided.</p> 202 </dd> 203 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_STACK_DEREGISTER(id)</code>:</strong></span></span></dt> 204 <dd> 205 <p>Deregisters a previously registered stack. Informs 206 Valgrind that previously registered memory range with stack id 207 <code class="computeroutput">id</code> is no longer a stack.</p> 208 <p><span class="command"><strong>Warning:</strong></span> Unfortunately, this client request is 209 unreliable and best avoided.</p> 210 </dd> 211 <dt><span class="term"><span class="command"><strong><code class="computeroutput">VALGRIND_STACK_CHANGE(id, start, end)</code>:</strong></span></span></dt> 212 <dd> 213 <p>Changes a previously registered stack. Informs 214 Valgrind that the previously registered stack with stack id 215 <code class="computeroutput">id</code> has changed its start and end 216 values. Use this if your user-level thread package implements 217 stack growth.</p> 218 <p><span class="command"><strong>Warning:</strong></span> Unfortunately, this client request is 219 unreliable and best avoided.</p> 220 </dd> 221 </dl></div> 222 </div> 223 <div class="sect1" title="3.2.Function wrapping"> 224 <div class="titlepage"><div><div><h2 class="title" style="clear: both"> 225 <a name="manual-core-adv.wrapping"></a>3.2.Function wrapping</h2></div></div></div> 226 <p> 227 Valgrind allows calls to some specified functions to be intercepted and 228 rerouted to a different, user-supplied function. This can do whatever it 229 likes, typically examining the arguments, calling onwards to the original, 230 and possibly examining the result. Any number of functions may be 231 wrapped.</p> 232 <p> 233 Function wrapping is useful for instrumenting an API in some way. For 234 example, Helgrind wraps functions in the POSIX pthreads API so it can know 235 about thread status changes, and the core is able to wrap 236 functions in the MPI (message-passing) API so it can know 237 of memory status changes associated with message arrival/departure. 238 Such information is usually passed to Valgrind by using client 239 requests in the wrapper functions, although the exact mechanism may vary. 240 </p> 241 <div class="sect2" title="3.2.1.A Simple Example"> 242 <div class="titlepage"><div><div><h3 class="title"> 243 <a name="manual-core-adv.wrapping.example"></a>3.2.1.A Simple Example</h3></div></div></div> 244 <p>Supposing we want to wrap some function</p> 245 <pre class="programlisting"> 246 int foo ( int x, int y ) { return x + y; }</pre> 247 <p>A wrapper is a function of identical type, but with a special name 248 which identifies it as the wrapper for <code class="computeroutput">foo</code>. 249 Wrappers need to include 250 supporting macros from <code class="filename">valgrind.h</code>. 251 Here is a simple wrapper which prints the arguments and return value:</p> 252 <pre class="programlisting"> 253 #include <stdio.h> 254 #include "valgrind.h" 255 int I_WRAP_SONAME_FNNAME_ZU(NONE,foo)( int x, int y ) 256 { 257 int result; 258 OrigFn fn; 259 VALGRIND_GET_ORIG_FN(fn); 260 printf("foo's wrapper: args %d %d\n", x, y); 261 CALL_FN_W_WW(result, fn, x,y); 262 printf("foo's wrapper: result %d\n", result); 263 return result; 264 } 265 </pre> 266 <p>To become active, the wrapper merely needs to be present in a text 267 section somewhere in the same process' address space as the function 268 it wraps, and for its ELF symbol name to be visible to Valgrind. In 269 practice, this means either compiling to a 270 <code class="computeroutput">.o</code> and linking it in, or 271 compiling to a <code class="computeroutput">.so</code> and 272 <code class="computeroutput">LD_PRELOAD</code>ing it in. The latter is more 273 convenient in that it doesn't require relinking.</p> 274 <p>All wrappers have approximately the above form. There are three 275 crucial macros:</p> 276 <p><code class="computeroutput">I_WRAP_SONAME_FNNAME_ZU</code>: 277 this generates the real name of the wrapper. 278 This is an encoded name which Valgrind notices when reading symbol 279 table information. What it says is: I am the wrapper for any function 280 named <code class="computeroutput">foo</code> which is found in 281 an ELF shared object with an empty 282 ("<code class="computeroutput">NONE</code>") soname field. The specification 283 mechanism is powerful in 284 that wildcards are allowed for both sonames and function names. 285 The details are discussed below.</p> 286 <p><code class="computeroutput">VALGRIND_GET_ORIG_FN</code>: 287 once in the the wrapper, the first priority is 288 to get hold of the address of the original (and any other supporting 289 information needed). This is stored in a value of opaque 290 type <code class="computeroutput">OrigFn</code>. 291 The information is acquired using 292 <code class="computeroutput">VALGRIND_GET_ORIG_FN</code>. It is crucial 293 to make this macro call before calling any other wrapped function 294 in the same thread.</p> 295 <p><code class="computeroutput">CALL_FN_W_WW</code>: eventually we will 296 want to call the function being 297 wrapped. Calling it directly does not work, since that just gets us 298 back to the wrapper and leads to an infinite loop. Instead, the result 299 lvalue, 300 <code class="computeroutput">OrigFn</code> and arguments are 301 handed to one of a family of macros of the form 302 <code class="computeroutput">CALL_FN_*</code>. These 303 cause Valgrind to call the original and avoid recursion back to the 304 wrapper.</p> 305 </div> 306 <div class="sect2" title="3.2.2.Wrapping Specifications"> 307 <div class="titlepage"><div><div><h3 class="title"> 308 <a name="manual-core-adv.wrapping.specs"></a>3.2.2.Wrapping Specifications</h3></div></div></div> 309 <p>This scheme has the advantage of being self-contained. A library of 310 wrappers can be compiled to object code in the normal way, and does 311 not rely on an external script telling Valgrind which wrappers pertain 312 to which originals.</p> 313 <p>Each wrapper has a name which, in the most general case says: I am the 314 wrapper for any function whose name matches FNPATT and whose ELF 315 "soname" matches SOPATT. Both FNPATT and SOPATT may contain wildcards 316 (asterisks) and other characters (spaces, dots, @, etc) which are not 317 generally regarded as valid C identifier names.</p> 318 <p>This flexibility is needed to write robust wrappers for POSIX pthread 319 functions, where typically we are not completely sure of either the 320 function name or the soname, or alternatively we want to wrap a whole 321 set of functions at once.</p> 322 <p>For example, <code class="computeroutput">pthread_create</code> 323 in GNU libpthread is usually a 324 versioned symbol - one whose name ends in, eg, 325 <code class="computeroutput">@GLIBC_2.3</code>. Hence we 326 are not sure what its real name is. We also want to cover any soname 327 of the form <code class="computeroutput">libpthread.so*</code>. 328 So the header of the wrapper will be</p> 329 <pre class="programlisting"> 330 int I_WRAP_SONAME_FNNAME_ZZ(libpthreadZdsoZd0,pthreadZucreateZAZa) 331 ( ... formals ... ) 332 { ... body ... } 333 </pre> 334 <p>In order to write unusual characters as valid C function names, a 335 Z-encoding scheme is used. Names are written literally, except that 336 a capital Z acts as an escape character, with the following encoding:</p> 337 <pre class="programlisting"> 338 Za encodes * 339 Zp + 340 Zc : 341 Zd . 342 Zu _ 343 Zh - 344 Zs (space) 345 ZA @ 346 ZZ Z 347 ZL ( # only in valgrind 3.3.0 and later 348 ZR ) # only in valgrind 3.3.0 and later 349 </pre> 350 <p>Hence <code class="computeroutput">libpthreadZdsoZd0</code> is an 351 encoding of the soname <code class="computeroutput">libpthread.so.0</code> 352 and <code class="computeroutput">pthreadZucreateZAZa</code> is an encoding 353 of the function name <code class="computeroutput">pthread_create@*</code>. 354 </p> 355 <p>The macro <code class="computeroutput">I_WRAP_SONAME_FNNAME_ZZ</code> 356 constructs a wrapper name in which 357 both the soname (first component) and function name (second component) 358 are Z-encoded. Encoding the function name can be tiresome and is 359 often unnecessary, so a second macro, 360 <code class="computeroutput">I_WRAP_SONAME_FNNAME_ZU</code>, can be 361 used instead. The <code class="computeroutput">_ZU</code> variant is 362 also useful for writing wrappers for 363 C++ functions, in which the function name is usually already mangled 364 using some other convention in which Z plays an important role. Having 365 to encode a second time quickly becomes confusing.</p> 366 <p>Since the function name field may contain wildcards, it can be 367 anything, including just <code class="computeroutput">*</code>. 368 The same is true for the soname. 369 However, some ELF objects - specifically, main executables - do not 370 have sonames. Any object lacking a soname is treated as if its soname 371 was <code class="computeroutput">NONE</code>, which is why the original 372 example above had a name 373 <code class="computeroutput">I_WRAP_SONAME_FNNAME_ZU(NONE,foo)</code>.</p> 374 <p>Note that the soname of an ELF object is not the same as its 375 file name, although it is often similar. You can find the soname of 376 an object <code class="computeroutput">libfoo.so</code> using the command 377 <code class="computeroutput">readelf -a libfoo.so | grep soname</code>.</p> 378 </div> 379 <div class="sect2" title="3.2.3.Wrapping Semantics"> 380 <div class="titlepage"><div><div><h3 class="title"> 381 <a name="manual-core-adv.wrapping.semantics"></a>3.2.3.Wrapping Semantics</h3></div></div></div> 382 <p>The ability for a wrapper to replace an infinite family of functions 383 is powerful but brings complications in situations where ELF objects 384 appear and disappear (are dlopen'd and dlclose'd) on the fly. 385 Valgrind tries to maintain sensible behaviour in such situations.</p> 386 <p>For example, suppose a process has dlopened (an ELF object with 387 soname) <code class="filename">object1.so</code>, which contains 388 <code class="computeroutput">function1</code>. It starts to use 389 <code class="computeroutput">function1</code> immediately.</p> 390 <p>After a while it dlopens <code class="filename">wrappers.so</code>, 391 which contains a wrapper 392 for <code class="computeroutput">function1</code> in (soname) 393 <code class="filename">object1.so</code>. All subsequent calls to 394 <code class="computeroutput">function1</code> are rerouted to the wrapper.</p> 395 <p>If <code class="filename">wrappers.so</code> is 396 later dlclose'd, calls to <code class="computeroutput">function1</code> are 397 naturally routed back to the original.</p> 398 <p>Alternatively, if <code class="filename">object1.so</code> 399 is dlclose'd but <code class="filename">wrappers.so</code> remains, 400 then the wrapper exported by <code class="filename">wrappers.so</code> 401 becomes inactive, since there 402 is no way to get to it - there is no original to call any more. However, 403 Valgrind remembers that the wrapper is still present. If 404 <code class="filename">object1.so</code> is 405 eventually dlopen'd again, the wrapper will become active again.</p> 406 <p>In short, valgrind inspects all code loading/unloading events to 407 ensure that the set of currently active wrappers remains consistent.</p> 408 <p>A second possible problem is that of conflicting wrappers. It is 409 easily possible to load two or more wrappers, both of which claim 410 to be wrappers for some third function. In such cases Valgrind will 411 complain about conflicting wrappers when the second one appears, and 412 will honour only the first one.</p> 413 </div> 414 <div class="sect2" title="3.2.4.Debugging"> 415 <div class="titlepage"><div><div><h3 class="title"> 416 <a name="manual-core-adv.wrapping.debugging"></a>3.2.4.Debugging</h3></div></div></div> 417 <p>Figuring out what's going on given the dynamic nature of wrapping 418 can be difficult. The 419 <code class="option">--trace-redir=yes</code> option makes 420 this possible 421 by showing the complete state of the redirection subsystem after 422 every 423 <code class="function">mmap</code>/<code class="function">munmap</code> 424 event affecting code (text).</p> 425 <p>There are two central concepts:</p> 426 <div class="itemizedlist"><ul class="itemizedlist" type="disc"> 427 <li class="listitem"><p>A "redirection specification" is a binding of 428 a (soname pattern, fnname pattern) pair to a code address. 429 These bindings are created by writing functions with names 430 made with the 431 <code class="computeroutput">I_WRAP_SONAME_FNNAME_{ZZ,_ZU}</code> 432 macros.</p></li> 433 <li class="listitem"><p>An "active redirection" is a code-address to 434 code-address binding currently in effect.</p></li> 435 </ul></div> 436 <p>The state of the wrapping-and-redirection subsystem comprises a set of 437 specifications and a set of active bindings. The specifications are 438 acquired/discarded by watching all 439 <code class="function">mmap</code>/<code class="function">munmap</code> 440 events on code (text) 441 sections. The active binding set is (conceptually) recomputed from 442 the specifications, and all known symbol names, following any change 443 to the specification set.</p> 444 <p><code class="option">--trace-redir=yes</code> shows the contents 445 of both sets following any such event.</p> 446 <p><code class="option">-v</code> prints a line of text each 447 time an active specification is used for the first time.</p> 448 <p>Hence for maximum debugging effectiveness you will need to use both 449 options.</p> 450 <p>One final comment. The function-wrapping facility is closely 451 tied to Valgrind's ability to replace (redirect) specified 452 functions, for example to redirect calls to 453 <code class="function">malloc</code> to its 454 own implementation. Indeed, a replacement function can be 455 regarded as a wrapper function which does not call the original. 456 However, to make the implementation more robust, the two kinds 457 of interception (wrapping vs replacement) are treated differently. 458 </p> 459 <p><code class="option">--trace-redir=yes</code> shows 460 specifications and bindings for both 461 replacement and wrapper functions. To differentiate the 462 two, replacement bindings are printed using 463 <code class="computeroutput">R-></code> whereas 464 wraps are printed using <code class="computeroutput">W-></code>. 465 </p> 466 </div> 467 <div class="sect2" title="3.2.5.Limitations - control flow"> 468 <div class="titlepage"><div><div><h3 class="title"> 469 <a name="manual-core-adv.wrapping.limitations-cf"></a>3.2.5.Limitations - control flow</h3></div></div></div> 470 <p>For the most part, the function wrapping implementation is robust. 471 The only important caveat is: in a wrapper, get hold of 472 the <code class="computeroutput">OrigFn</code> information using 473 <code class="computeroutput">VALGRIND_GET_ORIG_FN</code> before calling any 474 other wrapped function. Once you have the 475 <code class="computeroutput">OrigFn</code>, arbitrary 476 calls between, recursion between, and longjumps out of wrappers 477 should work correctly. There is never any interaction between wrapped 478 functions and merely replaced functions 479 (eg <code class="function">malloc</code>), so you can call 480 <code class="function">malloc</code> etc safely from within wrappers. 481 </p> 482 <p>The above comments are true for {x86,amd64,ppc32,arm}-linux. On 483 ppc64-linux function wrapping is more fragile due to the (arguably 484 poorly designed) ppc64-linux ABI. This mandates the use of a shadow 485 stack which tracks entries/exits of both wrapper and replacement 486 functions. This gives two limitations: firstly, longjumping out of 487 wrappers will rapidly lead to disaster, since the shadow stack will 488 not get correctly cleared. Secondly, since the shadow stack has 489 finite size, recursion between wrapper/replacement functions is only 490 possible to a limited depth, beyond which Valgrind has to abort the 491 run. This depth is currently 16 calls.</p> 492 <p>For all platforms ({x86,amd64,ppc32,ppc64,arm}-linux) all the above 493 comments apply on a per-thread basis. In other words, wrapping is 494 thread-safe: each thread must individually observe the above 495 restrictions, but there is no need for any kind of inter-thread 496 cooperation.</p> 497 </div> 498 <div class="sect2" title="3.2.6.Limitations - original function signatures"> 499 <div class="titlepage"><div><div><h3 class="title"> 500 <a name="manual-core-adv.wrapping.limitations-sigs"></a>3.2.6.Limitations - original function signatures</h3></div></div></div> 501 <p>As shown in the above example, to call the original you must use a 502 macro of the form <code class="computeroutput">CALL_FN_*</code>. 503 For technical reasons it is impossible 504 to create a single macro to deal with all argument types and numbers, 505 so a family of macros covering the most common cases is supplied. In 506 what follows, 'W' denotes a machine-word-typed value (a pointer or a 507 C <code class="computeroutput">long</code>), 508 and 'v' denotes C's <code class="computeroutput">void</code> type. 509 The currently available macros are:</p> 510 <pre class="programlisting"> 511 CALL_FN_v_v -- call an original of type void fn ( void ) 512 CALL_FN_W_v -- call an original of type long fn ( void ) 513 514 CALL_FN_v_W -- call an original of type void fn ( long ) 515 CALL_FN_W_W -- call an original of type long fn ( long ) 516 517 CALL_FN_v_WW -- call an original of type void fn ( long, long ) 518 CALL_FN_W_WW -- call an original of type long fn ( long, long ) 519 520 CALL_FN_v_WWW -- call an original of type void fn ( long, long, long ) 521 CALL_FN_W_WWW -- call an original of type long fn ( long, long, long ) 522 523 CALL_FN_W_WWWW -- call an original of type long fn ( long, long, long, long ) 524 CALL_FN_W_5W -- call an original of type long fn ( long, long, long, long, long ) 525 CALL_FN_W_6W -- call an original of type long fn ( long, long, long, long, long, long ) 526 and so on, up to 527 CALL_FN_W_12W 528 </pre> 529 <p>The set of supported types can be expanded as needed. It is 530 regrettable that this limitation exists. Function wrapping has proven 531 difficult to implement, with a certain apparently unavoidable level of 532 ickiness. After several implementation attempts, the present 533 arrangement appears to be the least-worst tradeoff. At least it works 534 reliably in the presence of dynamic linking and dynamic code 535 loading/unloading.</p> 536 <p>You should not attempt to wrap a function of one type signature with a 537 wrapper of a different type signature. Such trickery will surely lead 538 to crashes or strange behaviour. This is not a limitation 539 of the function wrapping implementation, merely a reflection of the 540 fact that it gives you sweeping powers to shoot yourself in the foot 541 if you are not careful. Imagine the instant havoc you could wreak by 542 writing a wrapper which matched any function name in any soname - in 543 effect, one which claimed to be a wrapper for all functions in the 544 process.</p> 545 </div> 546 <div class="sect2" title="3.2.7.Examples"> 547 <div class="titlepage"><div><div><h3 class="title"> 548 <a name="manual-core-adv.wrapping.examples"></a>3.2.7.Examples</h3></div></div></div> 549 <p>In the source tree, 550 <code class="filename">memcheck/tests/wrap[1-8].c</code> provide a series of 551 examples, ranging from very simple to quite advanced.</p> 552 <p><code class="filename">mpi/libmpiwrap.c</code> is an example 553 of wrapping a big, complex API (the MPI-2 interface). This file defines 554 almost 300 different wrappers.</p> 555 </div> 556 </div> 557 </div> 558 <div> 559 <br><table class="nav" width="100%" cellspacing="3" cellpadding="2" border="0" summary="Navigation footer"> 560 <tr> 561 <td rowspan="2" width="40%" align="left"> 562 <a accesskey="p" href="manual-core.html"><<2.Using and understanding the Valgrind core</a></td> 563 <td width="20%" align="center"><a accesskey="u" href="manual.html">Up</a></td> 564 <td rowspan="2" width="40%" align="right"><a accesskey="n" href="mc-manual.html">4.Memcheck: a memory error detector>></a> 565 </td> 566 </tr> 567 <tr><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td></tr> 568 </table> 569 </div> 570 </body> 571 </html> 572