3

shContext 正在开发一个通过syscall使用多个静态可执行二进制文件的 android 应用程序。在使用三星 Galaxy s4 手机时,其中一个二进制文件最终会出现段错误(但在使用模拟器或 Sony 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() 因未知原因而失败 失败是因为它根本没有完成(正在做类似dumpAssetToFile("valgrind"){/* Many things suppressed here. */ argument.setExecute() /* Done wrong without a files dir path ask */}.

现在valgrind似乎正确地要求 a 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 执行,从它认为的args[2]到其参数视图的结尾。valgrind正在加载,但找不到memcheck。这里的上下文memcheck-arm-linux是一个资产编辑的静态二进制文件,与那些工作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工具?

4

1 回答 1

3

终于strace给出了解决这个问题的办法。

还没有踪迹,但strace很清楚地告诉了那valgrindmemcheck-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现在已正确设置为目标设备中存在的路径,并且是有效的。硬编码。肮脏的。丑陋的。但现在正在工作。

于 2013-10-10T11:28:15.613 回答