Код: Выделить всё
#include // GCC's internal unwinder, part of libgcc
_Unwind_Reason_Code trace_fcn(_Unwind_Context *ctx, void *d)
{
int *depth = (int*)d;
printf("\t#%d: program counter at %08x\n", *depth, _Unwind_GetIP(ctx));
(*depth)++;
return _URC_NO_REASON;
}
void print_backtrace_here()
{
int depth = 0;
_Unwind_Backtrace(&trace_fcn, &depth);
}
< /code>
, который в основном работает, но полученные следы не всегда завершены. Например, если я делаю < /p>
int func3() { print_backtrace_here(); return 0; }
int func2() { return func3(); }
int func1() { return func2(); }
int main() { return func1(); }
< /code>
Backtrace показывает только func3 () и main (). (Это, очевидно, пример игрушек, но я проверил разборку и подтвердил, что все эти функции здесь здесь в полной мере и не оптимизированы или подставки.) И действительно, это даже отступает мимо Майн в код инициализации загрузки. Таким образом, предположительно, проблема не с сценарием линкера или параметром компилятора. (Кроме того, из разборки было подтверждено, что в этом тесте ARM7 также не используется ни один указатель кадров). (В предыдущей версии этой системы использовалась старая APC ABI на ARM7 с принудительными кадрами стека и указателем кадров, а также обратной дорогой, подобной той, которая здесь работала). (_UnwindПодробнее здесь: https://stackoverflow.com/questions/339 ... ry-support