专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C语言

如何样的溢出才能使UNIX的CPU达到100%

发布时间:2011-06-28 16:15:35 文章来源:www.iduyao.cn 采编人员:星星草
怎么样的溢出才能使UNIX的CPU达到100%
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);
试试

恩。这个确实可以达到目的。
不过程序一般都有在循环里面做点什么的。
其实我还是想知道有没有什么对内存使用上出现的问题导致CPU 99%+
比如溢出,然后用到脏内存,没有释放,等等等连锁反应。

------解决方案--------------------
while(1)
{
printf("waiting\n");
}
printf是要往屏幕输出的,耗得是IO,CPU不怎么耗。

------解决方案--------------------
这个比较困难
你用小程序来模拟,更困难,很难重现,运行环境毕竟不同

感觉还是从程序日志入手,查看直接表现,查找直接原因
------解决方案--------------------
用gdb单步或设断点调试
------解决方案--------------------
呵呵,内存越界的表现就是千奇百怪的
不会固定在同一个地方出错

对代码进行静态检查,也许能发现一点问题
工具PC-Lint
------解决方案--------------------
只要让CPU一直做复杂的运算就可以达到99%了(如果是多个CPU),你就多开几个进程一起做。

很容易就可以让CPU达到99%。

楼主,估计你还是得调式自己的代码了。
------解决方案--------------------
申请内存,不释放,程序久了肯定CPU上去.
------解决方案--------------------
探讨

引用:
while(1)
{
printf("waiting\n");
}
printf是要往屏幕输出的,耗得是IO,CPU不怎么耗。

恩。确实,只是单纯的IO高,除了申请内存,还有啥方法能单纯的让CPU高,而内存不高么?
我只是想模拟出这种case,也好看看我们的程序是不是这个问题。

------解决方案--------------------
探讨

引用:
用gdb单步或设断点调试

程序巨庞大,6层架构,上百万行代码。。会死人的。

所以我现在能做的就是先从应用数据传入来定位,
看看是不是某比数据在源头处定义就超出了以前程序的定义范围。
但是当我找到某个数据溢出的时候,我发现就算模拟这个问题消息,
也不能使得CPU99%+,不能模拟问题,就不能说明找到了问题的根源。
虽然确实有溢……

------解决方案--------------------
只不过你的代码正好让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% 估计是死循环了,跟内存没多大关系
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: