精华内容
下载资源
问答
  • 程序死循环

    千次阅读 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

    结论

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

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

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

    展开全文
  • Shell中让程序死循环的几种方式

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

    有时候脚本中需要造个死循环,或者让程序一直运行下去,到某个条件方退出循环,这个时候就要用到while,归纳汇总了让Shell脚本一直运行下去的几种方式:


    下面是个实例:使用while :让程序一直运行下去,直到按q或者Q退出为止


    脚本输出:



    展开全文
  • 本文主要分析char型数值的错误取值导致程序陷入死循环的深层次...通过构造一个典型程序死循环问题,跟随本文思维方式,可以让读者从编译器角度深入理解错误原因,还能了解到编译器是如何对char型取值范围进行限制的。

    一、问题

            本段代码有什么问题?如何修改?

    #include <iostream>
    using namespace std;
    
    #define MAX 255
    
    main()
    {
          char p[MAX+1];
          char ch;
          
          for (ch=0;ch<=MAX;ch++)
          {
              p[ch]=ch;
              cout<<ch<<" ";
              }
          cout<< ch<<" ";
    }
    解析:

        首先这段程序在运行时会陷入死循环,归其原因是代码中“char数值问题”。具体分析如下。

           1、char取值范围

           char类型占一字节(8位),取值范围为-128到127。如何得到的取值范围呢?具体如下:

           由于数字在计算机中是以补码形式表示,并且char类型为有符号数,则一字节(8位)中的最高位为符号位。能表示的最大正数二进制形式为“01111111”,由于正数补码与原码相同,其原码同样为“01111111”,对应十进制为127;同理,能表示的最小负数二进制形式为“10000000”,由于这是补码形式,其原码对应为“110000000”,对应十进制为-128。

           2、知道了char的取值范围,回过头看题目中代码的for循环语句,ch的取值从0到127这阶段的循环语句都很正常。当ch=128时,由于超出char取值范围,编译器会将ch值变为-128,仍然满足<=MAX条件,继续执行循环,同时ch++。由于每次for循环ch都自增(ch++),ch值将会逐渐从-128递增到0,这时又回到了for循环的起始条件处(ch=0),当再次递增到127后,ch值又会变为-128,以后不断循环。

           3、从以上分析中可以看出,“ch++”语句并没有使ch值一直增加,相反ch值不断在“-128到127”中循环变化,进而是“ch<=MAX”(MAX=255)永远成立,程序陷入死循环。

           下面,为了探究其根本原因,对程序进行调试,从编译器角度分析程序陷入死循环原因。

    深入分析:

           主要看程序中“for (ch=0;ch<=MAX;ch++)”和“p[ch]=ch;”语句的汇编代码:  

    for (ch=0;ch<=MAX;ch++)
    0040116E   mov         byte ptr [ebp-104h],0
    00401175   jmp         main+35h (00401185)
    00401177   mov         al,byte ptr [ebp-104h]
    0040117D   add         al,1
    0040117F   mov         byte ptr [ebp-104h],al
    00401185   movsx       ecx,byte ptr [ebp-104h]
    0040118C   cmp         ecx,0FFh
    00401192   jg          main+7Ch (004011cc)
    {
             p[ch]=ch;
    00401194   movsx       edx,byte ptr [ebp-104h]
    0040119B   mov         al,byte ptr [ebp-104h]
    004011A1   mov         byte ptr [ebp+edx-100h],al
         从汇编代码中可知,edx寄存器中存放的是ch值,[ebp+edx-100h]对应“char型数组p”下标。通过调试程序可知p[0]内存地址为0x0013fe80,p[1]内存地址为0x0013fe81,p[2]内存地址为0x0013fe82,……p[127]内存地址为0x0013feff。p[0]至p[127]内存布局如下图所示(其中127的十六进制表示为“0x7F”):


        p[0]到p[127],一切都很正常。当执行ch++后ch=128 时,就会出现问题,继续看汇编代码。

      for (ch=0;ch<=MAX;ch++)
    00401177   mov         al,byte ptr [ebp-104h]  //此时[ebp-104h]地址为0x13fe7c,对应数据为“0x7F”。
    0040117D   add         al,1
    0040117F   mov         byte ptr [ebp-104h],al  //执行自增操作后,结果写入内存[ebp-104h]地址处,也就是
                                                     说0x13fe7c处内容将变为“0x80”。
    00401185   movsx       ecx,byte ptr [ebp-104h] //将内存[ebp-104h]地址处内容符号扩展后传入ecx寄存器。

        看下执行这条语句后ecx寄存器中内容:


       对“0x80”进行符号扩展后变为“0xFFFFFF80”。这里有必要对movsx进行下说明,

    movsx:先符号位扩展,再传送。以“0x80”为例,二进制形式为“10000000”,符号扩展成32位后为“11111111111111111111111110000000”,十六进制为“0xFFFFFF80”。与movsx相对的有movzx,movzx:先零扩展再传送。

           这时ecx寄存器中的数据其值的十进制已变为-128。继续往下看汇编代码。

    {
           p[ch]=ch;
    0040118C   cmp         ecx,0FFh //-128确实小于255,执行循环体
    00401194   movsx       edx,byte ptr [ebp-104h] //同样将将内存[ebp-104h]地址处内容符号扩展后传入edx寄
                                                     存器。
    0040119B   mov         al,byte ptr [ebp-104h] 
    004011A1   mov         byte ptr [ebp+edx-100h],al //由于edx的内容为“-128”,此时[ebp+edx-100h]地址为
                                                        0x0013fe00。
           因此,al寄存器中的数据“0x80”将被写入内存0x0013fe00地址处。


        写入数据之后,程序再继续往下执行,由于数据写入的位置超出了程序之前给p[]申请的栈空间,而这部分内存空间之前的内容是cout函数地址。并且,在程序执行循环体中的“cout<<ch<<" "”代码时,会被用来存储临时数据,所以之前写入的p[ch]值,在执行一次for循环后会被清除掉,且其地址处的内容会恢复到程序开始时存入的cout函数地址。

           此时,ch=-128,继续执行for循环,同时ch自增(ch++),ch的值会从-128变到0,之后程序又会正常地将p[ch]值从内存地址0x0013fe80处开始依次写入,当ch增到127后,由于编译器的movsx操作又会将ch值变为-128,陷入死循环。

    总结:

           从编译器角度分析,出现这种循环的根本原因是,编译器使用“movsx”操作传值,由于ch是char型,当其值在0至127之间时,对应二进制数最高位为0,也就是符号位为正,使用movsx符号扩展后仍然为正,并且高位用都用0填充。当ch值大于等于128时,对应二进制最高位为1,也就是符号位为负,符号位扩展后仍然为负,并且高位都用1填充,这就是为什么ch自增到128时,编译器将将其值变为-128的根源。


    二、问题进阶

           如前面所述,char范围为-128至127,若将程序改成unsigned char型,还会陷入死循环吗?修改后的代码:

    #include <iostream>
    using namespace std;
    
    #define MAX 255
    
    main()
    {
          char p[MAX+1];
          unsigned char ch;  //修改成无符号char型
          
          for (ch=0;ch<=MAX;ch++)
          {
              p[ch]=ch;
              cout<<ch<<" ";
              }
          cout<< ch<<" ";
    }
         运行此程序,同样陷入死循环。Why?先来看下for循环部分的汇编代码:

    for (ch=0;ch<=MAX;ch++)
    0040116E   mov         byte ptr [ebp-104h],0
    00401175   jmp         main+35h (00401185)
    00401177   mov         al,byte ptr [ebp-104h]
    0040117D   add         al,1
    0040117F   mov         byte ptr [ebp-104h],al
    00401185   mov         ecx,dword ptr [ebp-104h]
    0040118B   and         ecx,0FFh
    00401191   cmp         ecx,0FFh
    00401197   jg          main+86h (004011d6)
    {
         p[ch]=ch;
    00401199   mov         edx,dword ptr [ebp-104h]
    0040119F   and         edx,0FFh
    004011A5   mov         al,byte ptr [ebp-104h]
    004011AB   mov         byte ptr [ebp+edx-100h],al
               可以看出将ch设置成unsigned char后的汇编代码与设置成char的汇编代码有少量不同。在unsigned char版本中编译器没有使用movsx指令。在ch与MAX作比较时,char版本使用“movsx       ecx,byte ptr [ebp-104h]”代码对[ebp-104h]地址取一字节放入ecx寄存器中,而unsigned char版本使用“mov         ecx,dword ptr [ebp-104h]”代码对[ebp-104h]地址取一双字放入ecx寄存器中。

           由于设置成unsigned char类型,此时ch取值范围为0至255。在char版本中编译器使用“movsx”进行符号扩展来限制char的取值范围,而在unsigned char版本中编译器只是确保unsigned char类型占一字节。

        当ch=255时,

           执行“00401185   mov         ecx,dword ptr [ebp-104h]”        后ecx寄存器存储的是“0xCCCCCCFF”,

           执行“0040118B   and         ecx,0FFh”                                      后 ecx寄存器存储的是“0xFF”,判断等于MAX                                                                                                      执行循环体内赋值代码,

           执行到“00401199   mov         edx,dword ptr [ebp-104h]”   后edx寄存器存储的是“0xCCCCCCFF”,

           执行“0040119F   and         edx,0FFh”                                      后edx寄存器存储的是“0xFF”
           执行到“004011AB   mov         byte ptr [ebp+edx-100h],al” 后[ebp+edx-100h]的地址为“0x0013ff7f”


        此时[ebp-104h]处存储的是“0xFF”继续执行下一轮for循环。

           执行“00401177   mov         al,byte ptr [ebp-104h]
                      0040117D   add         al,1
                      0040117F   mov         byte ptr [ebp-104h],al”代码后,[ebp-104h]处存储数据将变为“0x00”,之后又会从ch=0开始执行for循环,程序再一次陷入死循环。


    三、正确版本

           其实,把char改为unsigned char后,还需要把for循环中的判断语句改成ch<MAX即可。正确代码如下:

    #include <iostream>
    using namespace std;
    
    #define MAX 255
    
    main()
    {
          char p[MAX+1];
          unsigned char ch;  //修改成无符号char型
          
          for (ch=0;ch<MAX;ch++)
          {
              p[ch]=ch;
              cout<<ch<<" ";
              }
    	  p[ch] = ch;
          cout<< ch<<" ";
    }

             

         【注】本文目的在于通过一个题目的深入分析,了解编译器在处理char与unsigned char的不同之处。就题目本身而言,修改方法很多,但通过本文的思维方式,可以深入到编译器层面了解陷入死循环的根本原因。此篇内容是对《程序员面试宝典(第二版)》P.208 面试例题3的深入思考。




    展开全文
  • 程序调试技术 - 跳出死循环

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

    千次阅读 2010-04-25 22:36:00
    [现象]在用ARM的ADS调试的时候,在调试某一行看起来极其简单,应该不会出错的程序时候,按F8希望进入该函数,但是整个程序了,中断运行,显示的信息如下所示:DBE Warning 00056: The statement into which was stepped...
  • 各位高手,您好,下面是一个简短的死循环程序 #include int main( int argc, char *argv[] ) { while( 1 ) { } return 0; } 这个循环在linux下root跑的时候,跑了2天莫名其妙中断了。机器...
  • 这个分号会把程序带入死循环,注意不要加分号 public static void main(String[] args) { // java里循环的使用 // 循环打印1-5 int n = 1; while (n &lt;= 5) { /* * System.out.println(n); n...
  • 死循环测试

    千次阅读 2014-01-17 14:21:16
    程序员最痛苦的事莫过于深陷于BUG的泥潭,我也没少在这上面摔跤。这里,我把自己的一些经验教训总结出来,涉及的...不管是单线程还是多线程程序死循环都算是相对比较容易解决的,但也有一些技巧在里面,本节就将对这
  • #include <iostream.h> ...上面的程序,如果输入的不合法,比如输入一个字符,那就将陷入死循环。解决的办法 有个一,把cin>>i;语句移到判断循环的语句,那么输入的如果是不合法的变量,他将跳出循环 。
  • Drools 规则引擎死循环问题解决

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

    千次阅读 2016-08-13 16:39:27
    hashmap属于线程不安全容器,在并发环境有可能发生死循环。本文将模拟死循环出现的场景,再结合jstack说明如何一步步定位出现死循环的代码。
  • 原理:看报错信息类DruidDataSource.java:2715,下面有一段源码,在2721行处当错误次数大于connectionErrorRetryAttempts且timeBetweenConnectErrorMillis 大于0,connectionErrorRetryAttempts默认值为1,...
  • python for-Python for死循环

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

    千次阅读 2016-05-07 22:24:12
    作为初学者,已经陷入while的几次死循环了。 比如:求100以内所有奇数之和。 用while来实现,我出现了以下死循环: >>> sum = 0 >>> for i in range(1,101): while i%2 != 0: sum += i #死了……因为while条件...
  • ps:首先普及一下linux中的java虚拟机线程实现方式:在Linux下面因为没有真正的线程,是用进程模拟的,有一个是辅助线程,所以真正程序开的线程应该只有一个。 一、查看java进程 使用jps 或者ps -ef 查找到...
  • HashMap 中的死循环

    千次阅读 多人点赞 2020-07-06 10:14:29
    笔记摘录自疫苗:JAVA HASHMAP的死循环 1.存在的问题 单线程的程序使用 HashMap 没有问题,但是由于程序性能的需求,程序由单线程变为多线程,这时使用 HashMap 就可能会产生问题。 程序经常占了100%的CPU,查看...
  • 如何跳出令人窒息的职场死循环

    千次阅读 多人点赞 2017-10-18 05:57:53
    朝九晚五,工作无趣无聊无发展,陷入职场死循环,如何跳出?
  • 在做的过程中,Flow数组意外的改变了(程序中没有改变它),弄的我很郁闷。后来想到了一种调试方法。由于出错的地方是在n次循环之后,要想单步调试会死人的。VC又没有提供内存数据下断点的功能。(OD就好很多) ...
  • 死循环警告⚠】i=i++导致的死循环

    千次阅读 多人点赞 2021-07-14 12:16:08
    看到下面的这段代码,相信广大CRUD程序猿在亲切不过了吧?有没有发现哪里不对呢? for (int i = 0; i < Num; i = i++) { ...... } 发现错误的同学,没必要再往下看了。。。 ------------------------------...
  • HashMap进行put操作会引起死循环

    千次阅读 2020-07-03 13:22:33
    在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap的登场机会。 1. 线程不安全的HashMap 在多线程环境下,使用HashMap进行put操作...
  • 一个For语句导致死循环的例子

    千次阅读 多人点赞 2014-02-26 10:47:44
    在Java开发中常用到For循环,它对简化业务处理,提高效率,非常有...但要防止程序算法中可能导致死循环的情况,而且有的死循环还不好察觉。比如下面这个例子,算法极容易认为是50,实际上其结果是无穷大的一个死循环
  • 【Map】——HashMap死循环

    千次阅读 2018-12-20 10:38:32
    死循环 Hash表数据结构 简单地说一下HashMap这个经典的数据结构。 HashMap通常会用一个指针数组(假设为table[])来做分散所有的key,当一个key被加入时,会通过Hash算法通过key算出这个数组的下标i,...
  • HashMap多线程死循环问题

    万次阅读 多人点赞 2014-11-05 21:40:02
    主要是多线程同时put时,如果同时触发了rehash操作,会导致HashMap中的链表中出现循环节点,进而使得后面get的时候,会死循环。【关于什么是rehash,读者可以自行去google了】 本文主要参考了:http://coo
  • 检测Lua脚本中死循环及解决方法

    千次阅读 2018-08-30 17:02:50
    检测Lua脚本中死循环及...不过脚本通常是用户编写的,很有可能出现死循环,虽说这是用户的问题,但却会造成我们的宿主程序死掉。所以检测用户脚本中的死循环并中止这段脚本的运行就显得非常重要了。 可是,一个现...
  • 想写个自启动脚本偷个懒,发现重启之后没有进程,想到可能是脚本里程序执行太快,就写了个死循环测试下,然后偷懒不干了。 设置开机自启动: # 编写一个简单的脚本,刚开始没执行,测试用的 echo "echo 'this is...
  • 在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写...
  • 调用下面程序后就出错,APP程序写在了FLASH中 //跳转到应用程序段 //appxaddr:用户代码起始地址. void iap_load_app(u32 appxaddr) { //(用户代码的第一个字存放的是堆栈的栈顶地址,下面即检查此地址) ...
  • 经典的死循环

    千次阅读 2004-09-17 22:39:00
    昨天编程程序一运行就死了,跟踪时原来有一个死循环。开始真以为是见鬼了,不信,看看吧,大概意思是下面:main(){ int loop=1; while(loop int arr[1000]; for(int i=0;i { arr[i]=1; } loop++; }}大家先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 136,015
精华内容 54,406
关键字:

下面程序不是死循环的是