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子类结构图:
TextView子类结构:
ViewGroup子类结构图:
FrameLayout子类结构:
android.app.Dialog子类结构:
3. 基本控件
3.1 文本类控件
常用文本类控件如下:
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 malloc_debug介绍的主要内容,如果未能解决你的问题,请参考以下文章