• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">&lt;</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">&gt;</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">&lt;&lt;</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">&lt;</span><span class="identifier">signal</span><span class="special">.</span><span class="identifier">h</span><span class="special">&gt;</span>     <span class="comment">// ::signal, ::raise</span>
143<span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</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">&amp;</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">&amp;</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">&lt;&lt;</span> <span class="string">"Previous run crashed:\n"</span> <span class="special">&lt;&lt;</span> <span class="identifier">st</span> <span class="special">&lt;&lt;</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">&amp;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;::</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">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">N</span><span class="special">&gt;::</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 &lt; N)&amp;&amp;("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">&lt;</span><span class="identifier">stdexcept</span><span class="special">&gt;</span>    <span class="comment">// std::logic_error</span>
223<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>     <span class="comment">// std::cerr</span>
224<span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</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">&lt;&lt;</span> <span class="string">"Expression '"</span> <span class="special">&lt;&lt;</span> <span class="identifier">expr</span> <span class="special">&lt;&lt;</span> <span class="string">"' is false in function '"</span> <span class="special">&lt;&lt;</span> <span class="identifier">function</span> <span class="special">&lt;&lt;</span> <span class="string">"': "</span> <span class="special">&lt;&lt;</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">"&lt;...&gt;"</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="string">".\n"</span>
229            <span class="special">&lt;&lt;</span> <span class="string">"Backtrace:\n"</span> <span class="special">&lt;&lt;</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">&lt;&lt;</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 &lt; 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&amp; boost::array&lt;T, N&gt;::operator[](boost::array&lt;T, N&gt;::size_type) [with T = int; long unsigned int N = 5ul; boost::array&lt;T, N&gt;::reference = int&amp;; boost::array&lt;T, N&gt;::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">&lt;</span><span class="keyword">int</span><span class="special">,</span> <span class="number">5ul</span><span class="special">&gt;::</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">&lt;</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">&gt;</span>
279<span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</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">&lt;</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">&gt;</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">&lt;</span><span class="keyword">class</span> <span class="identifier">E</span><span class="special">&gt;</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">&amp;</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">&lt;&lt;</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">&gt;=</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">&lt;=</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">&amp;</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">&lt;&lt;</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">()</span> <span class="special">&lt;&lt;</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">&lt;</span><span class="identifier">traced</span><span class="special">&gt;(</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">&lt;&lt;</span> <span class="special">*</span><span class="identifier">st</span> <span class="special">&lt;&lt;</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">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">&gt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span> <span class="keyword">const</span><span class="special">&amp;)</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">&lt;</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">&gt;</span>
370<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</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">&amp;</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">&lt;&lt;</span> <span class="identifier">frame</span><span class="special">.</span><span class="identifier">address</span><span class="special">()</span> <span class="special">&lt;&lt;</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">&lt;&lt;</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">&lt;</span><span class="identifier">signal</span><span class="special">.</span><span class="identifier">h</span><span class="special">&gt;</span>     <span class="comment">// ::signal</span>
398<span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
399<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>     <span class="comment">// std::cerr</span>
400<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cstdlib</span><span class="special">&gt;</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">&lt;&lt;</span> <span class="identifier">f</span> <span class="special">&lt;&lt;</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">&lt;</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">&gt;</span>
431
432<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iosfwd</span><span class="special">&gt;</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">&lt;</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">&gt;</span>
437<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">&gt;&amp;</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">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">basic_stacktrace</span><span class="special">&lt;</span><span class="identifier">Allocator</span><span class="special">&gt;&amp;</span> <span class="identifier">bt</span><span class="special">);</span>
438
439<span class="keyword">template</span> <span class="special">&lt;</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">&gt;</span>
440<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">&gt;&amp;</span> <span class="keyword">operator</span><span class="special">&lt;&lt;(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">stacktrace</span><span class="special">&amp;</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">&lt;</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">&gt;</span>
454<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">&gt;&amp;</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">&lt;</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">&gt;&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">basic_stacktrace</span><span class="special">&lt;</span><span class="identifier">Allocator</span><span class="special">&gt;&amp;</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">&lt;</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">&lt;&lt;</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">&lt;&lt;</span> <span class="string">"# "</span><span class="special">;</span>
462        <span class="identifier">os</span> <span class="special">&lt;&lt;</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">&lt;&lt;</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