【发布时间】:2013-10-07 22:16:20
【问题描述】:
Context 正在开发一个 Android 应用程序,该应用程序通过 sh 系统调用使用多个静态可执行二进制文件。在使用三星 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 kernel 3.4...),(context.getFilesDir() + File.separator + "valgrind").canExecute() 返回 false。
运行 sh -c PATH...valgrind 告诉 valgrind: can't execute: Permission denied 和退出时的状态 126。
Emulator 似乎运行内核 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 似乎正确地调用了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 是资产的ed 静态二进制文件,与那些工作的valgrind 和busybox 一起转储到文件目录中。如果我无法获得系统调用跟踪,我无法确定 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 工具吗?
【问题讨论】:
-
这可能是执行权限问题和/或所有权问题。可执行文件的权限需要为所有者读取+执行。您能否检查安装是否确保了这一点。运行
sh -c "ls -l PATH_TO_VALGRIND"以检查一切是否正常。 -
虽然
valgrind部署方法与valgrinded程序部署方法有90%相同,但是当我通过adb shell进入模拟器(手机目前不在)。将重新检查所有 Java 代码并回来提供更多反馈。 -
我的错:现在我的 Java 代码已修复,应用程序正确输出
valgrind: failed to start tool 'memcheck' for platform 'arm-linux': No such file or directory并返回状态 1。我试图否决我。 -
更好的是,将错误的 java 代码添加到问题中,并添加您为修复 java 代码所做的答案。
-
在
setExecutable(...)通话中,我很尴尬地错过了valgrind的路径。但现在我无法让valgrind使用(existing)memcheck-arm-linux。所以我想通过busybox如果它能够进行strace调用。
标签: android linux android-ndk valgrind busybox