Function Calls on i686 Architecture

address content call frame
EBP + 4*N + 8 parameter N
EBP + 12 parameter 2
EBP + 8 parameter 1 caller
EBP + 4 return address current
EBP saved EBP
EBP - 4 saved registers
EBP - M local variables

用 libunwind 是好解法。可產生自己這個 thread 的 stack trace,還可 backtrace 別的 process 與 coredump。

1. 背景知識:比較新的 ABI 如 Linux x86-64, x32, ARM, ARMv8 如AARCH64 與 Windows x64 都不維護 frame pointer 故需要『額外資訊』 (e.g. .eh_frame sections) 才能作 stack unwind: http://itrs.tw/wiki/Stack_Unwind

這樣設計 ABI 的後果是多一個 register 給 compiler 用 (.e.g. %rbp),但讓 logging strack trace, debugger, profiler 等的實作難度都增加。尤其是像 perf 這樣的全系統 sampling based profiler,不容易在 Nonmaskable Interrupt Context 進行需要讀取 / parse 額外資訊的 stack unwinding: https://lwn.net/Articles/379979/

2. 順便幫我 up vote 我這個 answer 如何: http://stackoverflow.com/questions/11258354/is-there-an-addr2line-which-analyzes-code-in-memory/11280224#11280224
Collapse this comment

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License