精华内容
下载资源
问答
  • 下面程序不是死循环的是
    千次阅读
    2021-05-18 11:47:05

    在C语言程序中,语句“while(1)printf("*");”就是一个死循环,运行它将无休止地打印*号。

    不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环。因此,任何编译系统都不做死循环检查。

    C语言死循环:在设计程序时,若遇到死循环,我们可以通过按下Ctrl+Pause/Break的方法,结束死循环。

    然而,在编程中死循环并不是一个需要避免的问题,相反,在实际应用中,经常需要用到死循环。例如,我们使用的Windows操作系统下的窗口程序中的窗口都是通过一个叫消息循环的死循环实现的。在单片机、嵌入式编程中也经常要用到死循环。在各类编程语言中,死循环都有多种实现的方法,以C语言为例,可分别使用while.for,goto实现。

    c语言死循环

    死循环的C语言实现:

    1、while(1);

    2、for(;;);

    3、goto

    Loop:

    ...

    goto Loop;

    C语言中死循环(三种)

    while(!0)不是假就一直执行 表达式不能省略

    do...while(!0); 表达式不能省略

    for(;;);for循环中的表达式1、表达式2、表达式3都可以省略,但是;不能省略。

    更多相关内容
  • 程序死循环

    千次阅读 2016-12-08 16:39:04
      死循环是一个非常让人反感的问题,它 有时候是站在程序正常运行的外面下,进行着错误的行为,有时候很久才能发现这个问题。(而在这个过程中也会造成很大的损失)   容易造成损失的地方,人们就会尝试去解决...

    问题

      编程结束了,我们的程序跑起来了。但是我们不知道其是否能终止,结果是否正确等等。我们面临着一系列的问题。
      死循环是一个非常让人反感的问题,它 有时候是站在程序正常运行的外表下,进行着错误的行为,有时候很久才能发现这个问题。(而在这个过程中也会造成很大的损失)
      容易造成损失的地方,人们就会尝试去解决这些问题。
      为了避免这样的问题,人们开发了一些检测的方法,用来检测程序中可能存在死循环的地方。
    (这里主要指单线程)

    死循环的本质

      一段程序,能够陷入死循环,是因为具备了一定的死循环的条件的。

    • 环的存在】对于一段代码,构造出其语句流程图,那么环如果存在是形成死循环的一个必要的条件。(图1)
    • 关键结点】在一个环中并不是所有的结点对于死循环的形成都是同等重要的。那些处在跳出循环以及进入循环处的结点十分重要。(比如说,while,for循环中的条件判断成分,决定了循环的走向,条件控制的错误将会导致死循环的产生)


      PS:
    • 借鉴意义】当我们去查找一个死循环的问题的时候,要从循环体中的关键结点(控制条件处)入手进行分析。
    • 数据流简化】死循环是循环的一种非正常方式,控制逻辑的错误是导致这种问题的主要原因。(通过分析与条件相关的数据流链,我们能够从数据流角度,进一步缩小分析的范围,筛选出不在这条数据流上的一些东西,简化)

    图1:
    这里写图片描述

    简单举例

    关于下面代码的相关说明:

    • 循环结构的存在】for结构的存在,决定了环路的存在。
    • 关键控制点】关键控制点为 i <data。这句话直接决定了循环能否跳出,是否会进入死循环。
    • 数据流跟踪】在进行数据流跟踪的时候,我们只关注与i,data直接相关 或者 间接相关的语句,所以我们可以在分析时不考虑输出语句System.out.println(“the data is : ” + data);。所以我们定位到了data++这条语句。
        public static void testCycle(){
            int data = 5;
            for(int i=0;i<data;i++){//关键点1
                System.out.println("the data is : " + data);
                data++;//关键点2
            }
        }
    展开全文
  • 调试陷入死循环程序的方法

    万次阅读 2018-08-20 22:25:08
    应用程序陷入死循环后,界面可能不会有任何输出,所有的业务也不通,不易定位。 陷入死循环程序占用的cpu使用率较高,通常可以通过使用top命令看出来。 对于多线程的程序,需要耐心调试,本文给出笔者近期使用的...

    概述

    应用程序陷入死循环后,界面可能不会有任何输出,所有的业务也不通,不易定位。

    陷入死循环的程序占用的cpu使用率较高,通常可以通过使用top命令看出来。

    对于多线程的程序,需要耐心调试,本文给出笔者近期使用的方法。

    调试步骤

    测试程序

    编写一个多线程进入死循环的测试程序,如下:

    #include <stdio.h>
    #include <pthread.h>
    
    #define MAX_THREAD 4
    
    static void dead_loop(void)
    {
        while(1) {
            continue;
        }
    }
    
    int main(void)
    {
        int i = 0;
        pthread_t ntid[MAX_THREAD];
    
    //    dead_loop();
        for (i = 0; i < 4; i++) {
            if (pthread_create(&ntid[i], NULL, (void *)dead_loop, NULL) == 0) {
                printf("pthread id = %u\n", ntid[i]);
            }
        }
        while(1) {
            pause();
        }
    
        return 0;
    }

    编译:gcc -g while_test.c -pthread

    该程序运行后进入死循环,下面分析调试方法。

    确定陷入死循环的程序

    • 程序运行后会打印各id号,然后无任何输出,程序陷入了死循环

    • ps确认程序仍在运行,ps也可以查看进程状态

      • ps -T 查看进程中包含的线程
    -> % ps -eT | grep a.out
    10703 10703 pts/0    00:00:00 a.out
    10703 10704 pts/0    00:00:39 a.out
    10703 10705 pts/0    00:00:40 a.out
    10703 10706 pts/0    00:00:41 a.out
    10703 10707 pts/0    00:00:40 a.out
    • ps -eL 查看各线程的运行时间,可以辅助确认处于死循环的线程
    -> % ps -eL | grep a.out
    10703 10703 pts/0    00:00:00 a.out
    10703 10704 pts/0    00:01:33 a.out
    10703 10705 pts/0    00:01:34 a.out
    10703 10706 pts/0    00:01:31 a.out
    10703 10707 pts/0    00:01:34 a.out
    • top查看进程cpu使用率
      • top -H 查看各线程的使用率
      • top界面下按1查看各个cpu的占用率
    -> % top -H
    top - 21:47:24 up  6:18,  3 users,  load average: 0.90, 0.64, 0.60
    Threads: 402 total,   5 running, 396 sleeping,   0 stopped,   1 zombie
    %Cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu1  : 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu2  : 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem:   1024256 total,  1002628 used,    21628 free,   101592 buffers
    KiB Swap:  1046524 total,     4456 used,  1042068 free.   342212 cached Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                       
    10796 yao       20   0   35068    608    544 R 99.9  0.1   0:15.59 a.out                                                         
    10797 yao       20   0   35068    608    544 R 99.9  0.1   0:15.68 a.out                                                         
    10794 yao       20   0   35068    608    544 R 99.3  0.1   0:15.66 a.out                                                         
    10795 yao       20   0   35068    608    544 R 99.3  0.1   0:15.50 a.out  

    调试程序死在何处

    使用gdb调试程序:

    • 使用attach pid 进入之前查看到的进程
    • 使用info threads 查看线程信息,可以看到四个线程的运行位置
    • 使用thread 序号 进入指定序号的线程,打印出运行的位置
    • 使用bt 打印栈信息,查看函数调用关系
    GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
    Copyright (C) 2014 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "i686-linux-gnu".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.
    For help, type "help".
    Type "apropos word" to search for commands related to "word".
    (gdb) attach 10848
    Attaching to process 10848
    Reading symbols from /home/yao/work/util/a.out...done.
    Reading symbols from /lib/i386-linux-gnu/libpthread.so.0...Reading symbols from /usr/lib/debug//lib/i386-linux-gnu/libpthread-2.19.so...done.
    done.
    [New LWP 10852]
    [New LWP 10851]
    [New LWP 10850]
    [New LWP 10849]
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".
    Loaded symbols for /lib/i386-linux-gnu/libpthread.so.0
    Reading symbols from /lib/i386-linux-gnu/libc.so.6...Reading symbols from /usr/lib/debug//lib/i386-linux-gnu/libc-2.19.so...done.
    done.
    Loaded symbols for /lib/i386-linux-gnu/libc.so.6
    Reading symbols from /lib/ld-linux.so.2...Reading symbols from /usr/lib/debug//lib/i386-linux-gnu/ld-2.19.so...done.
    done.
    Loaded symbols for /lib/ld-linux.so.2
    0xb7718cb0 in ?? ()
    (gdb) info threads 
      Id   Target Id         Frame 
      5    Thread 0xb7530b40 (LWP 10849) "a.out" dead_loop () at while_test.c:10
      4    Thread 0xb6d2fb40 (LWP 10850) "a.out" dead_loop () at while_test.c:10
      3    Thread 0xb652eb40 (LWP 10851) "a.out" dead_loop () at while_test.c:10
      2    Thread 0xb5d2db40 (LWP 10852) "a.out" dead_loop () at while_test.c:10
    * 1    Thread 0xb7531700 (LWP 10848) "a.out" 0xb7718cb0 in ?? ()
    (gdb) bt
    #0  0xb7718cb0 in ?? ()
    #1  0xb754ca83 in __libc_start_main (main=0x8048552 <main>, argc=1, argv=0xbf999c34, init=0x80485d0 <__libc_csu_init>, 
        fini=0x8048640 <__libc_csu_fini>, rtld_fini=0xb7729180 <_dl_fini>, stack_end=0xbf999c2c) at libc-start.c:287
    #2  0x08048471 in _start ()
    (gdb) thread 2
    [Switching to thread 2 (Thread 0xb5d2db40 (LWP 10852))]
    #0  dead_loop () at while_test.c:10
    10      }
    (gdb) bt
    #0  dead_loop () at while_test.c:10
    #1  0xb76e7f70 in start_thread (arg=0xb5d2db40) at pthread_create.c:312
    #2  0xb761ebee in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:129

    结论

    对于陷入死循环的程序,服务器一般会频繁地散热,在多线程业务复杂的程序中有可能出现。

    开发人员在编程时需要考虑全面细致,尽量注意到可能的异常,很多死循环是因为没有预料到的异常引入的。

    对于陷入死循环的程序,稳位步骤,逐步调试,并不难定位原因。

    展开全文
  • 要知道,每个循环结构(while 或 for)都必须有停止运行的途径,这样才不会没完没了地执行下去。例如,下面循环从1数到5:x = 1while x

    要知道,每个循环结构(while 或 for)都必须有停止运行的途径,这样才不会没完没了地执行下去。

    例如,下面的循环从1数到5:

    x = 1

    while x <= 5:

    print(x)

    x += 1

    运行结果为:

    1

    2

    3

    4

    5

    但如果像下面这样不小心遗漏了代码行x += 1,那么这个循环将没完没了地运行:

    #这个循环将没完没了地运行

    x = 1

    while x <= 5:

    print(x)

    在这里,x 的初始值为 1,但根本不会变,因此条件测试x <= 5始终为 True,导致 while 循环没完没了地打印 1,运行结果如下所示:

    1

    1

    1

    1

    --snip--

    每个程序员都会偶尔因为不小心而编写出无限(死)循环,在循环的退出条件比较微妙时尤其如此。

    如果程序陷入无限循环,可按组合键Ctrl+C,也可关闭显示程序输出的终端窗口,如果前 2 种方式都无效,比如有些编辑器(如 Sublime Text)内嵌了输出窗口,这可能导致难以结束无限循环,因此不得不关闭编辑器来结束无限循环。

    读者可能会问,怎样才能有效避免编写出包含无限循环的程序呢?

    要避免编写无限(死)循环,应务必对每个 while 循环(或 for 循环)进行测试,确保它按预期那样结束。如果希望程序在用户输入特定值时结束,可运行程序并输入这样的值,如果此时程序没有结束,则说明该循环结构会无限循环,应检查程序处理这个值的方式。

    总之,解决无限(死)循环的方法只有一个,即确认循环结构中至少有一个位置能让循环条件为 False 或让 break 语句得以执行。

    展开全文
  • ) //第一次for循环i=1。第二次循环i=2 { switch(i%3) { case 0:k++; case 1:k++;break; //case2跳出switch循环 case 2:k++;continue; //case2继续switch循环 } i+=1; //i自增为2 } printf("%d\...
  • for循环死循环语句

    千次阅读 2021-05-20 01:32:00
    for语句和while语句还有do while语句1:for循环for语句的格式为:for (初始化语句; 条件语句; 控制语句){语句1 ;语句2 ;。.语句n ;}for 语句的执行顺序是:首先执行“初始化语句”;然后测试“条件语句”;若条件...
  • python中死循环

    千次阅读 2020-11-24 00:16:58
    广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的... 编写死循环程序实际上是不对的,一旦写出来一个程序运行后发现是死循环,一定要立即终止程序的运行! 用python实现一个...
  • 在下列选项中,没有构成死循环程序段是_____。 A. int i=100; while(1) i=i%100+1; if(i>100)  break; B.for(;;); C.int k=1000; do ++k; while(k>=1000); D.int s=36: while(s); --s; ...
  • Python for死循环

    千次阅读 2020-11-24 00:17:02
    编写死循环程序实际上是不对的,一旦写出来一个程序运行后发现是死循环,一定要立即终止程序的运行!用Python实现一个死循环非常简单,while True就可以。for实现死循环步长为0然而我的标题是要求用Python的for实现...
  • 本帖最后由 安然娜124 于 2016-4-26 21:37 编辑疑惑:(1)该程序点击运行后一直处于忙的状态,好久都没反应,不知道是程序中for语句太多导致的,还是语句存在死循环?(2)如果程序可以运行,不管出没出结果,是不是都...
  • Shell中让程序死循环的几种方式

    万次阅读 2016-08-02 19:24:14
    有时候需要造个死循环,或者让程序一直运行下去,这个时候就要用到while,归纳汇总了让Shell脚本一直运行下去的几种方式:
  • Drools 规则引擎死循环问题解决

    千次阅读 2020-02-22 17:50:07
    在《Drools7 规则引擎视频教程》中已经讲到,使用modify或update的时候在某种程度上会导致死循环。 昨天一同学在使用Drools规则引擎时便遇到了该问题。下面看该同学贴出来的规则代码: 首先我们来分析一下上面的...
  • java while (true) 死循环

    千次阅读 2021-02-12 19:31:24
    true 即表示为真。因此while(true)是一个无限循环,因为表达式的...用exit也可以跳出,此时表示了函数直接返回​1、在java网络通讯的程序里原本有一段是这样的:while(in.readLine()!=null){String aa=in.readLine();...
  • 这个分号会把程序带入死循环,注意不要加分号 public static void main(String[] args) { // java里循环的使用 // 循环打印1-5 int n = 1; while (n &lt;= 5) { /* * System.out.println(n); n...
  • 情况分析分析:进入死循环,极有可能是系统镜像本身有问题,再者是U盘本身启动盘有问题,总之一般推断应该是软件的问题造成的,下面提供决解方法。2.关停电脑关闭你安装系统的那台电脑,拔出U盘(安装不下去了只能...
  • python for-Python for死循环

    千次阅读 2020-11-01 12:11:56
    编写死循环程序实际上是不对的,一旦写出来一个程序运行后发现是死循环,一定要立即终止程序的运行!用Python实现一个死循环非常简单,while True就可以。for实现死循环步长为0然而我的标题是要求用Python的for实现...
  • 循环结构程序设计测试

    千次阅读 2021-10-29 00:04:35
    1-1 for语句的一般形式如下,若表达式2的值为“假”,则结束循环。...执行以下程序段,sum的值是55。 int i, sum; for (i = 1; i <= 10; i++){ sum = sum + i; } F 1-4 若变量已正确定义,执行以下whil
  • 程序调试技术 - 跳出死循环

    千次阅读 2014-06-02 15:55:49
    前言 程序员最痛苦的事莫过于深陷于BUG的泥潭,我也没少在这上面摔跤。这里,我把自己的一些经验教训总结出来,涉及的内容...不管是单线程还是多线程程序死循环都算是相对比较容易解决的,但也有一些技巧在里面,
  • JDK1.8HashMap会发生死循环吗?

    千次阅读 多人点赞 2021-05-31 17:54:31
    面试官:JDK1.8HashMap会发生死循环吗?
  • 死循环警告⚠】i=i++导致的死循环

    千次阅读 多人点赞 2021-07-14 12:16:08
    看到下面的这段代码,相信广大CRUD程序猿在亲切不过了吧?有没有发现哪里不对呢? for (int i = 0; i < Num; i = i++) { ...... } 发现错误的同学,没必要再往下看了。。。 ------------------------------...
  • 在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写...
  • HashMap进行put操作会引起死循环

    千次阅读 多人点赞 2020-07-03 13:22:33
    在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap的登场机会。 1. 线程不安全的HashMap 在多线程环境下,使用HashMap进行put操作...
  • C语言入门系列之5.循环控制结构程序

    千次阅读 多人点赞 2020-04-24 11:19:48
    while语句当循环条件为真时, 执行循环体语句,可能会出现死循环。do-while语句先执行循环中的语句,然后再判断表达式是否为真,至少要执行一次。for语句格式为for(循环变量赋初值; 循环条件; 循环变量增量);可以...
  • 各位高手,您好,下面是一个简短的死循环程序 #include int main( int argc, char *argv[] ) { while( 1 ) { } return 0; } 这个循环在linux下root跑的时候,跑了2天莫名其妙中断了。机器...
  • ps:首先普及一下linux中的java虚拟机线程实现方式:在Linux下面因为没有真正的线程,是用进程模拟的,有一个是辅助线程,所以真正程序开的线程应该只有一个。 一、查看java进程 使用jps 或者ps -ef 查找到...
  • 原理:看报错信息类DruidDataSource.java:2715,下面有一段源码,在2721行处当错误次数大于connectionErrorRetryAttempts且timeBetweenConnectErrorMillis 大于0,connectionErrorRetryAttempts默认值为1,...
  • 检测Lua脚本中死循环及解决方法

    千次阅读 2018-08-30 17:02:50
    检测Lua脚本中死循环及...不过脚本通常是用户编写的,很有可能出现死循环,虽说这是用户的问题,但却会造成我们的宿主程序死掉。所以检测用户脚本中的死循环并中止这段脚本的运行就显得非常重要了。 可是,一个现...
  • HashMap在jdk1.8也会出现死循环的问题(实测)

    千次阅读 多人点赞 2020-04-17 18:56:46
    昨天在面试的时候,面试官问到HashMap在多线程并发的情况下怎么出现死循环的? 我当时非常有底气的回答:Hashmap在jdk1.8之前多线程同时进行put操作,并且同时进行扩容的时候可能会出现链表环,导致死循环的发生。 ...
  • 想写个自启动脚本偷个懒,发现重启之后没有进程,想到可能是脚本里程序执行太快,就写了个死循环测试下,然后偷懒不干了。 设置开机自启动: # 编写一个简单的脚本,刚开始没执行,测试用的 echo "echo 'this is...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 160,566
精华内容 64,226
关键字:

下面程序不是死循环的是