0

Unwind_Backtrace を使用してスタック ダンプを生成する関数ペア (backtrace wannabe) を作成しました。ただし、結果として得られるアドレスのダンプには、リンカー マップ ファイルに表示されているアドレスとの相関関係はありません。私は何を間違っていますか?スタック ダンプが絶対アドレスであるのに対し、マップ ファイル内のすべてのアドレスは相対アドレスのようです。その場合、ベースアドレスはどこで取得できますか。誰かが私を指し示すことができる「Unwind_Backtraceのダミーガイド」はありますか?

    static void dbg_log( DebugTopic_type topic, 
                         tDebugLevel_type lvl, 
                         const char *str )
    {
    // stuff
    // more stuff
    // ...
        if ( lvl >= DEBUG_LEVEL_ERR || lvl == DEBUG_LEVEL_VERBOSE )
        {
          int depth = 0;
          _Unwind_Backtrace(trace_callback, &depth);
        }
    }

オンラインで見つけた次のコードは、この実装にマイナーな変更を加えたものです。

static _Unwind_Reason_Code trace_callback(struct _Unwind_Context *ctx, void *d)
{
  _Unwind_Reason_Code reason = _URC_NO_REASON;
  int   *depth = (int*)d;
  char  buf[100];

  snprintf( buf, 100, "\t#%d:\tsf:%p\tip:%p\n", *depth,
            (void*)_Unwind_GetRegionStart(ctx),
            (void*)_Unwind_GetIP(ctx));
  (*depth)++;
  nw_dbgout( DEBUG_LEVEL_VERBOSE, buf, strlen(buf));

  if ( *depth >= 10 )
  {
    reason = _UA_CLEANUP_PHASE;
  }
  return reason;
}

これらを組み合わせると、次の出力が生成されます。

    #0: sf:0x51e3e3e8   ip:0x51e3e4c2
    #1: sf:0x51e3e718   ip:0x51e3e764
    #2: sf:0x51e778bc   ip:0x51e7794c
    #3: sf:0x51e7a6b8   ip:0x51e7a728
    #4: sf:0x51e7b640   ip:0x51e7b678
    #5: sf:0x408b2e40   ip:0x408b2eb4
    #6: sf:0x408ed418   ip:0x408ed5be
    #7: sf:0x408b2fc0   ip:0x408c4cd0
    #8: sf:0x408c887c   ip:0x408c8938
    #9: sf:0x40901198   ip:0x40901404
4

1 に答える 1

1

これが役立つかもしれません: https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/F1q_qw5MFfU

問題は、ライブラリがロードされたアドレスで ips がオフセットされていることです。特に上のリンクの GetLibraryAddress() を参照してください。

于 2013-01-10T16:16:03.867 に答える