Android malloc_debug介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android malloc_debug介绍相关的知识,希望对你有一定的参考价值。

参考技术A android 的libc中有malloc_debug的hook调用,我们可以使用malloc_debug中的hook函数对内存分配进行跟踪加测。
malloc_debug主要包含的功能如下:

2) 支持内存边界,可以在申请的内存头部和尾部添加guard,内存越界检查,use after free,内存崩溃检查等。
3) 调用栈跟踪和打印,跟踪内存分配的同时保存内存分配的调用栈,方便内存泄漏检查。

1) 开启malloc_debug
adb shell setprop libc.debug.malloc.program

libc在初始化时会调用MallocInitImpl判断属性来加载debug so,调用InitMallocFunctions替换掉Libc原生的内存分配和释放函数。

除了内存分配和释放,常见如下:

比如在完成注册后,调用FinishInstallHooks,initialize,将finalize注册到process退出时。

1) 内存边界检查
front_guard[=SIZE_BYTES]Enables a small buffer placed before the allocated data.
rear_guard[=SIZE_BYTES] Enables a small buffer placed after the allocated data.
guard[=SIZE_BYTES] Enables both a front guard and a rear guard on all allocations.
主要原理是在分配内存的头部和尾部添加一段数据,作为边界,头部初始化为0xaa,尾部初始化为0xbb。
2)调用栈功能
backtrace[=MAX_FRAMES]
backtrace_enable_on_signal[=MAX_FRAMES]
backtrace_dump_on_exit
backtrace_dump_prefix
backtrace_full
设置保存的调用栈个数,在信号量或者退出时打印调用栈
3) malloc内存默认值
fill_on_alloc[=MAX_FILLED_BYTES] size will be set to 0xeb.
fill_on_free[=MAX_FILLED_BYTES] When an allocation is freed, fill it with 0xef.
fill[=MAX_FILLED_BYTES] This enables both the fill_on_alloc option and the fill_on_free option.
expand_alloc[=EXPAND_BYTES] Add an extra amount to allocate for every allocation.

1) 内存泄漏检测
在shell命令下执行 #setprop libc.debug.malloc.options "backtrace leak_track verbose"
这样开启后在进程退出时会打印leak信息,在发送kill -47时会打印当前内存申请
2) 内存崩溃检查
在shell命令中添加guard #setprop libc.debug.malloc.options "backtrace leak_track verbose guard"
这样会检测内存覆盖等检测
3) verify_pointers 开启可以检测use after free和double free等操作

Android控件介绍

1. 介绍

Android控件大多位于android.widget, android.view.View为他们的父类
对于Dialog系列, android.app.Dialog为父类

Android的原生控件, 一般是在res/layout下的xml文件中声明
然后在Activity通过使用super.setContentView(R.layout.layout_name)来加载layout
在Activity中获取控件的引用使用super.findViewById(R.id.widget_id), 然后接可以使用这个引用对控件进行操作(添加监听, 设置内容).

值得提出的是, 上一篇文章中的Layout(LinearLayout, TableLayout, RelativeLayout, …)都是控件.

2. 控件关系

View子类结构图:

view

 

TextView子类结构:

textview

 

ViewGroup子类结构图:

ViewGroup

FrameLayout子类结构:

FrameLayout

android.app.Dialog子类结构:

Dialog

 

3. 基本控件

3.1 文本类控件

常用文本类控件如下:

TextView                负责展示文本, 不可编辑
EditText                可编辑文本控件

3.2 按钮类控件

Button                   按钮
ImageButton              图片按钮
ToggleButton 开关按钮 RadioButton/RadioGroup
单选按钮 CheckBox 复选按钮

3.3 图片类控件

ImageView                负责显示图片

3.4 进度条控件

ProgressBar              显示进度条, 不可拖动
SeekBar                  拖动条
RatingBar                星级评分条

3.5 时间类控件

TextClock                文本时钟
AnalogClock              模拟时钟
Chronometer              计时器
DatePicker               日期选择器
TimePicker               时间选择器
CalendarView             日期视图

3.6 提示&对话框控件

Toast                    消息提示框
Notification             状态栏通知
AlertDialog              对话框
ProgressDialog           进度条对话框

4. 布局类控件

4.1 基本布局类控件

详细信息参考<Activity布局>

4.2 适配器布局类控件

该类控件需要Adapter(BaseAdapter, ArrayAdapter, SimpleAdapter)来配合使用

ListView                 列表视图
ExpandableListView       可折叠的列表
GridView                 网格视图
Spinner                  列表选项框
ViewFlipper              翻转视图
Gallery                  画廊视图

下面是关于ListView的简单使用方法

<!-- activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.lineto.testlistview.MainActivity">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>
</LinearLayout>

<!-- layout_item,xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:paddingLeft="10dp"
    android:paddingTop="2dp"
    android:paddingRight="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/name"
        android:width="180dp"
        android:textSize="10pt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/ip"
        android:textSize="10pt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>
/* MainActivity.java */
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listView = (ListView)findViewById(R.id.listview);
        ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

        String[] stringsName = {"Jerry", "Penny", "Jimmy"};
        String[] stringsIp   = {"192.169.0.1", "192.168.1.1", "192.168.2.1"};
        for (int i = 0; i < stringsName.length; i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("name", stringsName[i]);
            map.put("ip",   stringsIp[i]);
            list.add(map);
        }

        SimpleAdapter simpleAdapter = new SimpleAdapter(this, list, R.layout.layout_item,
                new String[]{"name", "ip"},
                new int[]{R.id.name, R.id.ip});

        listView.setAdapter(simpleAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Adapter adapter = parent.getAdapter();
                HashMap<String, String> map = (HashMap<String, String>) adapter.getItem(position);
                Toast toast = Toast.makeText(MainActivity.this, map.get("name") + "-" + map.get("ip"), Toast.LENGTH_SHORT);
                toast.show();
            }
        });

    }
}

4.3 滚动条控件

ScrollView                     可滚动的布局容器

 

参考:
<Android笔记-常用控件以及用法>
<Android开发学习之五、基本界面控件>

以上是关于Android malloc_debug介绍的主要内容,如果未能解决你的问题,请参考以下文章

Android逆向Android环境配置与常用工具介绍

Android Studio 简单介绍和使用问题小结

drawerlayout(滑动控件简单使用介绍)

Rebound动画框架简单介绍

Android 内存检查

Hello, Android 快速入门