文章目录
- 前言
- 如何理解 dump?
- 1、为什么要 dump(dump的目的)?
- 2、dump 转储的是什么内容(dump 的对象)?
- 3. 实际运用
前言
dump 常用在软件开发中及测试中经常用到,下面就 dump 的理解和 Android 中的实际运用做一个小结
如何理解 dump?
在计算机领域,dump 一般译作转储。即使翻译的很贴切,但还是很难从字面上完全理解 dump 的真正含义。
dump 有动词和名词两种场景,作为动词,可以从 dump 的目的和 dump 的对象,这两个方面去理解 dump 本身。
1、为什么要 dump(dump的目的)?
因为程序在计算机中运行时,在内存、CPU、I/O等设备上的数据都是动态的(或者说是易失的),也就是说数据使用完或者发生异常就会丢掉。如果我想得到某些时刻的数据(有可能是调试程序 Bug 或者收集某些信息),就要把他转储(dump)为静态(如文件)的形式。否则,这些数据你永远都拿不到。
2、dump 转储的是什么内容(dump 的对象)?
其实上边已经提到了,就是将动态(易失)的数据,保存为静态的数据(持久数据)。
像程序这种本来就保存在存储介质(如硬盘)中的数据,也就没有必要 dump。
现在,dump 作为名词也很好理解了,一般就是指 dump (动词)的结果文件。
常出现 dump 的场景:
Unix/Linux 中的 coredump,
Java 中的 headdump 和 threaddump,
还有 tcpdump 工具。
3. 实际运用
在 Android Audio 开发中, 添加一个 dump 的开关
AudioFlinger::ThreadBase::TrackBase::~TrackBase(){
#ifdef ENABLE_AUDIODUMP
char value[MAX];
int dumpEnable = 0;
(void) property_get("audioflinger.dump.test", value, "1");
dumpEnable = atoi(value);
if(dumpEnable ==1) {
FILE* faudioDump;
char filename[512];
snprintf(filename, sizeof(filename), "/data/misc/service/tx_track_sid%d_s%d_c%d_f0x%x.pcm", mSessionId, mSampleRate, mChannelCount, mFormat);
faudioDump = fopen(filename,"ab");
if(faudioDump != NULL) {
fwrite(buffer->raw, 1, buffer->frameCount*mFrameSize, faudioDump);
fclose(faudioDump);
}
else {
ALOGE("can not to open file: %s", filename);
}
}
#endif
}
在Android.bp
中添加
cflags: [
"-DENABLE_AUDIODUMP=1",
],
如何使用:
adb shell setprop audioflinger.dump.test 1
之后就可以在 data/misc/service 下查看相应的 dump 文件。