- C/C++ code
#include "stdio.h" typedef struct a { int t; }A; typedef struct b { A abc[10]; }B; int test(B *p) { for (int i=0;i<16;++i) { p->abc[i].t=i; } return 0; } void show() { B myb; test(&myb); for (int i=0;i<16;++i) { printf("%d\n",myb.abc[i].t); } } int main() { show(); printf("test!\n"); while(1) { printf("waiting\n"); } return 0; }
上面是我的测试code,毫无疑问,我对结构体变量的操作超出的它的定义范围.
WINDOWS环境会在show执行完报错,完全打印不出test!
但是我在UNIX上面测试,不但可以打印出test!还能继续后面的循环。
这里做个死循环是为了看内存和CPU使用情况,ps了一下,CPU基本在8%左右浮动。
最近为了查server hang费了很多心,很想知道UNIX到底什么情况才能使得CPU使用率在99%以上。
先谢过。
------解决方案--------------------
写个
while(1);
试试
------解决方案--------------------
内存越界不是必然会导致运行失败,行为是不确定的
可能运气好
------解决方案--------------------
------解决方案--------------------
while(1)
{
printf("waiting\n");
}
printf是要往屏幕输出的,耗得是IO,CPU不怎么耗。
------解决方案--------------------
这个比较困难
你用小程序来模拟,更困难,很难重现,运行环境毕竟不同
感觉还是从程序日志入手,查看直接表现,查找直接原因
------解决方案--------------------
用gdb单步或设断点调试
------解决方案--------------------
呵呵,内存越界的表现就是千奇百怪的
不会固定在同一个地方出错
对代码进行静态检查,也许能发现一点问题
工具PC-Lint
------解决方案--------------------
只要让CPU一直做复杂的运算就可以达到99%了(如果是多个CPU),你就多开几个进程一起做。
很容易就可以让CPU达到99%。
楼主,估计你还是得调式自己的代码了。
------解决方案--------------------
申请内存,不释放,程序久了肯定CPU上去.
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
只不过你的代码正好让windows崩了,show稍微改改就能不蹦。
- C/C++ code
void show() { int arr[1000]={0}; B myb; test(&myb); for (int i=0;i<16;++i) { printf("%d%d\n",myb.abc[i].t); } cout<<arr[0]; // 使用下arr,确保release下,编译器不会觉得arr没用过,直接优化掉了 }
------解决方案--------------------
楼主不必纠结吧,至少我重新运行你的代码,直接Segmentation fault了。
那就说明,这种内存越界结果是未定义的。
------解决方案--------------------
CPU100% 估计是死循环了,跟内存没多大关系