gpt4 book ai didi

android - 获取适用于 android 的 valgrind。 `valgrind` 寻找 `memcheck-arm-linux` 的问题

转载 作者:太空狗 更新时间:2023-10-29 12:45:11 27 4
gpt4 key购买 nike

Context 正在开发一个 Android 应用程序,该应用程序通过 sh 使用多个静态可执行二进制文件系统调用。当使用三星 galaxy s4 手机时(但在使用模拟器或索尼 Xperia tipo 手机时不会),其中一个二进制文件最终会出现段错误,因此遵循 http://embetek.blogspot.com.es/2011/10/valgrind-for-arm.html经过一些自定义修改 (CFLAGS='-static -march=armv7-a') 最终得到一个

$ ldd valgrind
not a dynamic executable
$ file valgrind
valgrind: ELF 32-bit LSB executable, ARM, version 1 (SYSV),
statically linked, for GNU/Linux 3.2.0, not stripped.

加载到目标手机上(版本为 android 4.2.2 内核 3.4...),(context.getFilesDir() + File.separator + "valgrind").canExecute()返回 false。

正在运行 sh -c PATH...valgrind告诉valgrind: can't execute: Permission denied退出时状态为 126。

模拟器似乎运行内核 2.6... 所以有 adb shell并执行 valgrind关于内核版本不匹配,有类似但更修饰的说法:字面意思

llostatic/files/valgrind                                                       <
FATAL: kernel too old
Segmentation fault

(context.getFilesDir() + File.separator + "valgrind").setExecute() is failing by unknown reason 失败是因为根本没有完成(正在做类似 dumpAssetToFile("valgrind"){/* Many things suppressed here. */ argument.setExecute() /* Done wrong without a files dir path ask */} 的事情。

现在valgrind似乎正确地要求 memcheck-arm-linux , 但我还没有让它识别它。

甚至执行 "sh -c \"PATH=$PATH:" + getFilesDir() + File.separator + " " + getFilesDir() + File.separator + "busybox strace valgrind -v " + BINARY + " " + ARGS + " " + "2>&1\""不符合我的预期。执行的并不是这个,而是将其输出到 stderr。

W/System.err(6918): commandStrArr[0]: sh
W/System.err(6918): commandStrArr[1]: -c
W/System.err(6918): commandStrArr[2]: PATH=$PATH:/data/data/NAMESPACE/files/ busy
box strace valgrind -v /data/data/NAMESPACE/files/BINARY ARGS 2>&1
W/System.err(6918): strace: applet not found
W/System.err(6918): valgrind: failed to start tool 'memcheck' for platform 'arm-l
inux': No such file or directory
W/System.err(6918): Error: BINARY exited with status nonzero (1).

我读到的是 busybox无法模拟 strace , 但无论如何都作为命令和参数执行,从它认为的 args[2] 到它的参数 View 结束。 valgrind加载正常但找不到 memcheck .这里的上下文是 memcheck-arm-linux是一个 Assets 'ed 静态二进制文件与那些工作的文件一起转储到文件目录valgrindbusybox .我不能确定memcheck-arm-linux如果我无法获得系统调用跟踪,这正是所要求的。恕我直言,如果不是 memcheck-arm-linux,那将是一个陷阱什么valgrind在这里调用“平台‘arm-linux’的‘memcheck’”。

附加信息(请提取 cwds):

$ file busybox
busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for
GNU/Linux 3.2.0, stripped
[...]
$ file coregrind/valgrind
coregrind/valgrind: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically
linked, for GNU/Linux 3.2.0, not stripped
[...]
$ file memcheck/memcheck-arm-linux
memcheck/memcheck-arm-linux: ELF 32-bit LSB executable, ARM, version 1 (SYSV), st
atically linked, not stripped

有人知道为什么吗 valgrind似乎不接受 memcheck-arm-linux作为有效的 memcheck工具?

最佳答案

最后strace给出了这个问题的解决方案。

仍然没有跟踪,但是 strace 非常清楚地告诉 valgrind 调用 memcheck-arm-linux 的路径错误.正在寻找目标机器中显然不存在的主机编译器机器的一些路径。

这暗示 valgrind 构建命令应该从

$ export CROSS_COMPILE=arm-unknown-linux-gnueabi- && export CC=${CROSS_COMPILE}gc
c && export CPP=${CROSS_COMPILE}cpp && export CXX=${CROSS_COMPILE}g++ && export L
D=${CROSS_COMPILE}ld && export AR=${CROSS_COMPILE}ar && ./configure --target=arm-
unknown-linux-gnueabi --host=armv7a-none-linux-gnueabi --prefix=$HOME/valgrind-3.
6.1/construct CFLAGS='-static -march=armv7-a' -verbose 2>&1 && make clean && make
-j4 && make

到:

$ export CROSS_COMPILE=arm-unknown-linux-gnueabi- && export CC=${CROSS_COMPILE}gc
c && export CPP=${CROSS_COMPILE}cpp && export CXX=${CROSS_COMPILE}g++ && export L
D=${CROSS_COMPILE}ld && export AR=${CROSS_COMPILE}ar && ./configure --target=arm-
unknown-linux-gnueabi --host=armv7a-none-linux-gnueabi --prefix=/data/data/$APK_P
ACKAGE_NAMESPACE/files CFLAGS='-static -march=armv7-a' -verbose 2>&1 && make clea
n && make -j4 && make

您可以看到 --prefix 现在已正确设置为目标设备中存在的路径,并且有效。硬编码。肮脏的。丑陋。但现在正在工作。

关于android - 获取适用于 android 的 valgrind。 `valgrind` 寻找 `memcheck-arm-linux` 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19121524/

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