Posted on 24-10-2014
Filed Under (技术) by waterlin

最近在写一个与手机有关的应用,大致上可以认为是豌豆荚的精简版本,通过大量的调用 adb.exe 来实现相关的功能。在确认 adb.exe 的输出结果时,需要解析一下 adb.exe 执行后输出的字符串内容。

大部分情况下都很正常,就是有一个很特殊的情况:在刚开机第一次运行 adb.exe 时,adb.exe 的输出内容解析起来的结果不对。因为我的机器很少关机从没碰到过类似的问题,只有测试人员在各种情况下测试才发现这个问题:开机后第一次启动程序执行结果异常,但是第二次就正常了。

找来找去,最后终于知道结果了:在 adb.exe 第一次运行时的输出内容会略为不同。在开机后第一次运行 adb.exe 时,会额外输出以下内容:

* daemon not running. starting it now on port 5037 *
* daemon started successfully *

而在我写代码的时候, adb.exe 都不知道已经执行过多少次了,所以我从来没有捕捉到这个信息。要知道,如果你的代码里没有预见到 adb server 第一次启动时输出的额外内容,解析起来多半会出错误的结果。

这就是原因,估计有一些人也会碰到类似的坑。

(0) Comments    Read More   
Posted on 24-10-2014
Filed Under (技术) by waterlin

最近在产品开发中,有用到 QProcess 启动一个进程,并且与之通信。产品开发完了提交给测试组测试,发现产品的内存会不断地增长,但是这个增长速度十分缓慢,大概 12 小时 20M 左右。

怎么看都不像是常规的内存泄漏!

然后是各种找原因,先是把产品中有关视频展示及渲染的部分关掉进行测试,然后逐步把一些其它部分屏蔽掉,最后关得只剩下 socket 这个环节了,可是内存还在缓慢增长。Qt 的 socket 很靠谱啊?找来找去,终于觉得是 QProcess 惹的祸了。仔细地读了读文档,看到下面这一句话:

void QProcess::closeReadChannel ( ProcessChannel channel )
Closes the read channel channel. After calling this function, QProcess will no longer receive data on the channel. Any data that has already been received is still available for reading.
Call this function to save memory, if you are not interested in the output of the process.

其实 QProcess 是会把你启动进程的标准输出重定向到你的程序里来,从而占用你程序的内存。原来我这个缓慢增长就是由于 QProcess 启动进程后的 stdout 输出没有及时清理导致的。

如果不需要 QProcess 启动进程的标准输出,只需要在使用 QProcess 启动进程前调用 closeReadChannel 这个函数关闭输出即可。如果需要 QProcess 导过来的进程输出,则只需要在有输出数据的时候,读取干净即可。

(0) Comments    Read More