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