相关疑难解决方法(0)

如何在Android上的JNI下捕获SIGSEGV(分段错误)并获得堆栈跟踪?

我正在将一个项目转移到新的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

90
推荐指数
4
解决办法
6万
查看次数

如何使用valgrind启动Android应用程序

我一直在寻找上周试图找到这个问题的答案.

如何使用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中看到任何东西.

android valgrind android-ndk gdbserver

24
推荐指数
1
解决办法
2万
查看次数

如何使用Android应用程序运行valgrind?

我已经安装了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中.

android valgrind android-ndk

12
推荐指数
1
解决办法
7853
查看次数

如何克服"adb shell setprop"的属性长度限制

我尝试为名称> = 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 properties

11
推荐指数
1
解决办法
9729
查看次数

Android valgrind构建失败

您好我正在尝试为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)

macos android valgrind configure android-ndk

8
推荐指数
2
解决办法
8961
查看次数

5
推荐指数
0
解决办法
986
查看次数

Android,在logwrapper下启动时启动valgrind权限被拒绝

我正在尝试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)

先决条件:

  1. 我在我的机器上构建了 valgring valgrind-3.13.0 并将其推送到 root 的 nexus 6P、8.1.0 操作系统上。(我也用过模拟器 8.0 + valgrind-3.11.0 - 效果一样)
  2. 我设置了道具adb shell setprop wrap.$PACKAGE \"logwrapper /data/local/start_valgrind.sh\"(下面链接中的 start_valgrinds.sh 脚本)
  3. 我使用了这里的说明 /sf/answers/1346480761/
  4. 我做了chmod -R 777 /data/local/Inst/(valgrind bin 的位置)。 …

shell android valgrind native adb

5
推荐指数
1
解决办法
585
查看次数