1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Getting Started</title> 6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="../stacktrace.html" title="Chapter 36. Boost.Stacktrace 1.0"> 10<link rel="prev" href="../stacktrace.html" title="Chapter 36. Boost.Stacktrace 1.0"> 11<link rel="next" href="configuration_and_build.html" title="Configuration and Build"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> 16<td align="center"><a href="../../../index.html">Home</a></td> 17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="../stacktrace.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stacktrace.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="configuration_and_build.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="section"> 27<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 28<a name="stacktrace.getting_started"></a><a class="link" href="getting_started.html" title="Getting Started">Getting Started</a> 29</h2></div></div></div> 30<div class="toc"><dl class="toc"> 31<dt><span class="section"><a href="getting_started.html#stacktrace.getting_started.how_to_print_current_call_stack">How 32 to print current call stack</a></span></dt> 33<dt><span class="section"><a href="getting_started.html#stacktrace.getting_started.handle_terminates_aborts_and_seg">Handle 34 terminates, aborts and Segmentation Faults</a></span></dt> 35<dt><span class="section"><a href="getting_started.html#stacktrace.getting_started.better_asserts">Better asserts</a></span></dt> 36<dt><span class="section"><a href="getting_started.html#stacktrace.getting_started.exceptions_with_stacktrace">Exceptions 37 with stacktrace</a></span></dt> 38<dt><span class="section"><a href="getting_started.html#stacktrace.getting_started.enabling_and_disabling_stacktrac">Enabling 39 and disabling stacktraces</a></span></dt> 40<dt><span class="section"><a href="getting_started.html#stacktrace.getting_started.saving_stacktraces_by_specified_">Saving 41 stacktraces by specified format</a></span></dt> 42<dt><span class="section"><a href="getting_started.html#stacktrace.getting_started.getting_function_information_fro">Getting 43 function information from pointer</a></span></dt> 44<dt><span class="section"><a href="getting_started.html#stacktrace.getting_started.global_control_over_stacktrace_o">Global 45 control over stacktrace output format</a></span></dt> 46</dl></div> 47<div class="section"> 48<div class="titlepage"><div><div><h3 class="title"> 49<a name="stacktrace.getting_started.how_to_print_current_call_stack"></a><a class="link" href="getting_started.html#stacktrace.getting_started.how_to_print_current_call_stack" title="How to print current call stack">How 50 to print current call stack</a> 51</h3></div></div></div> 52<p> 53 <code class="computeroutput"><a class="link" href="reference.html#boost.stacktrace.stacktrace">boost::stacktrace::stacktrace</a></code> 54 contains methods for working with call-stack/backtraces/stacktraces. Here's 55 a small example: 56 </p> 57<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 58 59<span class="comment">// ... somewhere inside the `bar(int)` function that is called recursively:</span> 60<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">();</span> 61</pre> 62<p> 63 In that example: 64 </p> 65<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 66<li class="listitem"> 67 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span></code> 68 is the namespace that has all the classes and functions to work with 69 stacktraces 70 </li> 71<li class="listitem"> 72 <code class="computeroutput"><a class="link" href="reference.html#boost.stacktrace.stacktrace">stacktrace()</a></code> 73 is the default constructor call; constructor stores the current function 74 call sequence inside the stacktrace class. 75 </li> 76</ul></div> 77<p> 78 Code from above will output something like this: 79 </p> 80<pre class="programlisting"><span class="number">0</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">path</span><span class="special">/</span><span class="identifier">to</span><span class="special">/</span><span class="identifier">source</span><span class="special">/</span><span class="identifier">file</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">70</span> 81<span class="number">1</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">path</span><span class="special">/</span><span class="identifier">to</span><span class="special">/</span><span class="identifier">source</span><span class="special">/</span><span class="identifier">file</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">70</span> 82<span class="number">2</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">path</span><span class="special">/</span><span class="identifier">to</span><span class="special">/</span><span class="identifier">source</span><span class="special">/</span><span class="identifier">file</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">70</span> 83<span class="number">3</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">path</span><span class="special">/</span><span class="identifier">to</span><span class="special">/</span><span class="identifier">source</span><span class="special">/</span><span class="identifier">file</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">70</span> 84<span class="number">4</span><span class="special">#</span> <span class="identifier">main</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">path</span><span class="special">/</span><span class="identifier">to</span><span class="special">/</span><span class="identifier">main</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">93</span> 85<span class="number">5</span><span class="special">#</span> <span class="identifier">__libc_start_main</span> <span class="identifier">in</span> <span class="special">/</span><span class="identifier">lib</span><span class="special">/</span><span class="identifier">x86_64</span><span class="special">-</span><span class="identifier">linux</span><span class="special">-</span><span class="identifier">gnu</span><span class="special">/</span><span class="identifier">libc</span><span class="special">.</span><span class="identifier">so</span><span class="special">.</span><span class="number">6</span> 86<span class="number">6</span><span class="special">#</span> <span class="identifier">_start</span> 87</pre> 88<div class="note"><table border="0" summary="Note"> 89<tr> 90<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 91<th align="left">Note</th> 92</tr> 93<tr><td align="left" valign="top"><p> 94 By default the Stacktrace library is very conservative in methods to decode 95 stacktrace. If your output does not look as fancy as in example from above, 96 see <a class="link" href="configuration_and_build.html" title="Configuration and Build">section "Configuration 97 and Build"</a> for allowing advanced features of the library. 98 </p></td></tr> 99</table></div> 100</div> 101<div class="section"> 102<div class="titlepage"><div><div><h3 class="title"> 103<a name="stacktrace.getting_started.handle_terminates_aborts_and_seg"></a><a class="link" href="getting_started.html#stacktrace.getting_started.handle_terminates_aborts_and_seg" title="Handle terminates, aborts and Segmentation Faults">Handle 104 terminates, aborts and Segmentation Faults</a> 105</h3></div></div></div> 106<p> 107 Segmentation Faults and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code> 108 calls sometimes happen in programs. Programmers usually wish to get as much 109 information as possible on such incidents, so having a stacktrace will significantly 110 improve debugging and fixing. 111 </p> 112<p> 113 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code> calls <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">abort</span></code>, 114 so we need to capture stack traces on Segmentation Faults and Abort signals. 115 </p> 116<div class="warning"><table border="0" summary="Warning"> 117<tr> 118<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 119<th align="left">Warning</th> 120</tr> 121<tr><td align="left" valign="top"><p> 122 Writing a signal handler requires high attention! Only a few system calls 123 allowed in signal handlers, so there's no cross platform way to print a 124 stacktrace without a risk of deadlocking. The only way to deal with the 125 problem - <span class="bold"><strong>dump raw stacktrace into file/socket and 126 parse it on program restart</strong></span>. 127 </p></td></tr> 128</table></div> 129<div class="warning"><table border="0" summary="Warning"> 130<tr> 131<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td> 132<th align="left">Warning</th> 133</tr> 134<tr><td align="left" valign="top"><p> 135 Not all the platforms provide means for even getting stacktrace in async 136 signal safe way. No stack trace will be saved on such platforms. 137 </p></td></tr> 138</table></div> 139<p> 140 Let's write a handler to safely dump stacktrace: 141 </p> 142<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">signal</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span> <span class="comment">// ::signal, ::raise</span> 143<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 144 145<span class="keyword">void</span> <span class="identifier">my_signal_handler</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">signum</span><span class="special">)</span> <span class="special">{</span> 146 <span class="special">::</span><span class="identifier">signal</span><span class="special">(</span><span class="identifier">signum</span><span class="special">,</span> <span class="identifier">SIG_DFL</span><span class="special">);</span> 147 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">safe_dump_to</span><span class="special">(</span><span class="string">"./backtrace.dump"</span><span class="special">);</span> 148 <span class="special">::</span><span class="identifier">raise</span><span class="special">(</span><span class="identifier">SIGABRT</span><span class="special">);</span> 149<span class="special">}</span> 150</pre> 151<p> 152 Registering our handler: 153 </p> 154<pre class="programlisting"><span class="special">::</span><span class="identifier">signal</span><span class="special">(</span><span class="identifier">SIGSEGV</span><span class="special">,</span> <span class="special">&</span><span class="identifier">my_signal_handler</span><span class="special">);</span> 155<span class="special">::</span><span class="identifier">signal</span><span class="special">(</span><span class="identifier">SIGABRT</span><span class="special">,</span> <span class="special">&</span><span class="identifier">my_signal_handler</span><span class="special">);</span> 156</pre> 157<p> 158 At program start we check for a file with stacktrace and if it exist - we're 159 writing it in human readable format: 160 </p> 161<pre class="programlisting"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">exists</span><span class="special">(</span><span class="string">"./backtrace.dump"</span><span class="special">))</span> <span class="special">{</span> 162 <span class="comment">// there is a backtrace</span> 163 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ifstream</span> <span class="identifier">ifs</span><span class="special">(</span><span class="string">"./backtrace.dump"</span><span class="special">);</span> 164 165 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span> <span class="identifier">st</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">from_dump</span><span class="special">(</span><span class="identifier">ifs</span><span class="special">);</span> 166 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Previous run crashed:\n"</span> <span class="special"><<</span> <span class="identifier">st</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 167 168 <span class="comment">// cleaning up</span> 169 <span class="identifier">ifs</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span> 170 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">filesystem</span><span class="special">::</span><span class="identifier">remove</span><span class="special">(</span><span class="string">"./backtrace.dump"</span><span class="special">);</span> 171<span class="special">}</span> 172</pre> 173<p> 174 Now we'll get the following output on <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code> 175 call after the program restarts: 176 </p> 177<pre class="programlisting"><span class="identifier">Previous</span> <span class="identifier">run</span> <span class="identifier">crashed</span><span class="special">:</span> 178 <span class="number">0</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007F2EC0A6A8EF</span> 179 <span class="number">1</span><span class="special">#</span> <span class="identifier">my_signal_handler</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">37</span> 180 <span class="number">2</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007F2EBFD84CB0</span> 181 <span class="number">3</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007F2EBFD84C37</span> 182 <span class="number">4</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007F2EBFD88028</span> 183 <span class="number">5</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007F2EC0395BBD</span> 184 <span class="number">6</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007F2EC0393B96</span> 185 <span class="number">7</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007F2EC0393BE1</span> 186 <span class="number">8</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">18</span> 187 <span class="number">9</span><span class="special">#</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">22</span> 188<span class="number">10</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">14</span> 189<span class="number">11</span><span class="special">#</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">22</span> 190<span class="number">12</span><span class="special">#</span> <span class="identifier">main</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">84</span> 191<span class="number">13</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007F2EBFD6FF45</span> 192<span class="number">14</span><span class="special">#</span> <span class="number">0x0000000000402209</span> 193</pre> 194<div class="note"><table border="0" summary="Note"> 195<tr> 196<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td> 197<th align="left">Note</th> 198</tr> 199<tr><td align="left" valign="top"><p> 200 Function names from shared libraries may not be decoded due to address 201 space layout randomization. Still better than nothing. 202 </p></td></tr> 203</table></div> 204</div> 205<div class="section"> 206<div class="titlepage"><div><div><h3 class="title"> 207<a name="stacktrace.getting_started.better_asserts"></a><a class="link" href="getting_started.html#stacktrace.getting_started.better_asserts" title="Better asserts">Better asserts</a> 208</h3></div></div></div> 209<p> 210 Pretty often assertions provide not enough information to locate the problem. 211 For example you can see the following message on out-of-range access: 212 </p> 213<pre class="programlisting"><span class="special">../../../</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">array</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">:</span><span class="number">123</span><span class="special">:</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">>::</span><span class="keyword">operator</span><span class="special">[](</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">>::</span><span class="identifier">size_type</span><span class="special">)</span> <span class="special">[</span><span class="identifier">with</span> <span class="identifier">T</span> <span class="special">=</span> <span class="keyword">int</span><span class="special">;</span> <span class="keyword">long</span> <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">N</span> <span class="special">=</span> <span class="number">5ul</span><span class="special">]:</span> <span class="identifier">Assertion</span> <span class="char">'(i < N)&&("out of range")'</span> <span class="identifier">failed</span><span class="special">.</span> 214<span class="identifier">Aborted</span> <span class="special">(</span><span class="identifier">core</span> <span class="identifier">dumped</span><span class="special">)</span> 215</pre> 216<p> 217 That's not enough to locate the problem without debugger. There may be thousand 218 code lines in real world examples and hundred places where that assertion 219 could happen. Let's try to improve the assertions, and make them more informative: 220 </p> 221<pre class="programlisting"><span class="comment">// BOOST_ENABLE_ASSERT_DEBUG_HANDLER is defined for the whole project</span> 222<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">stdexcept</span><span class="special">></span> <span class="comment">// std::logic_error</span> 223<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> <span class="comment">// std::cerr</span> 224<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 225 226<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> 227 <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">assertion_failed_msg</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">expr</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">msg</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="comment">/*file*/</span><span class="special">,</span> <span class="keyword">long</span> <span class="comment">/*line*/</span><span class="special">)</span> <span class="special">{</span> 228 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"Expression '"</span> <span class="special"><<</span> <span class="identifier">expr</span> <span class="special"><<</span> <span class="string">"' is false in function '"</span> <span class="special"><<</span> <span class="identifier">function</span> <span class="special"><<</span> <span class="string">"': "</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">msg</span> <span class="special">?</span> <span class="identifier">msg</span> <span class="special">:</span> <span class="string">"<...>"</span><span class="special">)</span> <span class="special"><<</span> <span class="string">".\n"</span> 229 <span class="special"><<</span> <span class="string">"Backtrace:\n"</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 230 231 <span class="identifier">std</span><span class="special">::</span><span class="identifier">abort</span><span class="special">();</span> 232 <span class="special">}</span> 233 234 <span class="keyword">inline</span> <span class="keyword">void</span> <span class="identifier">assertion_failed</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">expr</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">file</span><span class="special">,</span> <span class="keyword">long</span> <span class="identifier">line</span><span class="special">)</span> <span class="special">{</span> 235 <span class="special">::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">assertion_failed_msg</span><span class="special">(</span><span class="identifier">expr</span><span class="special">,</span> <span class="number">0</span> <span class="comment">/*nullptr*/</span><span class="special">,</span> <span class="identifier">function</span><span class="special">,</span> <span class="identifier">file</span><span class="special">,</span> <span class="identifier">line</span><span class="special">);</span> 236 <span class="special">}</span> 237<span class="special">}</span> <span class="comment">// namespace boost</span> 238</pre> 239<p> 240 We've defined the <code class="computeroutput"><span class="identifier">BOOST_ENABLE_ASSERT_DEBUG_HANDLER</span></code> 241 macro for the whole project. Now all the <code class="computeroutput"><span class="identifier">BOOST_ASSERT</span></code> 242 and <code class="computeroutput"><span class="identifier">BOOST_ASSERT_MSG</span></code> will 243 call our functions <code class="computeroutput"><span class="identifier">assertion_failed</span></code> 244 and <code class="computeroutput"><span class="identifier">assertion_failed_msg</span></code> 245 in case of failure. In <code class="computeroutput"><span class="identifier">assertion_failed_msg</span></code> 246 we output information that was provided by the assertion macro and <code class="computeroutput"><a class="link" href="reference.html#boost.stacktrace.stacktrace">boost::stacktrace::stacktrace</a></code>: 247 </p> 248<pre class="programlisting"><span class="identifier">Expression</span> <span class="char">'i < N'</span> <span class="identifier">is</span> <span class="keyword">false</span> <span class="identifier">in</span> <span class="identifier">function</span> <span class="char">'T& boost::array<T, N>::operator[](boost::array<T, N>::size_type) [with T = int; long unsigned int N = 5ul; boost::array<T, N>::reference = int&; boost::array<T, N>::size_type = long unsigned int]'</span><span class="special">:</span> <span class="identifier">out</span> <span class="identifier">of</span> <span class="identifier">range</span><span class="special">.</span> 249<span class="identifier">Backtrace</span><span class="special">:</span> 250 <span class="number">0</span><span class="special">#</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">assertion_failed_msg</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*,</span> <span class="keyword">long</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">39</span> 251 <span class="number">1</span><span class="special">#</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">5ul</span><span class="special">>::</span><span class="keyword">operator</span><span class="special">[](</span><span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../../../</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">array</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">:</span><span class="number">124</span> 252 <span class="number">2</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">17</span> 253 <span class="number">3</span><span class="special">#</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">25</span> 254 <span class="number">4</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">17</span> 255 <span class="number">5</span><span class="special">#</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">25</span> 256 <span class="number">6</span><span class="special">#</span> <span class="identifier">main</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">54</span> 257 <span class="number">7</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007F991FD69F45</span> <span class="identifier">in</span> <span class="special">/</span><span class="identifier">lib</span><span class="special">/</span><span class="identifier">x86_64</span><span class="special">-</span><span class="identifier">linux</span><span class="special">-</span><span class="identifier">gnu</span><span class="special">/</span><span class="identifier">libc</span><span class="special">.</span><span class="identifier">so</span><span class="special">.</span><span class="number">6</span> 258 <span class="number">8</span><span class="special">#</span> <span class="number">0x0000000000401139</span> 259</pre> 260<p> 261 Now we do know the steps that led to the assertion and can find the error 262 without debugger. 263 </p> 264</div> 265<div class="section"> 266<div class="titlepage"><div><div><h3 class="title"> 267<a name="stacktrace.getting_started.exceptions_with_stacktrace"></a><a class="link" href="getting_started.html#stacktrace.getting_started.exceptions_with_stacktrace" title="Exceptions with stacktrace">Exceptions 268 with stacktrace</a> 269</h3></div></div></div> 270<p> 271 You can provide more information along with exception by embedding stacktraces 272 into the exception. There are many ways to do that, here's how to do that 273 using Boost.Exception: 274 </p> 275<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 276 Declare a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">error_info</span></code> typedef that holds the stacktrace: 277 </li></ul></div> 278<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 279<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">exception</span><span class="special">/</span><span class="identifier">all</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 280 281<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">error_info</span><span class="special"><</span><span class="keyword">struct</span> <span class="identifier">tag_stacktrace</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">></span> <span class="identifier">traced</span><span class="special">;</span> 282</pre> 283<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 284 Write a helper class for throwing any exception with stacktrace: 285 </li></ul></div> 286<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">></span> 287<span class="keyword">void</span> <span class="identifier">throw_with_trace</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">E</span><span class="special">&</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span> 288 <span class="keyword">throw</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">enable_error_info</span><span class="special">(</span><span class="identifier">e</span><span class="special">)</span> 289 <span class="special"><<</span> <span class="identifier">traced</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">());</span> 290<span class="special">}</span> 291</pre> 292<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 293 Use <code class="computeroutput"><span class="identifier">throw_with_trace</span><span class="special">(</span><span class="identifier">E</span><span class="special">);</span></code> instead of just <code class="computeroutput"><span class="keyword">throw</span> 294 <span class="identifier">E</span><span class="special">;</span></code>: 295 </li></ul></div> 296<pre class="programlisting"><span class="keyword">if</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">>=</span> <span class="number">4</span><span class="special">)</span> 297 <span class="identifier">throw_with_trace</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">out_of_range</span><span class="special">(</span><span class="string">"'i' must be less than 4 in oops()"</span><span class="special">));</span> 298<span class="keyword">if</span> <span class="special">(</span><span class="identifier">i</span> <span class="special"><=</span> <span class="number">0</span><span class="special">)</span> 299 <span class="identifier">throw_with_trace</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"'i' must be greater than zero in oops()"</span><span class="special">));</span> 300</pre> 301<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"> 302 Process exceptions: 303 </li></ul></div> 304<pre class="programlisting"><span class="keyword">try</span> <span class="special">{</span> 305 <span class="identifier">foo</span><span class="special">(</span><span class="number">5</span><span class="special">);</span> <span class="comment">// testing assert handler</span> 306<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">&</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span> 307 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 308 <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">*</span> <span class="identifier">st</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">get_error_info</span><span class="special"><</span><span class="identifier">traced</span><span class="special">>(</span><span class="identifier">e</span><span class="special">);</span> 309 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">st</span><span class="special">)</span> <span class="special">{</span> 310 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="special">*</span><span class="identifier">st</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 311 <span class="special">}</span> 312<span class="special">}</span> 313</pre> 314<p> 315 Code from above will output: 316 </p> 317<pre class="programlisting"><span class="char">'i'</span> <span class="identifier">must</span> <span class="keyword">not</span> <span class="identifier">be</span> <span class="identifier">greater</span> <span class="identifier">than</span> <span class="identifier">zero</span> <span class="identifier">in</span> <span class="identifier">oops</span><span class="special">()</span> 318 <span class="number">0</span><span class="special">#</span> <span class="keyword">void</span> <span class="identifier">throw_with_trace</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">>(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">22</span> 319 <span class="number">1</span><span class="special">#</span> <span class="identifier">oops</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">38</span> 320 <span class="number">2</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">54</span> 321 <span class="number">3</span><span class="special">#</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">59</span> 322 <span class="number">4</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">49</span> 323 <span class="number">5</span><span class="special">#</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">59</span> 324 <span class="number">6</span><span class="special">#</span> <span class="identifier">main</span> <span class="identifier">at</span> <span class="special">../</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">76</span> 325 <span class="number">7</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x00007FAC113BEF45</span> <span class="identifier">in</span> <span class="special">/</span><span class="identifier">lib</span><span class="special">/</span><span class="identifier">x86_64</span><span class="special">-</span><span class="identifier">linux</span><span class="special">-</span><span class="identifier">gnu</span><span class="special">/</span><span class="identifier">libc</span><span class="special">.</span><span class="identifier">so</span><span class="special">.</span><span class="number">6</span> 326 <span class="number">8</span><span class="special">#</span> <span class="number">0x0000000000402ED9</span> 327</pre> 328</div> 329<div class="section"> 330<div class="titlepage"><div><div><h3 class="title"> 331<a name="stacktrace.getting_started.enabling_and_disabling_stacktrac"></a><a class="link" href="getting_started.html#stacktrace.getting_started.enabling_and_disabling_stacktrac" title="Enabling and disabling stacktraces">Enabling 332 and disabling stacktraces</a> 333</h3></div></div></div> 334<p> 335 At some point arises a requirement to easily enable/disable stacktraces for 336 a whole project. That could be easily achieved. 337 </p> 338<p> 339 Just define <span class="bold"><strong>BOOST_STACKTRACE_LINK</strong></span> for a 340 whole project. Now you can enable/disable stacktraces by just linking with 341 different libraries: 342 </p> 343<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 344<li class="listitem"> 345 link with <code class="computeroutput"><span class="identifier">boost_stacktrace_noop</span></code> 346 to disable backtracing 347 </li> 348<li class="listitem"> 349 link with other <code class="computeroutput"><span class="identifier">boost_stacktrace_</span><span class="special">*</span></code> libraries 350 </li> 351</ul></div> 352<p> 353 See <a class="link" href="configuration_and_build.html" title="Configuration and Build">section "Configuration 354 and Build"</a> for more info. 355 </p> 356</div> 357<div class="section"> 358<div class="titlepage"><div><div><h3 class="title"> 359<a name="stacktrace.getting_started.saving_stacktraces_by_specified_"></a><a class="link" href="getting_started.html#stacktrace.getting_started.saving_stacktraces_by_specified_" title="Saving stacktraces by specified format">Saving 360 stacktraces by specified format</a> 361</h3></div></div></div> 362<p> 363 <code class="computeroutput"><a class="link" href="reference.html#boost.stacktrace.stacktrace">boost::stacktrace::stacktrace</a></code> 364 provides access to individual <code class="computeroutput"><a class="link" href="../boost/stacktrace/frame.html" title="Class frame">frames</a></code> 365 of the stacktrace, so that you could save stacktrace information in your 366 own format. Consider the example, that saves only function addresses of each 367 frame: 368 </p> 369<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 370<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> <span class="comment">// std::cout</span> 371 372<span class="keyword">namespace</span> <span class="identifier">bs</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">;</span> 373<span class="keyword">void</span> <span class="identifier">dump_compact</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">bs</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">&</span> <span class="identifier">st</span><span class="special">)</span> <span class="special">{</span> 374 <span class="keyword">for</span> <span class="special">(</span><span class="identifier">bs</span><span class="special">::</span><span class="identifier">frame</span> <span class="identifier">frame</span><span class="special">:</span> <span class="identifier">st</span><span class="special">)</span> <span class="special">{</span> 375 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">frame</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span> <span class="special"><<</span> <span class="char">','</span><span class="special">;</span> 376 <span class="special">}</span> 377 378 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 379<span class="special">}</span> 380</pre> 381<p> 382 Code from above will output: 383 </p> 384<pre class="programlisting"><span class="number">0</span><span class="identifier">x7fbcfd17f6b5</span><span class="special">,</span><span class="number">0x400d4a</span><span class="special">,</span><span class="number">0x400d61</span><span class="special">,</span><span class="number">0x400d61</span><span class="special">,</span><span class="number">0x400d61</span><span class="special">,</span><span class="number">0x400d61</span><span class="special">,</span><span class="number">0x400d77</span><span class="special">,</span><span class="number">0x400cbf</span><span class="special">,</span><span class="number">0x400dc0</span><span class="special">,</span><span class="number">0</span><span class="identifier">x7fbcfc82d830</span><span class="special">,</span><span class="number">0x400a79</span><span class="special">,</span> 385</pre> 386</div> 387<div class="section"> 388<div class="titlepage"><div><div><h3 class="title"> 389<a name="stacktrace.getting_started.getting_function_information_fro"></a><a class="link" href="getting_started.html#stacktrace.getting_started.getting_function_information_fro" title="Getting function information from pointer">Getting 390 function information from pointer</a> 391</h3></div></div></div> 392<p> 393 <code class="computeroutput"><a class="link" href="../boost/stacktrace/frame.html" title="Class frame">boost::stacktrace::frame</a></code> 394 provides information about functions. You may construct that class from function 395 pointer and get the function name at runtime: 396 </p> 397<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">signal</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span> <span class="comment">// ::signal</span> 398<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">/</span><span class="identifier">frame</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 399<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span> <span class="comment">// std::cerr</span> 400<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cstdlib</span><span class="special">></span> <span class="comment">// std::exit</span> 401 402<span class="keyword">void</span> <span class="identifier">print_signal_handler_and_exit</span><span class="special">()</span> <span class="special">{</span> 403 <span class="keyword">typedef</span> <span class="keyword">void</span><span class="special">(*</span><span class="identifier">function_t</span><span class="special">)(</span><span class="keyword">int</span><span class="special">);</span> 404 405 <span class="identifier">function_t</span> <span class="identifier">old_signal_function</span> <span class="special">=</span> <span class="special">::</span><span class="identifier">signal</span><span class="special">(</span><span class="identifier">SIGSEGV</span><span class="special">,</span> <span class="identifier">SIG_DFL</span><span class="special">);</span> 406 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">frame</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">old_signal_function</span><span class="special">);</span> 407 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">f</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 408 <span class="identifier">std</span><span class="special">::</span><span class="identifier">exit</span><span class="special">(</span><span class="number">0</span><span class="special">);</span> 409<span class="special">}</span> 410</pre> 411<p> 412 Code from above will output: 413 </p> 414<pre class="programlisting"><span class="identifier">my_signal_handler</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="identifier">at</span> <span class="identifier">boost</span><span class="special">/</span><span class="identifier">libs</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">/</span><span class="identifier">example</span><span class="special">/</span><span class="identifier">debug_function</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">21</span> 415</pre> 416</div> 417<div class="section"> 418<div class="titlepage"><div><div><h3 class="title"> 419<a name="stacktrace.getting_started.global_control_over_stacktrace_o"></a><a class="link" href="getting_started.html#stacktrace.getting_started.global_control_over_stacktrace_o" title="Global control over stacktrace output format">Global 420 control over stacktrace output format</a> 421</h3></div></div></div> 422<p> 423 You may override the behavior of default stacktrace output operator by defining 424 the macro from Boost.Config <code class="computeroutput">BOOST_USER_CONFIG</code> 425 to point to a file like following: 426 </p> 427<pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">USER_CONFIG_HPP</span> 428<span class="preprocessor">#define</span> <span class="identifier">USER_CONFIG_HPP</span> 429 430<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">/</span><span class="identifier">stacktrace_fwd</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 431 432<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iosfwd</span><span class="special">></span> 433 434<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">stacktrace</span> <span class="special">{</span> 435 436<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">TraitsT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span> 437<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">do_stream_st</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">basic_stacktrace</span><span class="special"><</span><span class="identifier">Allocator</span><span class="special">>&</span> <span class="identifier">bt</span><span class="special">);</span> 438 439<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">TraitsT</span><span class="special">></span> 440<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">stacktrace</span><span class="special">&</span> <span class="identifier">bt</span><span class="special">)</span> <span class="special">{</span> 441 <span class="keyword">return</span> <span class="identifier">do_stream_st</span><span class="special">(</span><span class="identifier">os</span><span class="special">,</span> <span class="identifier">bt</span><span class="special">);</span> 442<span class="special">}</span> 443 444<span class="special">}}</span> <span class="comment">// namespace boost::stacktrace</span> 445<span class="preprocessor">#endif</span> <span class="comment">// USER_CONFIG_HPP</span> 446</pre> 447<p> 448 Implementation of <code class="computeroutput"><span class="identifier">do_stream_st</span></code> 449 may be the following: 450 </p> 451<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">stacktrace</span> <span class="special">{</span> 452 453<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">TraitsT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">></span> 454<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">do_stream_st</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">basic_stacktrace</span><span class="special"><</span><span class="identifier">Allocator</span><span class="special">>&</span> <span class="identifier">bt</span><span class="special">)</span> <span class="special">{</span> 455 <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">w</span> <span class="special">=</span> <span class="identifier">os</span><span class="special">.</span><span class="identifier">width</span><span class="special">();</span> 456 <span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">frames</span> <span class="special">=</span> <span class="identifier">bt</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> 457 <span class="keyword">for</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">frames</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 458 <span class="identifier">os</span><span class="special">.</span><span class="identifier">width</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> 459 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">;</span> 460 <span class="identifier">os</span><span class="special">.</span><span class="identifier">width</span><span class="special">(</span><span class="identifier">w</span><span class="special">);</span> 461 <span class="identifier">os</span> <span class="special"><<</span> <span class="string">"# "</span><span class="special">;</span> 462 <span class="identifier">os</span> <span class="special"><<</span> <span class="identifier">bt</span><span class="special">[</span><span class="identifier">i</span><span class="special">].</span><span class="identifier">name</span><span class="special">();</span> 463 <span class="identifier">os</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> 464 <span class="special">}</span> 465 466 <span class="keyword">return</span> <span class="identifier">os</span><span class="special">;</span> 467<span class="special">}</span> 468 469<span class="special">}}</span> <span class="comment">// namespace boost::stacktrace</span> 470</pre> 471<p> 472 Code from above will output: 473 </p> 474<pre class="programlisting"><span class="identifier">Terminate</span> <span class="identifier">called</span><span class="special">:</span> 475 <span class="number">0</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> 476 <span class="number">1</span><span class="special">#</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> 477 <span class="number">2</span><span class="special">#</span> <span class="identifier">bar</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> 478 <span class="number">3</span><span class="special">#</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> 479</pre> 480</div> 481</div> 482<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 483<td align="left"></td> 484<td align="right"><div class="copyright-footer">Copyright © 2016-2020 Antony Polukhin<p> 485 Distributed under the Boost Software License, Version 1.0. (See accompanying 486 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 487 </p> 488</div></td> 489</tr></table> 490<hr> 491<div class="spirit-nav"> 492<a accesskey="p" href="../stacktrace.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stacktrace.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="configuration_and_build.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 493</div> 494</body> 495</html> 496