项目中遇到的问题总结
2015-11-14 19:18
267 查看
1. 日常编程时注意的小问题
1)虽然平时编程中经常使用for循环,但是写for循环的时候也要注意。比如
for (unsigned int j = beganIndex; j < endIndex; ++j)
{
do something...
}
乍看起来毫无问题,其实如果我们误把beginIndex的初始值赋成-1,问题就来了。 -1被转换成很大的正整数,导致循环失效。
2) 如果平常一个程序中需要写很多的for循环,写完之后大家一定要code review一下,不信你看
void func_example(int card[], int len)
{
for (int i = len -1; i >= 0; ++i)
{
int a = card[i];
// ...
}
}
如果你在你个程序里连续写十几个for循环,就会出现这样的手误。因为之前你已经连续写了10个
for (int i =0; i < len; ++i)
其实这个手误如果你写完代码之后不立即仔细排查一下,程序运行起来之后不一定立即出问题(崩溃)。因为外面调用函数
func_example()的地方传的card[]数组的长度可能远远大于len。比如
void call_example()
{
int card[256];
func_example(card, 100);
}
这样的代码并不会造成数据越界, 但是结果一定不是你想要的。但是排查起来用的时间肯定比你仔细检查一遍代码的时间要长。
2.代码调试
1)最近项目开发中遇到一个诡异问题,我断点命中到一个函数,如OnRequest(),但是当我F11要进入这个人函数的时候,它进入的确是另外一个函数
void OnCallOver()。后来查阅资料发现,是由于代码和库不一致导致的。
是这样滴,公司的基础功能都是以库的形式提供的,基础库之上的代码(如ServerCode)也是定期发布新的版本。但都会打包一起更新的,所以一定是匹配的。如果新发布的代码不是老bug修复,只是新加了某个功能。我们是可以选择不更新的。那么问题来了,如果因为某人离职你接手它遗留下来的项目,你就会把他的ServerCode拷贝过来。然后编译运行,开始进一步的工作。然后就遇到了上面的问题。因为他的ServerCode对应的可能是Version2.1的库,我本地的库可能是Version2.0。虽然可能运行起来,但函数的链接顺序已经改变了。所以以后工作中还要更细致,流程更规范一些。
2)根据Android崩溃日志定位问题出处
崩溃日志一般都会有如下形式打印
I/DEBUG ( 155): backtrace:
I/DEBUG ( 155): #00 pc 00000000 <unknown>
I/DEBUG ( 155): #01 pc 002248d9 /data/data/com.x.x.x/lib/libx.so (CTest::onRequest(int, _tagASSIST_SERVER*)+16)
其实这个就是崩溃栈,通常都指明了出问题的函数,我们就可以仔细排查一下CTest::onRequest函数。
也可以通过命令 (002248d9就是libx.so中某个函数的地址)
arm-linux-androideabi-addr2line.exe -C -f -e libx.so 002248d9 来定位出问题的函数
1)虽然平时编程中经常使用for循环,但是写for循环的时候也要注意。比如
for (unsigned int j = beganIndex; j < endIndex; ++j)
{
do something...
}
乍看起来毫无问题,其实如果我们误把beginIndex的初始值赋成-1,问题就来了。 -1被转换成很大的正整数,导致循环失效。
2) 如果平常一个程序中需要写很多的for循环,写完之后大家一定要code review一下,不信你看
void func_example(int card[], int len)
{
for (int i = len -1; i >= 0; ++i)
{
int a = card[i];
// ...
}
}
如果你在你个程序里连续写十几个for循环,就会出现这样的手误。因为之前你已经连续写了10个
for (int i =0; i < len; ++i)
其实这个手误如果你写完代码之后不立即仔细排查一下,程序运行起来之后不一定立即出问题(崩溃)。因为外面调用函数
func_example()的地方传的card[]数组的长度可能远远大于len。比如
void call_example()
{
int card[256];
func_example(card, 100);
}
这样的代码并不会造成数据越界, 但是结果一定不是你想要的。但是排查起来用的时间肯定比你仔细检查一遍代码的时间要长。
2.代码调试
1)最近项目开发中遇到一个诡异问题,我断点命中到一个函数,如OnRequest(),但是当我F11要进入这个人函数的时候,它进入的确是另外一个函数
void OnCallOver()。后来查阅资料发现,是由于代码和库不一致导致的。
是这样滴,公司的基础功能都是以库的形式提供的,基础库之上的代码(如ServerCode)也是定期发布新的版本。但都会打包一起更新的,所以一定是匹配的。如果新发布的代码不是老bug修复,只是新加了某个功能。我们是可以选择不更新的。那么问题来了,如果因为某人离职你接手它遗留下来的项目,你就会把他的ServerCode拷贝过来。然后编译运行,开始进一步的工作。然后就遇到了上面的问题。因为他的ServerCode对应的可能是Version2.1的库,我本地的库可能是Version2.0。虽然可能运行起来,但函数的链接顺序已经改变了。所以以后工作中还要更细致,流程更规范一些。
2)根据Android崩溃日志定位问题出处
崩溃日志一般都会有如下形式打印
I/DEBUG ( 155): backtrace:
I/DEBUG ( 155): #00 pc 00000000 <unknown>
I/DEBUG ( 155): #01 pc 002248d9 /data/data/com.x.x.x/lib/libx.so (CTest::onRequest(int, _tagASSIST_SERVER*)+16)
其实这个就是崩溃栈,通常都指明了出问题的函数,我们就可以仔细排查一下CTest::onRequest函数。
也可以通过命令 (002248d9就是libx.so中某个函数的地址)
arm-linux-androideabi-addr2line.exe -C -f -e libx.so 002248d9 来定位出问题的函数
相关文章推荐
- Android开发手记(26) Java多线程的实现
- C++如何向函数传递数组
- Some Laws in IT
- 访问修饰符
- Android IBinder机制简单介绍
- MySQL常用命令
- 动态库的创建和使用
- POJ 3764 The xor-longest Path (01字典树 + DFS)
- 你知道属性(字段)与构造函数谁先执行吗?
- kafka模拟客户端发送、接受消息
- SQL内置函数
- ACM盒子游戏(博弈论)
- 搭建maven+spring+freemaker+mybatis环境之二
- s3c2410_gpio_cfgpin函数解析
- mini2440 之——LED简单控制(裸机) c与汇编
- 关于new与delete 以及 new[]与delete[]
- Ugly Number
- .net解决乱码的旁门走道
- 简单测试linq to sql性能
- C++爬坑日记(1) undefined reference to `vtable for