diff options
author | johannst <johannst@users.noreply.github.com> | 2022-09-30 10:58:40 +0000 |
---|---|---|
committer | johannst <johannst@users.noreply.github.com> | 2022-09-30 10:58:40 +0000 |
commit | fa7eb205d5f18b72c1e04a4229d171a15040bdea (patch) | |
tree | 2b9965406fb65fdc44ec3eddd2924e5be3f06c8e /print.html | |
parent | 0c31b8e434d634c81479bf396c752d1baaff7603 (diff) | |
download | notes-fa7eb205d5f18b72c1e04a4229d171a15040bdea.tar.gz notes-fa7eb205d5f18b72c1e04a4229d171a15040bdea.zip |
deploy: b6f25b16f1f23b0169e8f076e79ee4964b81db99
Diffstat (limited to 'print.html')
-rw-r--r-- | print.html | 149 |
1 files changed, 148 insertions, 1 deletions
@@ -1552,6 +1552,9 @@ gpg --verify <file>.asc <file> <bp_list>: Space separates list, eg 'command 2 5-8' to run command for breakpoints: 2,5,6,7,8. + + save break <file> + Save breakpoints to <file>. Can be loaded with the `source` command. </code></pre> <h2 id="watchpoints"><a class="header" href="#watchpoints">Watchpoints</a></h2> <pre><code class="language-markdown"> watch [-location|-l] <expr> [thread <tnum>] @@ -1602,7 +1605,10 @@ gpg --verify <file>.asc <file> Show current substitution rules. </code></pre> <h2 id="configuration"><a class="header" href="#configuration">Configuration</a></h2> -<pre><code class="language-markdown"> set follow-fork-mode <child | parent> +<pre><code class="language-markdown"> set disassembly-flavor <intel | att> + Set the disassembly style "flavor". + + set follow-fork-mode <child | parent> Specify which process to follow when debuggee makes a fork(2) syscall. @@ -1704,6 +1710,18 @@ For example create <code>run.gdb</code>:</p> <p>This script can be used as:</p> <pre><code class="language-markdown"> gdb --batch -x ./run.gdb -p <pid> </code></pre> +<h2 id="hook-to-automatically-save-breakpoints-on-quit"><a class="header" href="#hook-to-automatically-save-breakpoints-on-quit">Hook to automatically save breakpoints on <code>quit</code></a></h2> +<pre><code class="language-markdown">define break-save + save breakpoint $arg0.gdb.bp +end +define break-load + source $arg0.gdb.bp +end + +define hook-quit + break-save quit +end +</code></pre> <h1 id="know-bugs"><a class="header" href="#know-bugs">Know Bugs</a></h1> <h2 id="workaround-command--finish-bug"><a class="header" href="#workaround-command--finish-bug">Workaround <code>command + finish</code> bug</a></h2> <p>When using <code>finish</code> inside a <code>command</code> block, commands after <code>finish</code> are not @@ -2604,8 +2622,79 @@ int main() { return 0; } +</code></pre> +<h2 id="example-concepts-pre-c20"><a class="header" href="#example-concepts-pre-c20">Example: Concepts pre c++20</a></h2> +<p>Prior to c++20's concepts, <code>SFINAE</code> and <code>std::void_t</code> can be leveraged to build +something similar allowing to define an interface (aka trait) for a template +parameter.</p> +<pre><code class="language-cpp"> +template<typename T, template<typename> class Checker, typename = void> +struct is_valid : std::false_type {}; + +template<typename T, template<typename> class Checker> +struct is_valid<T, Checker, std::void_t<Checker<T>>> : std::true_type {}; + +template<typename T, template<typename> class Checker> +static constexpr bool is_valid_v = is_valid<T, Checker>::value; + +// ----------------------------------------------------------------------------- + +template<typename T, typename R, template<typename> class Checker, typename = void> +struct is_valid_with_ret : std::false_type {}; + +template<typename T, typename R, template<typename> class Checker> +struct is_valid_with_ret<T, R, Checker, std::void_t<Checker<T>>> : std::is_same<R, Checker<T>> {}; +template<typename T, typename R, template<typename> class Checker> +static constexpr bool is_valid_with_ret_v = is_valid_with_ret<T, R, Checker>::value; + +// ----------------------------------------------------------------------------- + +template<typename T> +struct is_entry { + template<typename TT> + using init = decltype(std::declval<TT>().init()); + template<typename TT> + using tag = decltype(std::declval<TT>().tag()); + template<typename TT> + using val = decltype(std::declval<TT>().val()); + + static constexpr bool value = is_valid_v<T, init> && + is_valid_with_ret_v<T, int, tag> && + is_valid_with_ret_v<T, typename T::Type, val>; +}; + +template<typename T> +static constexpr bool is_entry_v = is_entry<T>::value; + +template<typename E> +struct Entry { + using Type = E; + void init(); + int tag() const; + E val() const; +}; + +int main() { + static_assert(is_entry_v<Entry<bool>>, ""); +} </code></pre> +<p>The main mechanic can be explained with the following reduced example. If one +of the <code>decltype(std:declval<T>...</code> expressions is ill-formed, the template +specialization for <code>is_valid</code> will be removed from the candidate set due to +<a href="https://en.cppreference.com/w/cpp/language/sfinae">SFINAE</a>.</p> +<pre><code class="language-cpp">template<typename T, typename = void> +struct is_valid : std::false_type {}; + +template<typename T> +struct is_valid<T, std::void_t< + decltype(std::declval<T>().some_fun1()), + decltype(std::declval<T>().some_fun2()) + >> : std::true_type {}; +</code></pre> +<blockquote> +<p><code>std::declval<T>()</code> creates an instance of type T in an unevaluated context.</p> +</blockquote> <div style="break-before: page; page-break-before: always;"></div><h1 id="glibc"><a class="header" href="#glibc">glibc</a></h1> <h2 id="malloc-tracer-mtrace3"><a class="header" href="#malloc-tracer-mtrace3">malloc tracer <a href="http://man7.org/linux/man-pages/man3/mtrace.3.html"><code>mtrace(3)</code></a></a></h2> <p>Trace memory allocation and de-allocation to detect memory leaks. @@ -3544,6 +3633,64 @@ ssh <host> tcpdump -i <IF> -w - | sudo wireshark -k -i - </div> </div> </code></pre> +<h1 id="minimal-grid-area"><a class="header" href="#minimal-grid-area">Minimal grid area</a></h1> +<p><a href="web/src/grid-area.html">Rendered html</a></p> +<pre><code class="language-html"><style> +.page-grid { + display: grid; + grid-template-columns: 1fr 2fr; + grid-template-areas: + "h h" + "s m" + "f f"; + gap: 1em; +} +.gh { + grid-area: h; + background-color: orange; +} +.gs { + grid-area: s; + background-color: green; +} +.gm { + grid-area: m; + background-color: gray; +} +.gf { + grid-area: f; + background-color: yellow; +} +.nav-items { + display: flex; /* flexbox model => flexible layout on row */ + justify-content: space-around; /* align flex boxes horizontally with space around */ + align-items: center; /* center flex items vertically */ + list-style: none; +} +p { + margin: 1em; +} +</style> +<div class="page-grid"> + <div class="gh"> + <ul class="nav-items"> + <li class="nav-item"><a href="">aa</a></li> + <li class="nav-item"><a href="">bb</a></li> + <li class="nav-item"><a href="">cc</a></li> + </ul> + </div> + <div class="gs"> + <p>Some text in the second column.</p> + </div> + <div class="gm"> + <p>Some text in the second column.</p> + </div> + <div class="gf"> + <p>Some text in the second column.</p> + </div> +</div> + +</code></pre> <div style="break-before: page; page-break-before: always;"></div><h1 id="arch"><a class="header" href="#arch">Arch</a></h1> <ul> <li><a href="arch/./x86_64.html">x86_64</a></li> |