一月工作总结
来源:互联网 发布:帝国cms在线视频网站 编辑:程序博客网 时间:2024/04/30 12:09
看到业已蒙上灰尘的总结,贴出来吧,年前写的。
1,
对于结构体变量进行初始化操作,特别是用初始化参数列表方式进行初始化,应该注意数据位的对齐。
例如:
Typded structure _testStruct
{
Int a;
char b;
Int c;
}TestStruct;
TestStruct test = {1,2};//这里的2被赋给b了。
2,
关于内存管理
这里涉及qualcomm的机制。在app退出时,默认会将该应用所有申请的空间释放了。
Ams启动三个APP,launchapp、 mvmapp、amsapplet,进去java app再退出时,实际上只退出了UI显示的amsapplet,仍有launch app在后台运行,而mvmapp则是在java程序运行时才存在的。因此,退出java app时,该app实际上还存在,不会将里面分配的内存释放掉。
而在filemanager中调用amsext,退出filemanager,根据高通机制则将整个app分配的内存都释放了。对于这点,会存在问题。因为在install时启动线程IAMSTHREAD_MainInstallSession内重建suitlst时,先释放内存再分配内存,这段内存,会在退出filemanager时释放掉。因此下次再进去filemanager调用这个install接口时,内存中就是存在乱数据了。
解决方案:将安装线程maininstallsection中对amsengine中suitlist重建的代码拿掉,换为post event给一直在后台跑的launchapp,将amsengine传给launchapp,让launchapp做suitlist的重建处理。这样,在amsext被释放之际,就不会释放掉amsengine。
3,
使用TRACE32分析死机问题。
1)在死机下,按”#”进入download模式,使用qpst的memory debug application将dump文件getregions抓取下来,保存到路径A。
2) 运行trace32 simulator,具体方式是将trace32目录下的config.t32中的PBI设置为SIM,然后启动trace32即可;
3) 在trace32命令行下,进入AMSS代码工程的build/ms目录,然后输入命令”do load_log.cmm”,然后将看到弹出窗口;
4) Select logtype选择USB crash logs,Select Debug Platform选择TRACE32 Simulator;Register Source选择rex_core;Select ELF file选择与手机上程序对应的工程elf文件,例如C7001.elf(elf文件大概200MB左右,这里要注意的是:需要编译debug版本);SelectLogFile选择对应的loadcmm,这个文件存放于下载USB dump时所选的目录下,在这里也即路径A;
5) 点击Go! Load the logs,trace32开始load USB dump信息,一切正常的话,将可以看到其存器中都有内容,并且会弹出死机时的代码信息;
6) 若看到寄存器都是0,则需要手动输入寄存器值。R0-R14以及PC的值都填入。可通过命令”d.dump jtag_console_buffer /nohex” 或者在工具栏中点击”console”按钮查看到寄存器值。也能使用do load_uitcb_register.cmm命令,自动填充寄存器的值,但需确保在build/ms目录下。
7) 若在工具栏没有”console”按钮,可能是因为没有安装L4的快捷命令菜单,可按顺序运行如下命令:task.config l4.t32, menu.reset, menu.reprogram l4.men;
8) 若是调试动态模块,则还需要输入命令”do csmods.cmm”,可看到弹出窗口中显示出所有的动态模块列表,以及起始地址和结束地址。根据PC地址值找到该值位于哪个起始地址与结束地址之间,就能知道死机死在哪个模块内。输入命令加载所需要调试的动态模块的elf,例如:” d.load.elf stk.elf 0x61a8aa8 /nocode /noclear”(这里的地址即为之前看到的起始地址,并且该命令要在elf所在目录输入);另外,还要将模块的源代码路进加进来,例如:”ypath d:/mmi/apps/stk/src”;
9) 此时开始各种分析工作,例如可以选择trace32的view->stackframe查看到函数call stack;查看代码运行处的变量等。
4,
高通的3033版的空指针问题相关。
3033 base line对空指针进行读写操作会出现死机,而3032 base line对空指针进行读操作不会死机,写操作则会死机。3032中,若进行读操作,则会返回0xdead的值(该值针对16位数据,随数据长度不同而不同,例如对于32位值,返回0xdeaddead)。
PS:解释下对空指针的读写操作。
Int32 *p = NULL;
DBGPRINTF(“*p 0x%x”,*p);//读操作
*p = 12;//写操作
5,
文件操作相关。
C标准库定义了,WRITE不能直接修改文件中的某个字串,WRITE只能全部写覆盖文件。对于高通的IFile_Write,也是如此。
6,
比较字符相关。
char inch = ‘A’;
char outch ;
outch = inch | 0x20;
使用如上代码即可将’A’转换为小写的’a’。因为0x20为100000(B),’A’为1000001(B),’a’为1100001(B),|操作后即可转为小写。对于其他字母也一样。此思想用于比较不区分大小写比较字母字串很有帮助,相对于一般算法(判断是否大小写再跟对应的大写或小写字母比较,例:先判断字母字符属于大写,在让字母字符跟’A’比较,而若字母字符属于小写,则让字母字符跟’a’比较)速度快。
- 一月工作总结
- 一月工作总结
- 一月工作总结
- Unity3D游戏开发之路:一月工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- 工作总结
- perl open操作总结(待续)
- 简单的网站项目开发流程
- 继续解决保存问题
- 我的fcitx配置文件
- java加强课程的一些总结!2月20日!
- 一月工作总结
- VirtualBox中的网络 (host-only, bridge, nat)
- Nobel Prizes: Aggregate functions
- SMP 系统下的锁互斥
- sift算法学习
- linux中查看进程
- 交流分享
- 收藏 彩色转灰度的舍入问题
- 通用网关接口( Common Gateway Interface