{"id":7830,"date":"2018-05-16T11:14:23","date_gmt":"2018-05-16T11:14:23","guid":{"rendered":"http:\/\/blog.bachi.net\/?p=7830"},"modified":"2018-05-17T13:09:53","modified_gmt":"2018-05-17T13:09:53","slug":"arm-stack-frame-backtrace","status":"publish","type":"post","link":"https:\/\/blog.bachi.net\/?p=7830","title":{"rendered":"ARM Stack Frame \/ Backtrace"},"content":{"rendered":"<p><a href=\"https:\/\/stackoverflow.com\/questions\/15752188\/arm-link-register-and-frame-pointer\">ARM: link register and frame pointer<\/a><br \/>\n<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms253599%28v=vs.90%29.aspx\">ARM Stack Frame Layout<\/a><br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/32623597\/arm-gcc-generated-functions-prolog\">ARM GCC generated functions prolog<\/a><br \/>\n<a href=\"http:\/\/www.cl.cam.ac.uk\/~fms27\/teaching\/2001-02\/arm-project\/02-sort\/apcs.txt\">ARM Procedure Call Standard (APCS)<\/a><br \/>\n<a href=\"http:\/\/infocenter.arm.com\/help\/topic\/com.arm.doc.ihi0042f\/IHI0042F_aapcs.pdf\">Procedure Call Standard for the ARM Architecture (AAPCS)<\/a><br \/>\n<a href=\"https:\/\/community.arm.com\/processors\/b\/blog\/posts\/on-the-aapcs-with-an-application-to-efficient-parameter-passing\">On the AAPCS, with an application to efficient parameter passing<\/a><br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/261419\/arm-to-c-calling-convention-registers-to-save\">ARM to C calling convention, registers to save<\/a><\/p>\n<h3>General<\/h3>\n<p><a href=\"http:\/\/www.a-m-i.de\/tips\/stack\/stack.php\">Der Stack Frame<\/a><br \/>\n<a href=\"http:\/\/blog.reverberate.org\/2013\/05\/deep-wizardry-stack-unwinding.html\">Deep Wizardry: Stack Unwinding<\/a><br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/1395591\/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-they-point\">What is exactly the base pointer and stack pointer? To what do they point?<\/a><br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/2331316\/what-is-stack-unwinding\">What is stack unwinding?<\/a><br \/>\n<a href=\"https:\/\/www.geeksforgeeks.org\/stack-unwinding-in-c\/\">Stack Unwinding in C++<\/a><br \/>\n<a href=\"https:\/\/github.com\/evgeny-panasyuk\/stack_unwinding\">github.com\/evgeny-panasyuk\/stack_unwinding<\/a>, The stack_unwinding is a small header only C++ library which supplies primitive(class unwinding_indicator) to determining when object destructor is called due to stack-unwinding or due to normal scope leaving. <\/p>\n<h3>backtrace<\/h3>\n<p><a href=\"https:\/\/www.gnu.org\/software\/libc\/manual\/html_node\/Backtraces.html\">libc Backtraces<\/a><br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/77005\/how-to-automatically-generate-a-stacktrace-when-my-gcc-c-program-crashes\">How to automatically generate a stacktrace when my gcc C++ program crashes<\/a><br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/22992970\/backtrace-on-arm-has-repeating-entries\">Backtrace on ARM has repeating entries<\/a><\/p>\n<h3>libunwind \/ Call chain<\/h3>\n<ul>\n<li>allows you to easily walk the stack frames<\/li>\n<li>access to the callee-saved registers contents<\/li>\n<li>support for resuming execution at a certain frame<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.nongnu.org\/libunwind\/\">The libunwind project<\/a><br \/>\n<a href=\"https:\/\/wiki.linaro.org\/KenWerner\/Sandbox\/libunwind\">KenWerner\/Sandbox\/libunwind &#8211; Linaro Wiki<\/a><br \/>\n<a href=\"https:\/\/wiki.linaro.org\/KenWerner\/Sandbox\/libunwind?action=AttachFile&#038;do=get&#038;target=libunwind-LDS.pdf\">Stack frame unwinding on ARM<\/a> (2011)<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n#define UNW_LOCAL_ONLY\r\n#include &lt;libunwind.h&gt;\r\n\r\nvoid show_backtrace (void) {\r\n  unw_cursor_t cursor; unw_context_t uc;\r\n  unw_word_t ip, sp;\r\n\r\n  unw_getcontext(&amp;uc);\r\n  unw_init_local(&amp;cursor, &amp;uc);\r\n  while (unw_step(&amp;cursor) &gt; 0) {\r\n    unw_get_reg(&amp;cursor, UNW_REG_IP, &amp;ip);\r\n    unw_get_reg(&amp;cursor, UNW_REG_SP, &amp;sp);\r\n    printf (&quot;ip = %lx, sp = %lx\\n&quot;, (long) ip, (long) sp);\r\n  }\r\n}\r\n<\/pre>\n<h3>libbacktrace<\/h3>\n<p><a href=\"https:\/\/github.com\/ianlancetaylor\/libbacktrace\">github.com\/ianlancetaylor\/libbacktrace<\/a>, A C library that may be linked into a C\/C++ program to produce symbolic backtraces  (2018)<\/p>\n<h3>Android<\/h3>\n<p>Before Android 8.0, crashes were handled by the debuggerd and debuggerd64 daemons. In Android O and later, crash_dump32 and crash_dump64 are spawned as needed.<br \/>\n<a href=\"https:\/\/source.android.com\/devices\/tech\/debug\/\">Debugging Native Android Platform Code<\/a><br \/>\n<a href=\"https:\/\/android.googlesource.com\/platform\/system\/core\/+\/17e91d4\/libbacktrace\">android \/ platform \/ system \/ core \/ libbacktrace<\/a><br \/>\n<a href=\"https:\/\/android.googlesource.com\/platform\/system\/core\/+\/20303f8\/include\/backtrace\/backtrace.h\">android \/ platform \/ system \/ core \/ include \/ backtrace \/ backtrace.h\/a><br \/>\n<a href=\"https:\/\/android.googlesource.com\/platform\/system\/core.git\/+\/36d44740dd045403ae615b8dd6dac8b9a4e9f5bf\/libbacktrace\/Backtrace.cpp\">android \/ platform \/ system \/ libbacktrace \/ Backtrace.cpp<\/a><br \/>\n<a href=\"https:\/\/cloud.seu.edu.cn\/gitlab\/frederickjoe\/android-aosp-sdcard\/blob\/3c67fe903913d354c9570fd1e662c9a3d8bedbd9\/debuggerd\/backtrace.c\">android-aosp-sdcard debuggerd backtrace.c<\/a>, Rewrite libbacktrace using C++<br \/>\n<a href=\"https:\/\/git.sphere.ly\/santhosh\/android_system_core\/commit\/0f26808e2c696f8bdcca644e0ddae2af9f753ada\">am 98f87d92: Merge &#8220;Rewrite libbacktrace using C++.&#8221; <\/a><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nbacktrace_create_context()\r\ndump_backtrace_to_log()\r\n<\/pre>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nBreakpoint 1, main () at \/home\/andreas\/src\/DermoInspectMiniServer\/src\/tcp_server.cpp:79\r\n79          A();\r\n(gdb) info register pc lr sp fp\r\npc             0x142824 0x142824 &lt;main()+72&gt;\r\nlr             0x76d7b208       1993847304\r\nsp             0x7efff568       0x7efff568\r\nfp             0x7efff5fc       0x7efff5fc\r\n\r\n(gdb) s\r\nA () at \/home\/andreas\/src\/DermoInspectMiniServer\/src\/tcp_server.cpp:72\r\n72              B();\r\n(gdb) info register pc lr sp fp\r\npc             0x1427d0 0x1427d0 &lt;A()+8&gt;\r\nlr             0x142828 1321000\r\nsp             0x7efff560       0x7efff560\r\nfp             0x7efff564       0x7efff564\r\n\r\n(gdb) s\r\nB () at \/home\/andreas\/src\/DermoInspectMiniServer\/src\/tcp_server.cpp:67\r\n67              C();\r\n(gdb) info register pc lr sp fp\r\npc             0x1427bc 0x1427bc &lt;B()+8&gt;\r\nlr             0x1427d4 1320916\r\nsp             0x7efff558       0x7efff558\r\nfp             0x7efff55c       0x7efff55c\r\n\r\n(gdb) s\r\nC () at \/home\/andreas\/src\/DermoInspectMiniServer\/src\/tcp_server.cpp:62\r\n62          MyBacktrace();\r\n(gdb) info register pc lr sp fp\r\npc             0x1427a8 0x1427a8 &lt;C()+8&gt;\r\nlr             0x1427c0 1320896\r\nsp             0x7efff550       0x7efff550\r\nfp             0x7efff554       0x7efff554\r\n\r\n(gdb) s\r\n100         frame = (struct frame*) ctx.uc_mcontext.arm_lr;\r\n(gdb)\r\n102         for (int i = 0; frame &amp;&amp; frame-&gt;fr_savfp; i++) {\r\n(gdb) info register pc lr sp fp\r\npc             0x170a74 0x170a74 &lt;MyBacktrace()+32&gt;\r\nlr             0x170a6c 1509996\r\nsp             0x7efff238       0x7efff238\r\nfp             0x7efff54c       0x7efff54c\r\n\r\n<\/pre>\n<h3>x86<\/h3>\n<p><a href=\"https:\/\/yosefk.com\/blog\/getting-the-call-stack-without-a-frame-pointer.html\">Getting the call stack without a frame pointer<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ARM: link register and frame pointer ARM Stack Frame Layout ARM GCC generated functions prolog ARM Procedure Call Standard (APCS) Procedure Call Standard for the ARM Architecture (AAPCS) On the AAPCS, with an application to efficient parameter passing ARM to C calling convention, registers to save General Der Stack Frame Deep Wizardry: Stack Unwinding What [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-7830","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/7830","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7830"}],"version-history":[{"count":6,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/7830\/revisions"}],"predecessor-version":[{"id":7848,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/7830\/revisions\/7848"}],"wp:attachment":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7830"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7830"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7830"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}