gpt4 book ai didi

安卓 NDK : getting the backtrace

转载 作者:IT老高 更新时间:2023-10-28 14:00:38 25 4
gpt4 key购买 nike

我正在开发通过 NDK 与 Android 配合使用的 native 应用程序。我需要调用backtrace()发生崩溃时的功能。问题是没有<execinfo.h>对于 NDK。

还有其他方法可以获取该回溯吗?

最佳答案

Android 没有 backtrace(),但 unwind.h 可以提供服务。可以通过 dladdr() 进行符号化。

下面的代码是我对回溯的简单实现(没有拆解):

#include <iostream>
#include <iomanip>

#include <unwind.h>
#include <dlfcn.h>

namespace {

struct BacktraceState
{
void** current;
void** end;
};

static _Unwind_Reason_Code unwindCallback(struct _Unwind_Context* context, void* arg)
{
BacktraceState* state = static_cast<BacktraceState*>(arg);
uintptr_t pc = _Unwind_GetIP(context);
if (pc) {
if (state->current == state->end) {
return _URC_END_OF_STACK;
} else {
*state->current++ = reinterpret_cast<void*>(pc);
}
}
return _URC_NO_REASON;
}

}

size_t captureBacktrace(void** buffer, size_t max)
{
BacktraceState state = {buffer, buffer + max};
_Unwind_Backtrace(unwindCallback, &state);

return state.current - buffer;
}

void dumpBacktrace(std::ostream& os, void** buffer, size_t count)
{
for (size_t idx = 0; idx < count; ++idx) {
const void* addr = buffer[idx];
const char* symbol = "";

Dl_info info;
if (dladdr(addr, &info) && info.dli_sname) {
symbol = info.dli_sname;
}

os << " #" << std::setw(2) << idx << ": " << addr << " " << symbol << "\n";
}
}

它可以用于像 LogCat 一样回溯

#include <sstream>
#include <android/log.h>

void backtraceToLogcat()
{
const size_t max = 30;
void* buffer[max];
std::ostringstream oss;

dumpBacktrace(oss, buffer, captureBacktrace(buffer, max));

__android_log_print(ANDROID_LOG_INFO, "app_name", "%s", oss.str().c_str());
}

关于安卓 NDK : getting the backtrace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8115192/

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