我正在使用 uClibc 为 Linux 编译一个静态链接的 i386 二进制文件。用于生成地址堆栈跟踪的回溯库函数不可用。我需要一个替代品。
http://code.metager.de/source/xref/lib/eglibc/libc/sysdeps/i386/backtrace.c和https://github.com/hwoarang/uClibc/blob/master-metag/libubacktrace/backtrace _ .c似乎从.c 加载函数_Unwind_Backtracelibgcc_c.so.1
。但是,libgcc_so.1
在我的工具链中不可用,当我尝试直接使用_Unwind_backtrace时,我得到的堆栈跟踪只有 1 帧(最上面的一个,来自调用_Unwind_Backtrace的函数。
我需要在我的静态链接的 i386 Linux 可执行文件中使用backtrace或_Unwind_Backtrace的有效替换,与 uClibc 链接,而不加载任何 .so 文件(例如libgcc_c.so.1
),这可以生成完整的堆栈跟踪(仅指令指针)。这样的实现在哪里可用?
仅供参考 gcc__builtin_return_address
生成如下代码:
movl 0(%ebp), %eax
movl (%eax), %eax
movl (%eax), %eax
movl (%eax), %eax
movl (%eax), %eax
movl (%eax), %eax
movl (%eax), %eax
movl (%eax), %eax
movl 4(%eax), %eax
这只是盲目地沿着框架链走,没有任何边界检查或健全性检查。我想使用比这更安全的东西。
请注意,即使 glibc backtrace(3)也不会在使用gcc -fomit-frame-pointer编译的函数中显示帧,我决定不需要它。