2

セグメンテーション違反をデバッグするためにシグナルハンドラーで使用できる、アーム内のuclibcのバックトレース実装に使用できるポーティングがあるかどうかを知りたいと思いました。

ここで便利なコードに出くわし 、シグナルハンドラー内で使用しようとしましたが、最初のチェックで失敗し、そこから戻ります。

また、(current_frame_p)-3)を使用してNULLになり、(current_frame_p)-1)を出力するまで単純に再帰する再帰バックトレース関数を試しました。これも私に問題を与えるようです。私が得るのは、ハンドラーのアドレスといくつかのガベージビッグアドレス(シグナルアドレスである可能性があると思います)だけです。しかし、私はそれを超えません。私の痕跡はそれを超えて欲しい。

クラッシュするコードは、間接参照および無効なアドレスへのデバッグ用に意図的に記述されています。

どんな助けでも大歓迎です。

よろしくお願いします。

-Keshav

4

2 に答える 2

3

Arm デバイス (ただし glibc) で次のコードを使用しています。私はこのコードを数年前に見つけました(正確にどこにあるか覚えていません)。何の問題もなく元気に動いています。

void __printBacktrace(int skipCount,bool segv=false)
{

int * func_addresses[BACKTRACE_MAXDEPTH];
char demangle_output[1000];
int nfuncs = __arm_backtrace(func_addresses, BACKTRACE_MAXDEPTH );
printf("-----   Start Stack Trace   -----\n");
for (int i = skipCount; i < nfuncs; ++i)
{
    Dl_info info;
    if (dladdr(func_addresses[i], &info))
    {
        int dStat;
        size_t dLength = 1000;
        char * demangled = abi::__cxa_demangle(info.dli_sname,
                demangle_output, &dLength, &dStat);
        if (demangled && !dStat)
        printf(
                "return addr: %p: object:%s %p symbol:%s [%p+0x%x]\n",
                func_addresses[i], info.dli_fname, info.dli_fbase,
                demangled, info.dli_saddr, (int) func_addresses[i]
                - (int) info.dli_saddr);
        else
        printf(
                "return addr: %p: object:%s %p symbol:%s [%p+0x%x]\n",
                func_addresses[i], info.dli_fname, info.dli_fbase,
                info.dli_sname, info.dli_saddr, (int) func_addresses[i]
                - (int) info.dli_saddr);
    } else
    fprintf(fCrash, "return addr: %p\n", func_addresses[i]);
}
printf("-----   End Stack Trace -----\n");


}

int __arm_backtrace(int **arr, int maxsize)

{

    int cnt = 0;
void *fp = __builtin_frame_address(0);
struct layout *lp = (struct layout *) ((char*) fp - 12);
while (cnt < maxsize)
{

    arr[cnt++] = (int *) lp->return_address;
    if (!lp->next)
    {
        break;
    }
    lp = lp->next - 1;
}
return cnt;
}
于 2010-11-08T09:54:42.290 に答える
0

質問が uclibc に関するものであることは知っていましたが、バックトレースを glibc で動作させる方法を見つけたので、言いたいと思いました。「gcc -funwind-tables -rdynamic」を使用します。unwind-tables オプションは libc:backtrace() を機能させ、動的オプションは libc:backtrace_symbols() を機能させます。

于 2012-07-04T22:02:43.790 に答える