内存管理

内存问题
   缺乏正确的工具的对于定位内存问题是非常困难的。在这一部分你将
简要的浏览两个方法来分析者内存问题。
   使用Libc Debug模式
   使用这模拟器,这libc debug模式被开启在定位内存问题。为了开启
libc调试模式,使用如下命令:
   adb shell setprop libc.debug.malloc 1
   adb shell stop
   adb shell start
被支持的libcdebug模式值如下:
   1:执行内存泄露检测
   5:填充已经分配的内存侦测到过度使用,越界
   10:填充内存和增加sentinel来侦测越界
为了看到LIbc debug模式,使用Eclipse,打开hello-jni.c源文件。
修改本地函数,如下:
   jstring
   Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
   jobject thiz )
  {
     char* buffer;
     size_t i;
     buffer = (char*) malloc(1024);
     for (i = 0; i < 1025; i++)
        {
             buffer[i] = 'a';
         }
     free(buffer);
     return (*env)->NewStringUTF(env, "Hello from JNI !");
}
你将分配1024字节,但是代码被修改一个额外的字节超出了分配的尺寸,
引发了内存问题。开启libc debug模式通过使用命令如下:
   adb shell setprop libc.debug.malloc 10
   adb shell stop
   adb shell start
建立和运行应用程序在模拟器上。当应用程序开始,点击Call本地代码
来触发本地函数。如下,libc debug模式展示一个警告消息关于内存
问题在logcat和终止执行。
为了进一步内存分析。对于内存调试一个打开的源码工具,内存泄露
侦测和profiling。对于这次实例,下载prebuilt valgrind二进制来自
本书的网站或者你建立它在你的机器上。如果你喜欢建立它,跳到
“Build from Source Code”部分。
使用预建立二进制:
   使用下载http://zdo.com/valgrind-arm-emulator-3.8.0.zip
建立从源代码:
对于Android为了正确建立Valgrind,你将需要一个Linux系统。Valgrind
是Android所支持的。下载最新的Valgrind在http://valgrind.org/
downloads/current.html.使用命令解压:
   tar jxvf valgrind-3.8.0.tar.bz2
基于解压的valgrind源代码,使用你的编辑器,打开README.androd文件
直到建立名领的日期。因为你将使用Valgrind在一个Andoid模拟器,确保
设置HWKIND到模拟器,使用:
export HWKIND=emulator
发布Valgrind到模拟器:
   Valgrind需要首先被不在到模拟器上。为了做着,打开Cygwin或一个
windows的终端,和进入你解压的zip文件的根目录,和使用如下命令行:
   adb push Inst /
   这将布置这Valgrind文件到/data/local/Inst目录在模拟器上。基于
发布的文件到设备,这执行的字节应该被修订。为了这,使用下面的命令:
   adb shell chmod 755 \
       $(find Inst -type f -exec file{} \;|\
              grep executable |\
              sed -n -e 's/^Inst\([^:]*$/\1/gp'|\
              xargs);
Valgrind封装
对于Valgrind目录,一个帮助脚本需要的。使用Eclipse或者你喜欢的编辑器
创建一个valgrind_wrapper.sh的新文件带有内容如下:
   #!/system/bin/sh
   export TMPDIR=/sdcard
   exec /data/local/Inst/bin/valgrind --error-limit=no $*
修订这封装的脚本的行尾,发布它到模拟器,和授权可以执行命令权限通过xiam
的命令:
    dos2unix.exe valgrind_wrapper.sh
    adb push valgrind_wrapper.sh /data/local/Inst/bin
    adb shell chmod 755 /data/local/Inst/bin/valgrind_wrapper.sh
运行Valgrind:
   为了在Valgrind下运行应用程序,插入wrapper脚本到开启序列通过如下
命令:
    adb shell setprop wrap.com.example.hellojni \
    "logwrapper /data/local/Inst/bin/valgrind_wrapper.sh"
    这个key的格式是wrap.<package name>.为了运行你的其他的
应用程序在Valgrind下,仅仅使用恰当的值代替包名。阻止和重启
应用程序。Valgrind消息在logcat上被展示,如下:
   Strace:
 在没有附加一个debugger或增加数量的日志消息的情况下,可能想
监视你的应用程序的每个活动。这个strace工具被用来很容获得。它
是非常有用的诊断工具因为它阻止和记录了系统调用。每个系统调用的
名字,它的参数,和它的返回值被输出。使用Android模拟器的strace。
    为了看到strace运行,使用Eclipse,打开着hello-jnil.c源代码。
修改源文件如下:
    #include <unistd.h>
...
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz ) 
   {
     getpid();
     getuid();
      return (*env)->NewStringUTF(env, "Hello from JNI !");
   }
建立和运行应用程序在模拟器上。打开Cygwin或者一个终端。当应用程序
开始,使用如下命令:
    adb shell ps|grep com.example.hellojni
 使用如下命令来附加strace到运行的应用程序进程。
     adb shell strace -v -p <Process ID>
正如你看到的,strace将附加到应用程序进程和它将拦截和打印系统调用
使用它们的参数和返回值。点击调用本地按钮来触发本地函数,和trace
将会展示两个系统调用被引入本地代码,如下:
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值