【问题标题】:Can't run a Java Android program with Valgrind无法使用 Valgrind 运行 Java Android 程序
【发布时间】:2012-11-11 23:03:57
【问题描述】:

我正在尝试像这样(在 adb shell 中)在 Valgring 下启动 Java 程序:

valgrind am start -a android.intent.action.MAIN -n com.me.myapp/.MainActivity

我明白了:

==2362== Memcheck, a memory error detector
==2362== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==2362== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==2362== Command: am
==2362== 
/system/bin/sh: am: No such file or directory

【问题讨论】:

  • am start .. 将启动一个活动并立即返回。我不认为你应该 valgrind ( am 命令本身)。 stackoverflow.com/questions/9123124/… 似乎是这样做的方法
  • @zapl 不幸的是,我无法理解您指出的程序。如果可能的话,你能给我一步一步的指导吗?
  • 对不起,我也不知道它是如何工作的。他们似乎创建了一个脚本 (/data/local/val.sh),它以神奇的方式与设置 wrap.<packagename> 属性相结合,产生日志输出。
  • 我也很想知道如何做到这一点。经过一番努力,我已经安装了 valgrind,但现在我不知道如何用它调试 NDK 应用程序。 >:-(

标签: android android-ndk valgrind


【解决方案1】:

你必须创建一个脚本,我们称之为 start_valgrind.sh

#!/system/bin/sh

PACKAGE="com.example.hellojni"

# Callgrind tool
#VGPARAMS='-v --error-limit=no --trace-children=yes --log-file=/sdcard/valgrind.log.%p --tool=callgrind --callgrind-out-file=/sdcard/callgrind.out.%p'

# Memcheck tool
VGPARAMS='-v --error-limit=no --trace-children=yes --log-file=/sdcard/valgrind.log.%p --tool=memcheck --leak-check=full --show-reachable=yes'

export TMPDIR=/data/data/$PACKAGE

exec /data/local/Inst/bin/valgrind $VGPARAMS $* 

应该复制到设备。

一旦您在本地文件系统的某个位置的 start_valgrind.sh 文件中拥有上述脚本,您就可以使用以下脚本(我们称之为 bootstrap_valgrind.sh)来完成所有工作(将 start_valgrind.sh 脚本复制到手机,运行它,通过 Valgrind 启动您的应用程序)。

#!/usr/bin/env bash

PACKAGE="com.example.hellojni"

adb push start_valgrind.sh /data/local/
adb shell chmod 777 /data/local/start_valgrind.sh 

adb root
adb shell setprop wrap.$PACKAGE "logwrapper /data/local/start_valgrind.sh"

echo "wrap.$PACKAGE: $(adb shell getprop wrap.$PACKAGE)"

adb shell am force-stop $PACKAGE
adb shell am start -a android.intent.action.MAIN -n $PACKAGE/.HelloJni

adb logcat -c
adb logcat

exit 0 

警告:确保使用 setprop 设置的属性名称,即 (wrap.com.yourcompany.yourapp) 的长度小于 31 个字符。
否则,您将收到错误“无法设置属性”,因为您不能设置长度大于 31 的属性名称,这是属性名称中允许的最大字符数。
此外,属性值应为 https://stackoverflow.com/a/5068818/313113


对于如何为 Android (ARM) 构建 Valgrind,请从此处查看我的脚本:https://stackoverflow.com/a/19255251/313113

【讨论】:

  • 这确实有效,但实际使用起来非常慢。有什么想法吗?
  • Valgrind 天生就很慢。我建议您构建自己的 Android 操作系统并将其安装在您的手机上,其中包含来自 android.googlesource.com/platform/external/valgrindgithub.com/CyanogenMod/android_external_valgrind 的 Valgrind 或尝试 Address Sanitizer code.google.com/p/address-sanitizer/wiki/Androiddev.chromium.org/developers/testing/addresssanitizer
  • 感谢您的广泛回复。包含在 Cyanogenmod 中的 Valgrind 确实是个好主意。
  • 此外,如果您的代码在 Android 上运行,它几乎肯定会在 GNU/Linux x86 或 x86_64 系统上运行,所以不要在手机上调试,而是在 Qt 框架中为您的应用程序编写一个简单的 UI 并测试您的使用常规桌面和 GNU 用户空间上的工具编写代码。
  • 我在 logcat 上收到此错误:10-31 16:30:47.949: I/start_valgrind.sh(15977): /data/data/start_valgrind.sh[14]: /data/local/ Inst/bin/valgrind:未找到。我通过 towelroot 将三星 s3 植根,并且我拥有 root 权限。我在 /data/local/Inst/* 上做了 chmod 777
【解决方案2】:

1) 我使用以下脚本生成 Inst 文件夹 Android valgrind build fails

2) 我犯的错误是我没有授予对 inst 下的所有文件夹的写入权限 MemCheck 工具在 lib/valgrind 下。

我的发现将 Generated Inst(bin,share,inclide,lib) 文件夹下的所有文件夹复制到 /data/local/Inst 遍历每个文件夹并将权限设置为 CHMOD 777 *

如果我没有复制所有这些文件夹 1 文件夹 /Inst 如果不将权限设置为 chmod 777 到 Hirearchy 中的所有文件夹,则面临 memcheck 权限

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多