【问题标题】:Getting a valgrind for android. Problems with `valgrind`'s looking for `memcheck-arm-linux`为 android 获取 valgrind。 `valgrind` 寻找 `memcheck-arm-linux` 的问题
【发布时间】: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&gt;&amp;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 静态二进制文件,与那些工作的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 工具吗?

【问题讨论】:

  • 这可能是执行权限问题和/或所有权问题。可执行文件的权限需要为所有者读取+执行。您能否检查安装是否确保了这一点。运行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 使用(existingmemcheck-arm-linux。所以我想通过busybox 如果它能够进行strace 调用。

标签: android linux android-ndk valgrind busybox


【解决方案1】:

终于strace解决了这个问题。

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

暗示valgrind build 命令应该从

$ 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 现在已正确设置为目标设备中存在的路径,并且有效。硬编码。肮脏的。丑陋的。但现在正在工作。

【讨论】:

  • 你为 strace 做了什么?是自己构建的,还是使用预编译的二进制文件?
  • 我从一个非常标准的 strace 的基本文件夹中做了$ export CC=MY_GCC_TOOLCHAIN_CC &amp;&amp; export CPP=MY_GCC_TOOLCHAIN_CPP &amp;&amp; export CFLAGS='-I/PATH/TO/MY_GCC_TOOLCHAIN_SYSROOT/usr/include' &amp;&amp; export LDFLAGS='-L/PATH/TO/MY_GCC_TOOLCHAIN_SYSROOT/usr/lib -static' &amp;&amp; ./configure --host=arm &amp;&amp; make clean &amp;&amp; make VERBOSE=1 -j JOBS_NO 2&gt;&amp;1 &amp;&amp; cp strace strace_g_static &amp;&amp; cp strace_g_static strace_static &amp;&amp; MY_GCC_TOOLCHAIN_STRIP strace_static,(git remote -v 显示 git://git.code.sf.net/p/strace/code 作为来源)
  • 我终于录制了一段小视频,并在 YouTube 上uploaded 使用了所有这些静态链接的 C/C++ 程序的应用程序。
猜你喜欢
  • 2014-04-08
  • 2019-08-31
  • 2011-11-16
  • 2017-11-17
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多