gpt4 book ai didi

Android:使用静态 libgnuSTL 的 native C++ 程序的 SEGFAULT

转载 作者:太空狗 更新时间:2023-10-29 16:39:25 26 4
gpt4 key购买 nike

设备:Google Nexus 7 (2013)。

logcat 包含

I/DEBUG   (  176): Abort message: '@@@ ABORTING: invalid address or address of corrupt block     0x5c6b0 passed to dlfree'.

我认为静态 libgnuSTL 有问题。我对吗?如何使用 GNU 构建系统强制使用 ibgnuSTL_shared?我使用安装在 $HOME/android-ndk-r9b 中的 android-ndk-r9b。首先我制作了独立的工具链

$HOME/android-ndk-r9b/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=$HOME/android-toolchain

我编写了简单的测试,其中包含共享库和使用它的控制台程序。它在设备上崩溃。

//libtest.h

#ifndef TEST_H
#define TEST_H

#include <stddef.h>
#include <string>

namespace test
{

enum { MSG_LEN_BYTES = 3, MSG_LEN_MAX = 0xFFF };
int encodeMsgLength(std::string &encoded_length, size_t length);

}

#endif

//libtest.cpp

#include "libtest.h"

#include <assert.h>
#include <errno.h>
#include <stdlib.h>

int test::encodeMsgLength(std::string &encoded_length, size_t length)
{
encoded_length.clear();

if (length > MSG_LEN_MAX) {
return E2BIG;
}

char buf[MSG_LEN_BYTES + 1] = {0};
int cnt = snprintf(buf, sizeof(buf), "%03zX", length);

if (cnt == MSG_LEN_BYTES && static_cast<size_t>(cnt) < sizeof(buf)) {
encoded_length.assign(buf, cnt);
return 0;
}

assert(!"encodeMsgLength");
return EBADF;
}

//测试.cpp

#include <iostream>
#include <stdlib.h>

#include "libtest.h"

int main(int argc, char* argv[])
{
if (argc != 2) {
std::cout << "Usage: test <number>\n";
return 1;
}

size_t len = atoi(argv[1]);
std::cout << "encodeMsgLength(" << len << ") => ";

std::string str;
int err = test::encodeMsgLength(str, len);

std::cout << str << ", error " << err << std::endl;
return 0;
}

生成文件.am

lib_LTLIBRARIES = libtest.la
libtest_la_LDFLAGS = -shared -avoid-version
libtest_la_SOURCES = libtest.cpp

bin_PROGRAMS = test
test_LDADD = libtest.la
test_SOURCES = test.cpp

最佳答案

使用默认构建您的应用程序:ndk-build --TARGET_PLATFORM android-9

为确保只使用共享库,请编辑您的 Android.mk 并放置适当的库,例如 LOCAL_SHARED_LIBS := libgnuSTL

您可以使用各种其他工具来调试您的问题: 1. gdb【搜索远程调试android native app】 2. strace [如果不能直接使用 busybox strace ] 3. 验证

此外,在许多情况下,崩溃期间的内存堆栈存储在/data/tombstones 中。找到您的错误文件,拉取它并在此处显示相同的详细信息。

关于Android:使用静态 libgnuSTL 的 native C++ 程序的 SEGFAULT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20654549/

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