mirror of
https://github.com/boostorg/stacktrace.git
synced 2026-01-28 19:52:08 +00:00
Docs regenerated
This commit is contained in:
@@ -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"><<</span> <span class="string">"Signal "</span> <span class="special"><<</span> <span class="identifier">signum</span> <span class="special"><<</span> <span class="string">", backtrace:\n"</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> <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"><<</span> <span class="string">"Signal "</span> <span class="special"><<</span> <span class="identifier">signum</span> <span class="special"><<</span> <span class="string">", backtrace:\n"</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span> <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">(&</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">&</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">&</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"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
|
||||
<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"><<</span> <span class="string">"Expression '"</span> <span class="special"><<</span> <span class="identifier">expr</span> <span class="special"><<</span> <span class="string">"' is false in function '"</span> <span class="special"><<</span> <span class="identifier">function</span> <span class="special"><<</span> <span class="string">"': "</span> <span class="special"><<</span> <span class="special">(</span><span class="identifier">msg</span> <span class="special">?</span> <span class="identifier">msg</span> <span class="special">:</span> <span class="string">"<...>"</span><span class="special">)</span> <span class="special"><<</span> <span class="string">".\n"</span>
|
||||
<span class="special"><<</span> <span class="string">"Backtrace:\n"</span> <span class="special"><<</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">::</span><span class="identifier">stacktrace</span><span class="special">()</span> <span class="special"><<</span> <span class="char">'\n'</span><span class="special">;</span>
|
||||
<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 < N'</span> <span class="identifier">is</span> <span class="keyword">false</span> <span class="identifier">in</span> <span class="identifier">function</span> <span class="char">'T& boost::array<T, N>::operator[](boost::array<T, N>::size_type) [with T = int; long unsigned int N = 5ul]'</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 < N'</span> <span class="identifier">is</span> <span class="keyword">false</span> <span class="identifier">in</span> <span class="identifier">function</span> <span class="char">'T& boost::array<T, N>::operator[](boost::array<T, N>::size_type) [with T = int; long unsigned int N = 5ul; boost::array<T, N>::reference = int&; boost::array<T, N>::size_type = long unsigned int]'</span><span class="special">:</span> <span class="identifier">out</span> <span class="identifier">of</span> <span class="identifier">range</span><span class="special">.</span>
|
||||
<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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">5ul</span><span class="special">>::</span><span class="keyword">operator</span><span class="special">[](</span><span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span>
|
||||
<span class="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"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">5ul</span><span class="special">>::</span><span class="keyword">operator</span><span class="special">[](</span><span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">)</span>
|
||||
<span class="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"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
|
||||
<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"><</span><span class="keyword">class</span> <span class="identifier">Exception</span><span class="special">></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"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">out_of_range</span><span class="special">>::</span><span class="identifier">with_trace</span><span class="special"><</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">(&)</span> <span class="special">[</span><span class="number">34</span><span class="special">]>(</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">(&)</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"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">>::</span><span class="identifier">with_trace</span><span class="special"><</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">(&)</span> <span class="special">[</span><span class="number">44</span><span class="special">]>(</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">(&)</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"><</span><span class="identifier">signal</span><span class="special">.</span><span class="identifier">h</span><span class="special">></span> <span class="comment">// ::signal</span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">/</span><span class="identifier">frame</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></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"><</span><span class="keyword">void</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>
|
||||
<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"><<</span> <span class="identifier">f</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
|
||||
<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"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stacktrace</span><span class="special">/</span><span class="identifier">stacktrace_fwd</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iosfwd</span><span class="special">></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"><</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">do_stream_st</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">basic_stacktrace</span><span class="special"><</span><span class="identifier">Depth</span><span class="special">>&</span> <span class="identifier">bt</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">CharT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">TraitsT</span><span class="special">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="keyword">operator</span><span class="special"><<(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">stacktrace</span><span class="special">&</span> <span class="identifier">bt</span><span class="special">)</span> <span class="special">{</span>
|
||||
<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"><</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">do_stream_st</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span><span class="identifier">CharT</span><span class="special">,</span> <span class="identifier">TraitsT</span><span class="special">>&</span> <span class="identifier">os</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">basic_stacktrace</span><span class="special"><</span><span class="identifier">Depth</span><span class="special">>&</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"><</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"><<</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"><<</span> <span class="string">"# "</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="identifier">i</span><span class="special">].</span><span class="identifier">name</span><span class="special">();</span>
|
||||
<span class="identifier">os</span> <span class="special"><<</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"><<</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"><<</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>
|
||||
|
||||
Reference in New Issue
Block a user