gpt4 book ai didi

android - Unwind_Backtrace 中的堆栈跟踪与映射文件地址不匹配

转载 作者:行者123 更新时间:2023-11-30 15:54:15 26 4
gpt4 key购买 nike

使用 Unwind_Backtrace 创建了一个函数对来生成堆栈转储(想要回溯)。但是,生成的地址转储与我在链接器映射文件中看到的地址没有关联。我究竟做错了什么?似乎映射文件中的所有地址都是相对的,而堆栈转储是绝对的。如果是这样的话,我从哪里得到基地址。有没有人可以指点我的“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

最佳答案

这可能对您有帮助:https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/F1q_qw5MFfU

问题在于您的 ip 与已加载库的地址存在偏移。特别参见上面链接中的 GetLibraryAddress()。

关于android - Unwind_Backtrace 中的堆栈跟踪与映射文件地址不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com