Docs regenerated

This commit is contained in:
Antony Polukhin
2016-12-10 22:10:56 +03:00
parent 8a33d78892
commit 8efc8fcfdc
11 changed files with 349 additions and 454 deletions

View File

@@ -29,16 +29,20 @@
<div class="toc"><dl>
<dt><span class="section"><a href="getting_started.html#boost_stacktrace.getting_started.how_to_print_current_call_stack">How
to print current call stack</a></span></dt>
<dt><span class="section"><a href="getting_started.html#boost_stacktrace.getting_started.handle_terminates_and_segmentati">Handle
Terminates and Segmentation Faults</a></span></dt>
<dt><span class="section"><a href="getting_started.html#boost_stacktrace.getting_started.handle_terminates_aborts_and_seg">Handle
terminates, aborts and Segmentation Faults</a></span></dt>
<dt><span class="section"><a href="getting_started.html#boost_stacktrace.getting_started.better_asserts">Better
asserts</a></span></dt>
<dt><span class="section"><a href="getting_started.html#boost_stacktrace.getting_started.exceptions_with_stacktrace">Exceptions
with Stacktrace</a></span></dt>
with stacktrace</a></span></dt>
<dt><span class="section"><a href="getting_started.html#boost_stacktrace.getting_started.enabling_and_disabling_stacktrac">Enabling
and Disabling stacktraces</a></span></dt>
and disabling stacktraces</a></span></dt>
<dt><span class="section"><a href="getting_started.html#boost_stacktrace.getting_started.saving_stacktraces_by_specified_">Saving
stacktraces by specified format</a></span></dt>
<dt><span class="section"><a href="getting_started.html#boost_stacktrace.getting_started.getting_function_information_fro">Getting
function information from pointer</a></span></dt>
<dt><span class="section"><a href="getting_started.html#boost_stacktrace.getting_started.global_control_over_stacktrace_o">Global
control over stacktrace output format</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
@@ -84,8 +88,8 @@
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_stacktrace.getting_started.handle_terminates_and_segmentati"></a><a class="link" href="getting_started.html#boost_stacktrace.getting_started.handle_terminates_and_segmentati" title="Handle Terminates and Segmentation Faults">Handle
Terminates and Segmentation Faults</a>
<a name="boost_stacktrace.getting_started.handle_terminates_aborts_and_seg"></a><a class="link" href="getting_started.html#boost_stacktrace.getting_started.handle_terminates_aborts_and_seg" title="Handle terminates, aborts and Segmentation Faults">Handle
terminates, aborts and Segmentation Faults</a>
</h3></div></div></div>
<p>
Segmentation Faults and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>
@@ -108,11 +112,12 @@
<span class="special">}</span>
<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>
<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>
<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">bt</span><span class="special">;</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">bt</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special">&lt;&lt;</span> <span class="string">"Signal "</span> <span class="special">&lt;&lt;</span> <span class="identifier">signum</span> <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> <span class="comment">// <sup>[<a name="boost_stacktrace.getting_started.handle_terminates_and_segmentati.f0" href="#ftn.boost_stacktrace.getting_started.handle_terminates_and_segmentati.f0" class="footnote">1</a>]</sup></span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special">&lt;&lt;</span> <span class="string">"Signal "</span> <span class="special">&lt;&lt;</span> <span class="identifier">signum</span> <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> <span class="comment">// <sup>[<a name="boost_stacktrace.getting_started.handle_terminates_aborts_and_seg.f0" href="#ftn.boost_stacktrace.getting_started.handle_terminates_aborts_and_seg.f0" class="footnote">1</a>]</sup></span>
<span class="special">}</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">abort</span><span class="special">();</span>
<span class="identifier">_Exit</span><span class="special">(-</span><span class="number">1</span><span class="special">);</span>
<span class="special">}</span>
</pre>
<p>
@@ -121,56 +126,44 @@
</p>
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">set_terminate</span><span class="special">(&amp;</span><span class="identifier">my_terminate_handler</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="special">&amp;</span><span class="identifier">my_signal_handler</span><span class="special">);</span>
<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>
</pre>
<p>
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>
call:
</p>
<pre class="programlisting"><span class="identifier">Terminate</span> <span class="identifier">called</span><span class="special">:</span>
<span class="number">0</span><span class="special">#</span> <span class="identifier">my_terminate_handler</span><span class="special">()</span>
<span class="number">1</span><span class="special">#</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">__exception_ptr</span><span class="special">::</span><span class="identifier">exception_ptr</span><span class="special">)</span>
<span class="number">2</span><span class="special">#</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span>
<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="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="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="number">6</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="number">7</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="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="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="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="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="number">12</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="number">13</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="number">14</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="number">15</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="number">16</span><span class="special">#</span> <span class="identifier">main</span>
<span class="number">17</span><span class="special">#</span> <span class="identifier">__libc_start_main</span>
<span class="number">18</span><span class="special">#</span> <span class="identifier">_start</span>
<span class="number">19</span><span class="special">#</span> <span class="special">??</span>
<span class="number">0</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">detail</span><span class="special">::</span><span class="identifier">backend</span><span class="special">::</span><span class="identifier">backend</span><span class="special">(</span><span class="keyword">void</span><span class="special">**,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span>
<span class="number">1</span><span class="special">#</span> <span class="identifier">my_terminate_handler</span><span class="special">()</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">37</span>
<span class="number">2</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x7f624107a6b6</span>
<span class="number">3</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x7f624107a701</span>
<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">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">18</span>
<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">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">22</span>
<span class="number">6</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">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">18</span>
<span class="number">7</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">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">22</span>
<span class="number">8</span><span class="special">#</span> <span class="identifier">main</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">64</span>
<span class="number">9</span><span class="special">#</span> <span class="identifier">__libc_start_main</span>
<span class="number">10</span><span class="special">#</span> <span class="identifier">_start</span>
</pre>
<p>
And the following output on Segmentation Fault:
And the following output on Abort:
</p>
<pre class="programlisting"><span class="identifier">Signal</span> <span class="number">11</span><span class="special">,</span> <span class="identifier">backtrace</span><span class="special">:</span>
<span class="number">0</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="number">1</span><span class="special">#</span> <span class="identifier">killpg</span>
<span class="number">2</span><span class="special">#</span> <span class="special">??</span>
<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="number">4</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="number">5</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="number">6</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="number">7</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="number">8</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="number">9</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="number">10</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="number">11</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="number">12</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="number">13</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="number">14</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="number">15</span><span class="special">#</span> <span class="identifier">main</span>
<span class="number">16</span><span class="special">#</span> <span class="identifier">__libc_start_main</span>
<span class="number">17</span><span class="special">#</span> <span class="identifier">_start</span>
<span class="number">18</span><span class="special">#</span> <span class="special">??</span>
<pre class="programlisting"><span class="identifier">Signal</span> <span class="number">6</span><span class="special">,</span> <span class="identifier">backtrace</span><span class="special">:</span>
<span class="number">0</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">detail</span><span class="special">::</span><span class="identifier">backend</span><span class="special">::</span><span class="identifier">backend</span><span class="special">(</span><span class="keyword">void</span><span class="special">**,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span>
<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="number">2</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x7f6240a3a4b0</span>
<span class="number">3</span><span class="special">#</span> <span class="identifier">gsignal</span>
<span class="number">4</span><span class="special">#</span> <span class="identifier">abort</span>
<span class="number">5</span><span class="special">#</span> <span class="identifier">my_terminate_handler</span><span class="special">()</span>
<span class="number">6</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x7f624107a6b6</span>
<span class="number">7</span><span class="special">#</span> <span class="number">0</span><span class="identifier">x7f624107a701</span>
<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">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">18</span>
<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">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">22</span>
<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">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">18</span>
<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">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">22</span>
<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">data</span><span class="special">/</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">terminate_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">64</span>
<span class="number">13</span><span class="special">#</span> <span class="identifier">__libc_start_main</span>
<span class="number">14</span><span class="special">#</span> <span class="identifier">_start</span>
</pre>
<p>
The output stacktrace may be corrupted by previous actions. But now at least
@@ -200,13 +193,13 @@
<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>
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</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="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>
<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="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>
<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>
<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>
<span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"assertion"</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">abort</span><span class="special">();</span>
<span class="special">}</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>
<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>
<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>
<span class="special">}</span>
<span class="special">}</span> <span class="comment">// namespace boost</span>
@@ -220,27 +213,18 @@
in case of failure. In <code class="computeroutput"><span class="identifier">assertion_failed_msg</span></code>
we output information that was provided by the assertion macro and <code class="computeroutput"><a class="link" href="../boost_stacktrace_header_reference.html#boost.stacktrace.stacktrace">boost::stacktrace::stacktrace</a></code>:
</p>
<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]'</span><span class="special">:</span> <span class="identifier">out</span> <span class="identifier">of</span> <span class="identifier">range</span><span class="special">.</span>
<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>
<span class="identifier">Backtrace</span><span class="special">:</span>
<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="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="number">2</span><span class="special">#</span> <span class="identifier">oops</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span>
<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="number">4</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="number">5</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="number">6</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="number">7</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="number">8</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="number">9</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="number">10</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="number">11</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="number">12</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="number">13</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="number">14</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="number">15</span><span class="special">#</span> <span class="identifier">main</span>
<span class="number">16</span><span class="special">#</span> <span class="identifier">__libc_start_main</span>
<span class="number">17</span><span class="special">#</span> <span class="identifier">_start</span>
<span class="number">18</span><span class="special">#</span> <span class="special">??</span>
<span class="number">0</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">detail</span><span class="special">::</span><span class="identifier">backend</span><span class="special">::</span><span class="identifier">backend</span><span class="special">(</span><span class="keyword">void</span><span class="special">**,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span>
<span class="number">1</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">data</span><span class="special">/</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">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">38</span>
<span class="number">2</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="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">data</span><span class="special">/</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">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">16</span>
<span class="number">4</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">data</span><span class="special">/</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">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">24</span>
<span class="number">5</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">data</span><span class="special">/</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">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">20</span>
<span class="number">6</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">data</span><span class="special">/</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">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">24</span>
<span class="number">7</span><span class="special">#</span> <span class="identifier">main</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">data</span><span class="special">/</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">assert_handler</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">53</span>
<span class="number">8</span><span class="special">#</span> <span class="identifier">__libc_start_main</span>
<span class="number">9</span><span class="special">#</span> <span class="identifier">_start</span>
</pre>
<p>
Now we do know the steps that led to the assertion and can find the error
@@ -249,27 +233,21 @@
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_stacktrace.getting_started.exceptions_with_stacktrace"></a><a class="link" href="getting_started.html#boost_stacktrace.getting_started.exceptions_with_stacktrace" title="Exceptions with Stacktrace">Exceptions
with Stacktrace</a>
<a name="boost_stacktrace.getting_started.exceptions_with_stacktrace"></a><a class="link" href="getting_started.html#boost_stacktrace.getting_started.exceptions_with_stacktrace" title="Exceptions with stacktrace">Exceptions
with stacktrace</a>
</h3></div></div></div>
<p>
You can provide more information along with exception by embedding stacktraces
into the exception. For that we will need:
into the exception. For that you will need to:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Basic class that holds the stacktrace:
Write a basic class that holds the stacktrace:
</li></ul></div>
<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>
<span class="keyword">struct</span> <span class="identifier">traced</span> <span class="special">{</span>
<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="identifier">trace</span><span class="special">;</span>
<span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">what</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
<span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">traced</span><span class="special">(){}</span>
<span class="special">};</span>
</pre>
<p>
[getting_stated_class_traced]
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Helper class for appending class <code class="computeroutput"><span class="identifier">traced</span></code>
Write a helper class for appending class <code class="computeroutput"><span class="identifier">traced</span></code>
to any exception:
</li></ul></div>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Exception</span><span class="special">&gt;</span>
@@ -310,32 +288,25 @@
<p>
Code from above will output:
</p>
<pre class="programlisting"><span class="char">'i'</span> <span class="identifier">must</span> <span class="identifier">be</span> <span class="identifier">less</span> <span class="identifier">than</span> <span class="number">4</span> <span class="identifier">in</span> <span class="identifier">oops</span><span class="special">()</span>
<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>
<span class="identifier">Backtrace</span><span class="special">:</span>
<span class="number">0</span><span class="special">#</span> <span class="identifier">with_trace</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">out_of_range</span><span class="special">&gt;::</span><span class="identifier">with_trace</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">(&amp;)</span> <span class="special">[</span><span class="number">34</span><span class="special">]&gt;(</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">(&amp;)</span> <span class="special">[</span><span class="number">34</span><span class="special">])</span>
<span class="number">1</span><span class="special">#</span> <span class="identifier">oops</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span>
<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="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="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="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="number">6</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="number">7</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="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="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="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="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="number">12</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="number">13</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="number">14</span><span class="special">#</span> <span class="identifier">main</span>
<span class="number">15</span><span class="special">#</span> <span class="identifier">__libc_start_main</span>
<span class="number">16</span><span class="special">#</span> <span class="identifier">_start</span>
<span class="number">17</span><span class="special">#</span> <span class="special">??</span>
<span class="number">0</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">detail</span><span class="special">::</span><span class="identifier">backend</span><span class="special">::</span><span class="identifier">backend</span><span class="special">(</span><span class="keyword">void</span><span class="special">**,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span>
<span class="number">1</span><span class="special">#</span> <span class="identifier">traced</span><span class="special">::</span><span class="identifier">traced</span><span class="special">()</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">data</span><span class="special">/</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">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">20</span>
<span class="number">2</span><span class="special">#</span> <span class="identifier">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">with_trace</span><span class="special">&lt;</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">(&amp;)</span> <span class="special">[</span><span class="number">44</span><span class="special">]&gt;(</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">(&amp;)</span> <span class="special">[</span><span class="number">44</span><span class="special">])</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">data</span><span class="special">/</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">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">33</span>
<span class="number">3</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="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">data</span><span class="special">/</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">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">70</span>
<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">data</span><span class="special">/</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">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">75</span>
<span class="number">6</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">data</span><span class="special">/</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">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">65</span>
<span class="number">7</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">data</span><span class="special">/</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">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">75</span>
<span class="number">8</span><span class="special">#</span> <span class="identifier">main</span> <span class="identifier">at</span> <span class="special">/</span><span class="identifier">data</span><span class="special">/</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">throwing_st</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">93</span>
<span class="number">9</span><span class="special">#</span> <span class="identifier">__libc_start_main</span>
<span class="number">10</span><span class="special">#</span> <span class="identifier">_start</span>
</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_stacktrace.getting_started.enabling_and_disabling_stacktrac"></a><a class="link" href="getting_started.html#boost_stacktrace.getting_started.enabling_and_disabling_stacktrac" title="Enabling and Disabling stacktraces">Enabling
and Disabling stacktraces</a>
<a name="boost_stacktrace.getting_started.enabling_and_disabling_stacktrac"></a><a class="link" href="getting_started.html#boost_stacktrace.getting_started.enabling_and_disabling_stacktrac" title="Enabling and disabling stacktraces">Enabling
and disabling stacktraces</a>
</h3></div></div></div>
<p>
At some point arises a requirement to easily enable/disable stacktraces for
@@ -387,12 +358,106 @@
<p>
Code from above will output:
</p>
<pre class="programlisting"><span class="number">0x401a25</span><span class="special">,</span><span class="number">0x401a25</span><span class="special">,</span><span class="number">0x401a25</span><span class="special">,</span><span class="number">0x401a25</span><span class="special">,</span><span class="number">0x401a25</span><span class="special">,</span><span class="number">0x401a25</span><span class="special">,</span><span class="number">0x4019cb</span><span class="special">,</span><span class="number">0x401a7f</span><span class="special">,</span><span class="number">0</span><span class="identifier">x7f9da8a46e50</span><span class="special">,</span><span class="number">0x4013e0</span><span class="special">,</span><span class="number">0</span><span class="special">,</span>
<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>
</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_stacktrace.getting_started.getting_function_information_fro"></a><a class="link" href="getting_started.html#boost_stacktrace.getting_started.getting_function_information_fro" title="Getting function information from pointer">Getting
function information from pointer</a>
</h3></div></div></div>
<p>
<code class="computeroutput"><a class="link" href="../boost/stacktrace/frame.html" title="Class frame">boost::stacktrace::frame</a></code>
provides information about functions. You may construct that class from function
pointer and get the function name at runtime:
</p>
<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>
<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>
<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>
<span class="keyword">void</span> <span class="identifier">print_signal_handler_and_exit</span><span class="special">()</span> <span class="special">{</span>
<span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span> <span class="special">=</span> <span class="keyword">reinterpret_cast</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;(::</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>
<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">p</span><span class="special">);</span>
<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>
<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>
<span class="special">}</span>
</pre>
<p>
Code from above will output:
</p>
<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="special">/</span><span class="identifier">data</span><span class="special">/</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>
</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_stacktrace.getting_started.global_control_over_stacktrace_o"></a><a class="link" href="getting_started.html#boost_stacktrace.getting_started.global_control_over_stacktrace_o" title="Global control over stacktrace output format">Global
control over stacktrace output format</a>
</h3></div></div></div>
<p>
You may control maximal stacktrace length using <code class="computeroutput"><a class="link" href="../BOOST_STACKTRACE_DEFAULT_MAX_DEPTH.html" title="Macro BOOST_STACKTRACE_DEFAULT_MAX_DEPTH">BOOST_STACKTRACE_DEFAULT_MAX_DEPTH</a></code>
and even override the behavior of default stacktrace output operator by defining
the macro from Boost.Config <code class="computeroutput">BOOST_USER_CONFIG</code>
to point to a file like following:
</p>
<pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">USER_CONFIG_HPP</span>
<span class="preprocessor">#define</span> <span class="identifier">USER_CONFIG_HPP</span>
<span class="preprocessor">#define</span> <span class="identifier">BOOST_STACKTRACE_DEFAULT_MAX_DEPTH</span> <span class="number">5</span>
<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>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iosfwd</span><span class="special">&gt;</span>
<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>
<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="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">Depth</span><span class="special">&gt;</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">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">Depth</span><span class="special">&gt;&amp;</span> <span class="identifier">bt</span><span class="special">);</span>
<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>
<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>
<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>
<span class="special">}</span>
<span class="special">}}</span> <span class="comment">// namespace boost::stacktrace</span>
<span class="preprocessor">#endif</span> <span class="comment">// USER_CONFIG_HPP</span>
</pre>
<p>
Implementation of <code class="computeroutput"><span class="identifier">do_stream_st</span></code>
may be the following:
</p>
<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>
<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="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">Depth</span><span class="special">&gt;</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">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">Depth</span><span class="special">&gt;&amp;</span> <span class="identifier">bt</span><span class="special">)</span> <span class="special">{</span>
<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>
<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>
<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>
<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>
<span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="identifier">i</span><span class="special">;</span>
<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>
<span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="string">"# "</span><span class="special">;</span>
<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>
<span class="identifier">os</span> <span class="special">&lt;&lt;</span> <span class="char">'\n'</span><span class="special">;</span>
<span class="special">}</span>
<span class="keyword">return</span> <span class="identifier">os</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">}}</span> <span class="comment">// namespace boost::stacktrace</span>
</pre>
<p>
Code from above will output:
</p>
<pre class="programlisting"><span class="identifier">Terminate</span> <span class="identifier">called</span><span class="special">:</span>
<span class="number">0</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">detail</span><span class="special">::</span><span class="identifier">backend</span><span class="special">::</span><span class="identifier">backend</span><span class="special">(</span><span class="keyword">void</span><span class="special">**,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span>
<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="number">2</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="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="number">4</span><span class="special">#</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span>
</pre>
</div>
<div class="footnotes">
<br><hr width="100" align="left">
<div class="footnote"><p><sup>[<a name="ftn.boost_stacktrace.getting_started.handle_terminates_and_segmentati.f0" href="#boost_stacktrace.getting_started.handle_terminates_and_segmentati.f0" class="para">1</a>] </sup>Strictly speaking this code is not async-signal-safe, because it uses std::cerr. <a class="link" href="build_macros_and_backends.html" title="Build, Macros and Backends">Section "Build, Macros and Backends"</a> describes async-signal-safe backends, so if you will use the noop backend code becomes absolutely valid as that backens always returns 0 frames and <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;</span></code> will be never called. </p></div>
<div class="footnote"><p><sup>[<a name="ftn.boost_stacktrace.getting_started.handle_terminates_aborts_and_seg.f0" href="#boost_stacktrace.getting_started.handle_terminates_aborts_and_seg.f0" class="para">1</a>] </sup>Strictly speaking this code is not async-signal-safe, because it uses std::cerr. <a class="link" href="build_macros_and_backends.html" title="Build, Macros and Backends">Section "Build, Macros and Backends"</a> describes async-signal-safe backends, so if you will use the noop backend code becomes absolutely valid as that backens always returns 0 frames and <code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;</span></code> will be never called. </p></div>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>