精华内容
下载资源
问答
  • 调试陷入死循环程序的方法

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

    结论

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

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

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

    展开全文
  • eclipse运行程序时 出现死循环

    千次阅读 2016-08-26 17:03:19
    eclipse运行程序时出现死循环
    在eclipse中运行程序,不幸的是程序中有个死循环,程序在一直循环运行,如何使死循环停下来呢?
    
    很简单!

    控制台console右边有个红色方框按钮(如下图箭头所示),点击即强行关闭。。。



    (over)

    展开全文
  • 解决办法:按着ESC不放,趁着程序间隔鼠标狂按边改边练模式的关闭窗口 出来之后先不要着急,需要把死循环代码删除,然后再保存代码

    在这里插入图片描述解决办法:按着ESC不放,趁着程序间隔鼠标狂按边改边练模式的关闭窗口
    在这里插入图片描述
    出来之后先不要着急,需要把死循环代码删除,然后再保存代码

    展开全文
  • 程序死循环

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

    千次阅读 2010-04-25 22:36:00
    [现象]在用ARM的ADS调试的时候,在调试某一行看起来极其简单,应该不会出错的程序时候,按F8希望进入该函数,但是整个程序了,中断运行,显示的信息如下所示:DBE Warning 00056: The statement into which was stepped...
  • 但就是陷入死循环了,亲各位大神帮忙看看吧,谢谢。 DATA SEGMENT ROW DB 0 LIE DB 1 RESULT DB 'R' DATA ENDS STACK SEGMENT STACK DW 100H DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ...
  • 程序陷入死循环问题的解决

    千次阅读 2005-11-28 11:30:00
    看摘要
  • 游戏规则:系统随机出一个三位数,例如1.2.3,假设你猜1.3.2,那么系统则给与2,1.2代表数字和位置相对,1代表数字对而位置不对,0代表位置和...关键是怎么用布尔值控制0-9这些数字且在比较的时候不让程序进入死循环呢?
  • 无限循环和死循环的相同之处就是都没有结果值 不同之处: 1、无限循环zhi是指程序在运行过程中出现的...2、死循环是指程序在运行过程中产生的错误运算结果 ,导致程序无值判断,因此他们程序运行结果是不一样的。 ...
  • Python程序陷入死循环时有两种解决方案: 方案一:使用Ctrl+C快捷键的方式退出程序 方案二:强制结束Python程序
  • 程序死循环、死锁问题定位

    千次阅读 2019-06-11 11:47:19
    程序死循环、死锁问题定位 在开发过程中,可能由于代码设计问题导致出现了死循环或者死锁的问题,使服务器CPU负载飙高从而导致系统运行缓慢,因此要特别注意防止死循环和死锁的发生。如监控服务器状态,如果发现...
  • 线程破解程序死循环

    千次阅读 2015-08-17 17:34:04
    问题来了,读视频的程序是个死循环。怎么解。因此,应该考虑线程的问题了。让视频程序在线程里跑。 何为线程? 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由...
  • 若要处理多个对象主函数循环内可以利用 switch case ,if else,for等语句进行枚举查询,切不可使用while(1)嵌套While或其他死循环,从而令程序陷入死循环。可以使用状态机,定时器,组合逻辑等判断条件来跳出当前状态...
  • fclose 陷入死循环

    2013-12-11 11:16:57
    fclose怎么会让程序陷入死循环呢?fclose函数应该对空指针或者非空指针都处理了。 问题在于非空指针! 假如 在线程A中 File* f=open("a.txt","r"); 但是由于某些原因把该线程中止了,然后再终止该线程后去关闭f文件 ...
  • 背景说明 由于公司需求需要,需要按照返回值设置当前swiper 的curren值,造成swiper的闪烁、抖动问题,现在分享出来我的解决方案 ...current 改变会触发 change 事件,event.detail = {current, source} ...
  • 由于make需要了解计算机时间和它检查的文件的时间。它比较这两个时间,并根据结果确定某个目标是否标记过。某些时间问题可能会导致make不停的编译(或不停地递归编译某个子目录)。在这种情况下,touch(其作用是把...
  • 导致PHP程序死循环的一个原因

    千次阅读 2016-11-22 17:25:19
    (一)做留言板项目,在分页显示用户留言出现死循环,出现死循环的代码如下: require_once 'db.php'; //db.php 文件中定义了 display 函数 /*分页*/ require_once 'db.php'; $pageSize=2; //每页显示的数量 $...
  • 陷入死循环

    2010-12-31 11:13:00
    记录扇入扇出,防止死循环。。。。。 今天终于见识到了,什么叫做死循环,抑郁。。。。 但是也幸运
  • 二、HAL_Delay()放在中断里,程序进入死循环 1.原因: 由于HAL_Delay()中所用延时的中断的 优先级比外部中断的低 所以读不出时间来,程序一直在HAL_Delay()函数里 参考文章: 中断里调用HAL_Delay()进入死循环的...
  • Java练习中在控制台出现了死循环,要结束死循环只需要输入指令 ctrl+c 即可结束死循环 转载于:https://www.cnblogs.com/zhangyouwu/p/9147775.html
  • ) //第一次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\...
  • 1、主程序中构造死循环 setTimer(1,1000,NULL);  while(1)  {   if( bCameraOpenSuccess == TURE ) //在检测时间内,成功打开相机  {  KillTimer(1);  break;  }  if( bCameraOpenSuccess == F
  • 死循环 Glusterfs如果代码中出现死循环,过段时间后,虚拟机将会被异常挂起(io异常),df命令也会卡主! 死循环代码段定位 pstack 进程号 pstack是通过采集某个时间点,当前进程调用函数的情况,通过多次调用...
  • 在小程序开发过程中,...在我们对监听的数据进行赋值时候,会造成死循环,其实这个问题在大多数框架中都有这个问题。 小栗子????[错误示范] properties: { playlist: { type: Object } }, // 数据监听 ...
  • Linux下,多线程程序死循环问题调试

    千次阅读 2014-12-03 00:19:51
    你的软件在某个时刻停止服务,CPU占用达到100%+,这种问题一个可能的原因是产生了死循环,假设程序某处存在潜在的死循环,并在某种条件下会引发,本文以一个示例来定位出现死循环的位置。 当程序某处存在死循环,...
  • 猜测是触发了问题代码进入死循环了. 用PS命令查看了一下情况. 发现罪魁祸首是某个游戏服务器程序. CPU占用率超高. 用 top -H -p PID 查看问题到底出现在那个线程, 记录下threadID. 用 gdb ProcessName PID 附近...
  • php程序死循环导致502报错

    千次阅读 2017-10-22 13:31:18
    请求访问返回502错误提示,尝试去除可疑代码段,发现程序正常,可疑代码段如下图箭头指向: 当时脑热的以为是本地php5.5.18版本过低,不支持[]数组语法(实际php 5.4 开始支持的),于是升级为php7.0.5版本,然而...
  • 程序调试技术 - 跳出死循环

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 131,230
精华内容 52,492
关键字:

当程序进入死循环时