我正在将一个项目转移到新的Android Native Development Kit(即JNI),我想抓住SIGSEGV,如果它发生(可能还有SIGILL,SIGABRT,SIGFPE),以便提供一个很好的崩溃报告对话框,而不是(或之前)当前发生的事情:该过程立即毫不客气地死亡,并且可能是操作系统重启它的一些尝试.(编辑: JVM/Dalvik VM捕获信号并记录堆栈跟踪和其他有用信息;我只是想为用户提供将该信息真正通过电子邮件发送给我的选项.)
情况是:我没有编写的大量C代码完成了这个应用程序中的大部分工作(所有游戏逻辑),虽然它在很多其他平台上都经过了很好的测试,但我完全有可能在我的Android中端口,将它提供垃圾并导致本机代码崩溃,所以我想要当前显示在Android日志中的崩溃转储(本机和Java)(我想在非Android情况下它将是stderr).我可以随意修改C和Java代码,尽管回调(进入和退出JNI)的数量大约为40,显然,小差异的奖励积分.
我听说过J2SE中的信号链接库,libjsig.so,如果我可以在Android上安全地安装这样的信号处理程序,这将解决我的问题的捕捉部分,但我看不到Android/Dalvik这样的库.
java-native-interface android signals segmentation-fault android-ndk
我一直在寻找上周试图找到这个问题的答案.
如何使用valgrind启动Android应用程序?我知道我可以使用'am'命令启动应用程序,但它会启动应用程序并退出.
我正在编写一个将NDK用于本机C代码的应用程序,我需要检查它是否存在可疑的内存错误.
编辑:
我学到了更多.您可以使用shell脚本"包装"应用程序.
这是我正在使用的shell脚本:
#!/system/bin/sh
VGPARAMS='--error-limit=no'
export TMPDIR=/data/data/com.starlon.froyvisuals
exec /data/local/Inst/bin/valgrind $VGPARAMS $*
Run Code Online (Sandbox Code Playgroud)
这是setprop:
adb shell setprop wrap.com.starlon.froyvisuals "logwrapper valgrind"
Run Code Online (Sandbox Code Playgroud)
以下是我启动应用的方式:
adb shell am start -n com.starlon.froyvisuals/.FroyVisuals
Run Code Online (Sandbox Code Playgroud)
我不认为这是对的,因为我不确定shell脚本适合哪里,我在logcat中没有看到任何东西.任何提示?
Edit2:哦shell脚本用上面的"setprop"命令表示.所以
adb shell setprop wrap.com.starlon.froyvisuals "logwrapper /data/local/val.sh"
Run Code Online (Sandbox Code Playgroud)
我还没有在logcat中看到任何东西.
我已经安装了valgrind for android,我可以确认它正在运行,因为我尝试用它运行ls,它工作正常.
但是如何使用我想调试的本机组件执行Android应用程序?我看了这个问题:如何用valgrind启动一个Android应用程序,但我不知道如何遵循它.如何在shell脚本中包装应用程序?什么是"包装".其次是包名应该是?
我尝试使用com.matthewmitchell.wakeifyplus作为我的应用程序包:
setprop wrap.com.matthewmitchell.wakeifyplus "logwrapper /data/local/valgrind"
Run Code Online (Sandbox Code Playgroud)
但它说"无法设置财产".我应该做些什么?我找不到任何有效的分步指南.我试过这个(我甚至不知道setprop的作用):
setprop com.matthewmitchell.wakeifyplus "logwrapper /data/local/valgrind"
Run Code Online (Sandbox Code Playgroud)
/ data/local/valgrind是一个具有执行权限的shell脚本,它是:
#!/system/bin/sh
VGPARAMS='--error-limit=no'
export TMPDIR=/data/data/com.matthewmitchell.wakeifyplus
exec /data/local/Inst/bin/valgrind $VGPARAMS $*
Run Code Online (Sandbox Code Playgroud)
但当我运行应用程序时:
am start -a android.intent.action.MAIN -n com.matthewmitchell.wakeifyplus/.MainActivity
Run Code Online (Sandbox Code Playgroud)
即使在清除之后,valgrind也不会出现在logcat中.
我尝试为名称> = 32个字符的属性设置值时出错
adb shell setprop 01234567890123456789012345678901 VALUE
Run Code Online (Sandbox Code Playgroud)
错误:
could not set property
Run Code Online (Sandbox Code Playgroud)
这很好用
adb shell setprop 0123456789012345678901234567890 VALUE
adb shell getprop 0123456789012345678901234567890
VALUE
Run Code Online (Sandbox Code Playgroud)
有没有办法设置名称较长的属性?
您好我正在尝试为android-arm构建valgrind.在Linux Mint 13上它失败了:
$ make
echo "# This is a generated file, composed of the following suppression rules:" > default.supp
echo "# " exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp >> default.supp
cat exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp >> default.supp
make all-recursive
make[1]: Entering directory `/home/matt/Desktop/valgrind/valgrind-3.8.1'
Making all in include
make[2]: Entering directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/include'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/include'
Making all in VEX
make[2]: Entering directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/VEX'
make all-am
make[3]: Entering directory `/home/matt/Desktop/valgrind/valgrind-3.8.1/VEX'
gcc …Run Code Online (Sandbox Code Playgroud) 如何在Ubuntu上的Eclipse中使用Valgrind与Android应用程序在运行时查找android本机代码内存泄漏.
我正在尝试valgrind在 android上使用,但遇到了一些问题。当我在valgrind下面启动应用程序时出现以下错误(在 logcat 中):
logwrapper W type=1400 audit(0.0:73): avc: denied { execute } for name="start_valgrind.sh" dev="dm-1" ino=654102 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:system_data_file:s0 tcla ss=file permissive=0
E executing /data/local/start_valgrind.sh failed: Permission denied
start_valgrind.sh I executing /data/local/start_valgrind.sh failed: Permission denied
I start_valgrind.sh terminated by exit(255)
Run Code Online (Sandbox Code Playgroud)
先决条件:
adb shell setprop wrap.$PACKAGE \"logwrapper /data/local/start_valgrind.sh\"(下面链接中的 start_valgrinds.sh 脚本)chmod -R 777 /data/local/Inst/(valgrind bin 的位置)。 …android ×7
valgrind ×5
android-ndk ×4
adb ×1
configure ×1
gdbserver ×1
macos ×1
memory ×1
memory-leaks ×1
native ×1
native-code ×1
properties ×1
shell ×1
signals ×1