sh
Context 正在开发一个通过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
是一个资产编辑的静态二进制文件,与那些工作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
工具?